From 31cac27ecef5f7879c045c93f61d0c931deddffd Mon Sep 17 00:00:00 2001 From: j Date: Mon, 24 Mar 2025 11:35:33 +0000 Subject: [PATCH] inline photologue --- photologue/__init__.py | 5 + photologue/admin.py | 268 +++++ photologue/apps.py | 6 + photologue/forms.py | 227 +++++ photologue/locale/ca/LC_MESSAGES/django.mo | Bin 0 -> 15942 bytes photologue/locale/ca/LC_MESSAGES/django.po | 764 +++++++++++++++ photologue/locale/cs/LC_MESSAGES/django.mo | Bin 0 -> 9776 bytes photologue/locale/cs/LC_MESSAGES/django.po | 781 +++++++++++++++ photologue/locale/da/LC_MESSAGES/django.mo | Bin 0 -> 14117 bytes photologue/locale/da/LC_MESSAGES/django.po | 766 +++++++++++++++ photologue/locale/de/LC_MESSAGES/django.mo | Bin 0 -> 15912 bytes photologue/locale/de/LC_MESSAGES/django.po | 771 +++++++++++++++ photologue/locale/en/LC_MESSAGES/django.mo | Bin 0 -> 454 bytes photologue/locale/en/LC_MESSAGES/django.po | 763 +++++++++++++++ photologue/locale/en_US/LC_MESSAGES/django.mo | Bin 0 -> 8130 bytes photologue/locale/en_US/LC_MESSAGES/django.po | 813 ++++++++++++++++ photologue/locale/es_ES/LC_MESSAGES/django.mo | Bin 0 -> 14861 bytes photologue/locale/es_ES/LC_MESSAGES/django.po | 767 +++++++++++++++ photologue/locale/eu/LC_MESSAGES/django.mo | Bin 0 -> 10240 bytes photologue/locale/eu/LC_MESSAGES/django.po | 764 +++++++++++++++ photologue/locale/fr/LC_MESSAGES/django.mo | Bin 0 -> 16491 bytes photologue/locale/fr/LC_MESSAGES/django.po | 765 +++++++++++++++ photologue/locale/hu/LC_MESSAGES/django.mo | Bin 0 -> 16361 bytes photologue/locale/hu/LC_MESSAGES/django.po | 765 +++++++++++++++ photologue/locale/it/LC_MESSAGES/django.mo | Bin 0 -> 7965 bytes photologue/locale/it/LC_MESSAGES/django.po | 763 +++++++++++++++ photologue/locale/nl/LC_MESSAGES/django.mo | Bin 0 -> 15956 bytes photologue/locale/nl/LC_MESSAGES/django.po | 765 +++++++++++++++ photologue/locale/no/LC_MESSAGES/django.mo | Bin 0 -> 6675 bytes photologue/locale/no/LC_MESSAGES/django.po | 763 +++++++++++++++ photologue/locale/pl/LC_MESSAGES/django.mo | Bin 0 -> 7056 bytes photologue/locale/pl/LC_MESSAGES/django.po | 777 +++++++++++++++ photologue/locale/pt/LC_MESSAGES/django.mo | Bin 0 -> 7835 bytes photologue/locale/pt/LC_MESSAGES/django.po | 764 +++++++++++++++ photologue/locale/pt_BR/LC_MESSAGES/django.mo | Bin 0 -> 7849 bytes photologue/locale/pt_BR/LC_MESSAGES/django.po | 764 +++++++++++++++ photologue/locale/ru/LC_MESSAGES/django.mo | Bin 0 -> 16852 bytes photologue/locale/ru/LC_MESSAGES/django.po | 778 +++++++++++++++ photologue/locale/sk/LC_MESSAGES/django.mo | Bin 0 -> 15443 bytes photologue/locale/sk/LC_MESSAGES/django.po | 781 +++++++++++++++ photologue/locale/tr/LC_MESSAGES/django.mo | Bin 0 -> 11816 bytes photologue/locale/tr/LC_MESSAGES/django.po | 767 +++++++++++++++ photologue/locale/tr_TR/LC_MESSAGES/django.mo | Bin 0 -> 467 bytes photologue/locale/tr_TR/LC_MESSAGES/django.po | 763 +++++++++++++++ photologue/locale/uk/LC_MESSAGES/django.mo | Bin 0 -> 21607 bytes photologue/locale/uk/LC_MESSAGES/django.po | 778 +++++++++++++++ .../locale/zh_Hans/LC_MESSAGES/django.mo | Bin 0 -> 12714 bytes .../locale/zh_Hans/LC_MESSAGES/django.po | 756 +++++++++++++++ photologue/management/__init__.py | 0 photologue/management/commands/__init__.py | 39 + photologue/management/commands/plcache.py | 41 + .../management/commands/plcreatesize.py | 17 + photologue/management/commands/plflush.py | 32 + photologue/managers.py | 23 + photologue/migrations/0001_initial.py | 154 +++ photologue/migrations/0002_photosize_data.py | 40 + .../migrations/0003_auto_20140822_1716.py | 16 + .../migrations/0004_auto_20140915_1259.py | 32 + .../migrations/0005_auto_20141027_1552.py | 17 + .../migrations/0006_auto_20141028_2005.py | 18 + .../migrations/0007_auto_20150404_1737.py | 27 + .../migrations/0008_auto_20150509_1557.py | 19 + .../migrations/0009_auto_20160102_0904.py | 18 + .../migrations/0010_auto_20160105_1307.py | 33 + .../migrations/0011_auto_20190223_2138.py | 18 + .../migrations/0012_alter_photo_effect.py | 19 + .../migrations/0013_alter_watermark_image.py | 19 + photologue/migrations/__init__.py | 0 photologue/models.py | 913 ++++++++++++++++++ photologue/res/sample.jpg | Bin 0 -> 14453 bytes photologue/res/test_nonsense.jpg | 2 + photologue/res/test_photologue_"ing.jpg | Bin 0 -> 659 bytes photologue/res/test_photologue_landscape.jpg | Bin 0 -> 659 bytes photologue/res/test_photologue_portrait.jpg | Bin 0 -> 659 bytes photologue/res/test_photologue_square.jpg | Bin 0 -> 573 bytes photologue/res/test_unicode_®.jpg | Bin 0 -> 659 bytes photologue/res/zips/ignored_files.zip | Bin 0 -> 15784 bytes photologue/res/zips/not_image.zip | Bin 0 -> 7815 bytes photologue/res/zips/sample.zip | Bin 0 -> 7652 bytes photologue/sitemaps.py | 55 ++ .../admin/photologue/photo/change_list.html | 13 + .../admin/photologue/photo/upload_zip.html | 57 ++ .../templates/photologue/gallery_archive.html | 41 + .../photologue/gallery_archive_day.html | 28 + .../photologue/gallery_archive_month.html | 43 + .../photologue/gallery_archive_year.html | 42 + .../templates/photologue/gallery_detail.html | 26 + .../templates/photologue/gallery_list.html | 30 + .../photologue/includes/gallery_sample.html | 17 + .../photologue/includes/paginator.html | 32 + .../templates/photologue/photo_archive.html | 45 + .../photologue/photo_archive_day.html | 30 + .../photologue/photo_archive_month.html | 49 + .../photologue/photo_archive_year.html | 54 ++ .../templates/photologue/photo_detail.html | 38 + .../templates/photologue/photo_list.html | 29 + photologue/templates/photologue/root.html | 1 + .../photologue/tags/next_in_gallery.html | 5 + .../photologue/tags/prev_in_gallery.html | 5 + photologue/templatetags/__init__.py | 0 photologue/templatetags/photologue_tags.py | 131 +++ photologue/tests/__init__.py | 0 photologue/tests/factories.py | 120 +++ photologue/tests/helpers.py | 25 + photologue/tests/templates/base.html | 0 photologue/tests/test_effect.py | 12 + photologue/tests/test_gallery.py | 63 ++ photologue/tests/test_photo.py | 293 ++++++ photologue/tests/test_photosize.py | 29 + photologue/tests/test_resize.py | 134 +++ photologue/tests/test_sitemap.py | 33 + photologue/tests/test_sites.py | 139 +++ photologue/tests/test_urls.py | 16 + photologue/tests/test_views_gallery.py | 58 ++ photologue/tests/test_views_photo.py | 67 ++ photologue/tests/test_zipupload.py | 211 ++++ photologue/urls.py | 68 ++ photologue/utils/__init__.py | 0 photologue/utils/reflection.py | 91 ++ photologue/utils/watermark.py | 55 ++ photologue/views.py | 80 ++ requirements.txt | 4 +- 122 files changed, 21209 insertions(+), 1 deletion(-) create mode 100644 photologue/__init__.py create mode 100644 photologue/admin.py create mode 100644 photologue/apps.py create mode 100644 photologue/forms.py create mode 100644 photologue/locale/ca/LC_MESSAGES/django.mo create mode 100644 photologue/locale/ca/LC_MESSAGES/django.po create mode 100644 photologue/locale/cs/LC_MESSAGES/django.mo create mode 100644 photologue/locale/cs/LC_MESSAGES/django.po create mode 100644 photologue/locale/da/LC_MESSAGES/django.mo create mode 100644 photologue/locale/da/LC_MESSAGES/django.po create mode 100644 photologue/locale/de/LC_MESSAGES/django.mo create mode 100644 photologue/locale/de/LC_MESSAGES/django.po create mode 100644 photologue/locale/en/LC_MESSAGES/django.mo create mode 100644 photologue/locale/en/LC_MESSAGES/django.po create mode 100644 photologue/locale/en_US/LC_MESSAGES/django.mo create mode 100644 photologue/locale/en_US/LC_MESSAGES/django.po create mode 100644 photologue/locale/es_ES/LC_MESSAGES/django.mo create mode 100644 photologue/locale/es_ES/LC_MESSAGES/django.po create mode 100644 photologue/locale/eu/LC_MESSAGES/django.mo create mode 100644 photologue/locale/eu/LC_MESSAGES/django.po create mode 100644 photologue/locale/fr/LC_MESSAGES/django.mo create mode 100644 photologue/locale/fr/LC_MESSAGES/django.po create mode 100644 photologue/locale/hu/LC_MESSAGES/django.mo create mode 100644 photologue/locale/hu/LC_MESSAGES/django.po create mode 100644 photologue/locale/it/LC_MESSAGES/django.mo create mode 100644 photologue/locale/it/LC_MESSAGES/django.po create mode 100644 photologue/locale/nl/LC_MESSAGES/django.mo create mode 100644 photologue/locale/nl/LC_MESSAGES/django.po create mode 100644 photologue/locale/no/LC_MESSAGES/django.mo create mode 100644 photologue/locale/no/LC_MESSAGES/django.po create mode 100644 photologue/locale/pl/LC_MESSAGES/django.mo create mode 100644 photologue/locale/pl/LC_MESSAGES/django.po create mode 100644 photologue/locale/pt/LC_MESSAGES/django.mo create mode 100644 photologue/locale/pt/LC_MESSAGES/django.po create mode 100644 photologue/locale/pt_BR/LC_MESSAGES/django.mo create mode 100644 photologue/locale/pt_BR/LC_MESSAGES/django.po create mode 100644 photologue/locale/ru/LC_MESSAGES/django.mo create mode 100644 photologue/locale/ru/LC_MESSAGES/django.po create mode 100644 photologue/locale/sk/LC_MESSAGES/django.mo create mode 100644 photologue/locale/sk/LC_MESSAGES/django.po create mode 100644 photologue/locale/tr/LC_MESSAGES/django.mo create mode 100644 photologue/locale/tr/LC_MESSAGES/django.po create mode 100644 photologue/locale/tr_TR/LC_MESSAGES/django.mo create mode 100644 photologue/locale/tr_TR/LC_MESSAGES/django.po create mode 100644 photologue/locale/uk/LC_MESSAGES/django.mo create mode 100644 photologue/locale/uk/LC_MESSAGES/django.po create mode 100644 photologue/locale/zh_Hans/LC_MESSAGES/django.mo create mode 100644 photologue/locale/zh_Hans/LC_MESSAGES/django.po create mode 100644 photologue/management/__init__.py create mode 100644 photologue/management/commands/__init__.py create mode 100644 photologue/management/commands/plcache.py create mode 100644 photologue/management/commands/plcreatesize.py create mode 100644 photologue/management/commands/plflush.py create mode 100644 photologue/managers.py create mode 100644 photologue/migrations/0001_initial.py create mode 100644 photologue/migrations/0002_photosize_data.py create mode 100644 photologue/migrations/0003_auto_20140822_1716.py create mode 100644 photologue/migrations/0004_auto_20140915_1259.py create mode 100644 photologue/migrations/0005_auto_20141027_1552.py create mode 100644 photologue/migrations/0006_auto_20141028_2005.py create mode 100644 photologue/migrations/0007_auto_20150404_1737.py create mode 100644 photologue/migrations/0008_auto_20150509_1557.py create mode 100644 photologue/migrations/0009_auto_20160102_0904.py create mode 100644 photologue/migrations/0010_auto_20160105_1307.py create mode 100644 photologue/migrations/0011_auto_20190223_2138.py create mode 100644 photologue/migrations/0012_alter_photo_effect.py create mode 100644 photologue/migrations/0013_alter_watermark_image.py create mode 100644 photologue/migrations/__init__.py create mode 100644 photologue/models.py create mode 100644 photologue/res/sample.jpg create mode 100644 photologue/res/test_nonsense.jpg create mode 100644 photologue/res/test_photologue_"ing.jpg create mode 100644 photologue/res/test_photologue_landscape.jpg create mode 100644 photologue/res/test_photologue_portrait.jpg create mode 100644 photologue/res/test_photologue_square.jpg create mode 100644 photologue/res/test_unicode_®.jpg create mode 100644 photologue/res/zips/ignored_files.zip create mode 100644 photologue/res/zips/not_image.zip create mode 100644 photologue/res/zips/sample.zip create mode 100644 photologue/sitemaps.py create mode 100644 photologue/templates/admin/photologue/photo/change_list.html create mode 100644 photologue/templates/admin/photologue/photo/upload_zip.html create mode 100644 photologue/templates/photologue/gallery_archive.html create mode 100644 photologue/templates/photologue/gallery_archive_day.html create mode 100644 photologue/templates/photologue/gallery_archive_month.html create mode 100644 photologue/templates/photologue/gallery_archive_year.html create mode 100644 photologue/templates/photologue/gallery_detail.html create mode 100644 photologue/templates/photologue/gallery_list.html create mode 100644 photologue/templates/photologue/includes/gallery_sample.html create mode 100644 photologue/templates/photologue/includes/paginator.html create mode 100644 photologue/templates/photologue/photo_archive.html create mode 100644 photologue/templates/photologue/photo_archive_day.html create mode 100644 photologue/templates/photologue/photo_archive_month.html create mode 100644 photologue/templates/photologue/photo_archive_year.html create mode 100644 photologue/templates/photologue/photo_detail.html create mode 100644 photologue/templates/photologue/photo_list.html create mode 100644 photologue/templates/photologue/root.html create mode 100644 photologue/templates/photologue/tags/next_in_gallery.html create mode 100644 photologue/templates/photologue/tags/prev_in_gallery.html create mode 100644 photologue/templatetags/__init__.py create mode 100644 photologue/templatetags/photologue_tags.py create mode 100644 photologue/tests/__init__.py create mode 100644 photologue/tests/factories.py create mode 100644 photologue/tests/helpers.py create mode 100644 photologue/tests/templates/base.html create mode 100644 photologue/tests/test_effect.py create mode 100644 photologue/tests/test_gallery.py create mode 100644 photologue/tests/test_photo.py create mode 100644 photologue/tests/test_photosize.py create mode 100644 photologue/tests/test_resize.py create mode 100644 photologue/tests/test_sitemap.py create mode 100644 photologue/tests/test_sites.py create mode 100644 photologue/tests/test_urls.py create mode 100644 photologue/tests/test_views_gallery.py create mode 100644 photologue/tests/test_views_photo.py create mode 100644 photologue/tests/test_zipupload.py create mode 100644 photologue/urls.py create mode 100644 photologue/utils/__init__.py create mode 100644 photologue/utils/reflection.py create mode 100644 photologue/utils/watermark.py create mode 100644 photologue/views.py diff --git a/photologue/__init__.py b/photologue/__init__.py new file mode 100644 index 0000000..2eb4fe7 --- /dev/null +++ b/photologue/__init__.py @@ -0,0 +1,5 @@ +import os + +__version__ = '3.18.dev0' + +PHOTOLOGUE_APP_DIR = os.path.dirname(os.path.abspath(__file__)) diff --git a/photologue/admin.py b/photologue/admin.py new file mode 100644 index 0000000..952c7b0 --- /dev/null +++ b/photologue/admin.py @@ -0,0 +1,268 @@ +from django import forms +from django.conf import settings +from django.contrib import admin, messages +from django.contrib.admin import helpers +from django.contrib.sites.models import Site +from django.http import HttpResponseRedirect +from django.shortcuts import render +from django.urls import path +from django.utils.translation import gettext_lazy as _ +from django.utils.translation import ngettext + +from .forms import UploadZipForm +from .models import Gallery, Photo, PhotoEffect, PhotoSize, Watermark + +MULTISITE = getattr(settings, 'PHOTOLOGUE_MULTISITE', False) + + +class GalleryAdminForm(forms.ModelForm): + class Meta: + model = Gallery + if MULTISITE: + exclude = [] + else: + exclude = ['sites'] + + +class GalleryAdmin(admin.ModelAdmin): + list_display = ('title', 'date_added', 'photo_count', 'is_public') + list_filter = ['date_added', 'is_public'] + if MULTISITE: + list_filter.append('sites') + date_hierarchy = 'date_added' + prepopulated_fields = {'slug': ('title',)} + form = GalleryAdminForm + if MULTISITE: + filter_horizontal = ['sites'] + if MULTISITE: + actions = [ + 'add_to_current_site', + 'add_photos_to_current_site', + 'remove_from_current_site', + 'remove_photos_from_current_site' + ] + + def formfield_for_manytomany(self, db_field, request, **kwargs): + """ Set the current site as initial value. """ + if db_field.name == "sites": + kwargs["initial"] = [Site.objects.get_current()] + return super().formfield_for_manytomany(db_field, request, **kwargs) + + def save_related(self, request, form, *args, **kwargs): + """ + If the user has saved a gallery with a photo that belongs only to + different Sites - it might cause much confusion. So let them know. + """ + super().save_related(request, form, *args, **kwargs) + orphaned_photos = form.instance.orphaned_photos() + if orphaned_photos: + msg = ngettext( + 'The following photo does not belong to the same site(s)' + ' as the gallery, so will never be displayed: %(photo_list)s.', + 'The following photos do not belong to the same site(s)' + ' as the gallery, so will never be displayed: %(photo_list)s.', + len(orphaned_photos) + ) % {'photo_list': ", ".join([photo.title for photo in orphaned_photos])} + messages.warning(request, msg) + + def add_to_current_site(modeladmin, request, queryset): + current_site = Site.objects.get_current() + current_site.gallery_set.add(*queryset) + msg = ngettext( + "The gallery has been successfully added to %(site)s", + "The galleries have been successfully added to %(site)s", + len(queryset) + ) % {'site': current_site.name} + messages.success(request, msg) + + add_to_current_site.short_description = \ + _("Add selected galleries to the current site") + + def remove_from_current_site(modeladmin, request, queryset): + current_site = Site.objects.get_current() + current_site.gallery_set.remove(*queryset) + msg = ngettext( + "The gallery has been successfully removed from %(site)s", + "The selected galleries have been successfully removed from %(site)s", + len(queryset) + ) % {'site': current_site.name} + messages.success(request, msg) + + remove_from_current_site.short_description = \ + _("Remove selected galleries from the current site") + + def add_photos_to_current_site(modeladmin, request, queryset): + photos = Photo.objects.filter(galleries__in=queryset) + current_site = Site.objects.get_current() + current_site.photo_set.add(*photos) + msg = ngettext( + 'All photos in gallery %(galleries)s have been successfully added to %(site)s', + 'All photos in galleries %(galleries)s have been successfully added to %(site)s', + len(queryset) + ) % {'site': current_site.name, + 'galleries': ", ".join([f"'{gallery.title}'" for gallery in queryset])} + messages.success(request, msg) + + add_photos_to_current_site.short_description = \ + _("Add all photos of selected galleries to the current site") + + def remove_photos_from_current_site(modeladmin, request, queryset): + photos = Photo.objects.filter(galleries__in=queryset) + current_site = Site.objects.get_current() + current_site.photo_set.remove(*photos) + msg = ngettext( + 'All photos in gallery %(galleries)s have been successfully removed from %(site)s', + 'All photos in galleries %(galleries)s have been successfully removed from %(site)s', + len(queryset) + ) % {'site': current_site.name, + 'galleries': ", ".join([f"'{gallery.title}'" for gallery in queryset])} + messages.success(request, msg) + + remove_photos_from_current_site.short_description = \ + _("Remove all photos in selected galleries from the current site") + + +admin.site.register(Gallery, GalleryAdmin) + + +class PhotoAdminForm(forms.ModelForm): + class Meta: + model = Photo + if MULTISITE: + exclude = [] + else: + exclude = ['sites'] + + +class PhotoAdmin(admin.ModelAdmin): + list_display = ('title', 'date_taken', 'date_added', + 'is_public', 'view_count', 'admin_thumbnail') + list_filter = ['date_added', 'is_public'] + if MULTISITE: + list_filter.append('sites') + search_fields = ['title', 'slug', 'caption'] + list_per_page = 10 + prepopulated_fields = {'slug': ('title',)} + readonly_fields = ('date_taken',) + form = PhotoAdminForm + if MULTISITE: + filter_horizontal = ['sites'] + if MULTISITE: + actions = ['add_photos_to_current_site', 'remove_photos_from_current_site'] + + def formfield_for_manytomany(self, db_field, request, **kwargs): + """ Set the current site as initial value. """ + if db_field.name == "sites": + kwargs["initial"] = [Site.objects.get_current()] + return super().formfield_for_manytomany(db_field, request, **kwargs) + + def add_photos_to_current_site(modeladmin, request, queryset): + current_site = Site.objects.get_current() + current_site.photo_set.add(*queryset) + msg = ngettext( + 'The photo has been successfully added to %(site)s', + 'The selected photos have been successfully added to %(site)s', + len(queryset) + ) % {'site': current_site.name} + messages.success(request, msg) + + add_photos_to_current_site.short_description = \ + _("Add selected photos to the current site") + + def remove_photos_from_current_site(modeladmin, request, queryset): + current_site = Site.objects.get_current() + current_site.photo_set.remove(*queryset) + msg = ngettext( + 'The photo has been successfully removed from %(site)s', + 'The selected photos have been successfully removed from %(site)s', + len(queryset) + ) % {'site': current_site.name} + messages.success(request, msg) + + remove_photos_from_current_site.short_description = \ + _("Remove selected photos from the current site") + + def get_urls(self): + urls = super().get_urls() + custom_urls = [ + path('upload_zip/', + self.admin_site.admin_view(self.upload_zip), + name='photologue_upload_zip') + ] + return custom_urls + urls + + def upload_zip(self, request): + + context = { + 'title': _('Upload a zip archive of photos'), + 'app_label': self.model._meta.app_label, + 'opts': self.model._meta, + 'has_change_permission': self.has_change_permission(request) + } + + # Handle form request + if request.method == 'POST': + form = UploadZipForm(request.POST, request.FILES) + if form.is_valid(): + form.save(request=request) + return HttpResponseRedirect('..') + else: + form = UploadZipForm() + context['form'] = form + context['adminform'] = helpers.AdminForm(form, + list([(None, {'fields': form.base_fields})]), + {}) + return render(request, 'admin/photologue/photo/upload_zip.html', context) + + +admin.site.register(Photo, PhotoAdmin) + + +class PhotoEffectAdmin(admin.ModelAdmin): + list_display = ('name', 'description', 'color', 'brightness', + 'contrast', 'sharpness', 'filters', 'admin_sample') + fieldsets = ( + (None, { + 'fields': ('name', 'description') + }), + ('Adjustments', { + 'fields': ('color', 'brightness', 'contrast', 'sharpness') + }), + ('Filters', { + 'fields': ('filters',) + }), + ('Reflection', { + 'fields': ('reflection_size', 'reflection_strength', 'background_color') + }), + ('Transpose', { + 'fields': ('transpose_method',) + }), + ) + + +admin.site.register(PhotoEffect, PhotoEffectAdmin) + + +class PhotoSizeAdmin(admin.ModelAdmin): + list_display = ('name', 'width', 'height', 'crop', 'pre_cache', 'effect', 'increment_count') + fieldsets = ( + (None, { + 'fields': ('name', 'width', 'height', 'quality') + }), + ('Options', { + 'fields': ('upscale', 'crop', 'pre_cache', 'increment_count') + }), + ('Enhancements', { + 'fields': ('effect', 'watermark',) + }), + ) + + +admin.site.register(PhotoSize, PhotoSizeAdmin) + + +class WatermarkAdmin(admin.ModelAdmin): + list_display = ('name', 'opacity', 'style') + + +admin.site.register(Watermark, WatermarkAdmin) diff --git a/photologue/apps.py b/photologue/apps.py new file mode 100644 index 0000000..19a451f --- /dev/null +++ b/photologue/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class PhotologueConfig(AppConfig): + default_auto_field = 'django.db.models.AutoField' + name = 'photologue' diff --git a/photologue/forms.py b/photologue/forms.py new file mode 100644 index 0000000..1468f98 --- /dev/null +++ b/photologue/forms.py @@ -0,0 +1,227 @@ +import logging +import os +import zipfile +from io import BytesIO +from typing import List +from zipfile import BadZipFile + +from django import forms +from django.conf import settings +from django.contrib import messages +from django.contrib.messages import constants +from django.contrib.sites.models import Site +from django.core.files.base import ContentFile +from django.template.defaultfilters import slugify +from django.utils.encoding import force_str +from django.utils.translation import gettext_lazy as _ +from PIL import Image + +from .models import Gallery, Photo + +logger = logging.getLogger('photologue.forms') + +MessageSeverity = int +MessageContent = str + + +class PhotoDefaults: + title: str + caption: str + is_public: bool + + def __init__(self, title: str, caption: str, is_public: bool) -> "PhotoDefaults": + self.title = title + self.caption = caption + self.is_public = is_public + + +class UploadMessage: + severity: MessageSeverity + content: MessageContent + + def __init__(self, severity: MessageSeverity, content: MessageContent) -> "UploadMessage": + self.severity = severity + self.content = content + + def success(content: MessageContent): + return UploadMessage(severity=constants.SUCCESS, content=content) + + def warning(content: MessageContent): + return UploadMessage(severity=constants.WARNING, content=content) + + +class UploadZipForm(forms.Form): + zip_file = forms.FileField() + + title = forms.CharField(label=_('Title'), + max_length=250, + required=False, + help_text=_('All uploaded photos will be given a title made up of this title + a ' + 'sequential number.
This field is required if creating a new ' + 'gallery, but is optional when adding to an existing gallery - if ' + 'not supplied, the photo titles will be creating from the existing ' + 'gallery name.')) + gallery = forms.ModelChoiceField(Gallery.objects.all(), + label=_('Gallery'), + required=False, + help_text=_('Select a gallery to add these images to. Leave this empty to ' + 'create a new gallery from the supplied title.')) + caption = forms.CharField(label=_('Caption'), + required=False, + help_text=_('Caption will be added to all photos.')) + description = forms.CharField(label=_('Description'), + required=False, + help_text=_('A description of this Gallery. Only required for new galleries.')) + is_public = forms.BooleanField(label=_('Is public'), + initial=True, + required=False, + help_text=_('Uncheck this to make the uploaded ' + 'gallery and included photographs private.')) + + def clean_zip_file(self): + """Open the zip file a first time, to check that it is a valid zip archive. + We'll open it again in a moment, so we have some duplication, but let's focus + on keeping the code easier to read! + """ + zip_file = self.cleaned_data['zip_file'] + try: + zip = zipfile.ZipFile(zip_file) + except BadZipFile as e: + raise forms.ValidationError(str(e)) + bad_file = zip.testzip() + if bad_file: + zip.close() + raise forms.ValidationError('"%s" in the .zip archive is corrupt.' % bad_file) + zip.close() # Close file in all cases. + return zip_file + + def clean_title(self): + title = self.cleaned_data['title'] + if title and Gallery.objects.filter(title=title).exists(): + raise forms.ValidationError(_('A gallery with that title already exists.')) + return title + + def clean(self): + cleaned_data = super().clean() + if not self['title'].errors: + # If there's already an error in the title, no need to add another + # error related to the same field. + if not cleaned_data.get('title', None) and not cleaned_data['gallery']: + raise forms.ValidationError( + _('Select an existing gallery, or enter a title for a new gallery.')) + return cleaned_data + + def save(self, request=None, zip_file=None): + if not zip_file: + zip_file = self.cleaned_data['zip_file'] + + zip = zipfile.ZipFile(zip_file) + photo_defaults = PhotoDefaults( + title=self.cleaned_data["title"], caption=self.cleaned_data["caption"], + is_public=self.cleaned_data["is_public"]) + current_site = Site.objects.get(id=settings.SITE_ID) + + gallery = self._reuse_or_create_gallery_in_site(current_site) + + upload_messages = upload_photos_to_site(current_site, zip, gallery, photo_defaults) + + if request: + for upload_message in upload_messages: + messages.add_message(request, upload_message.severity, upload_message.content, fail_silently=True) + + def _reuse_or_create_gallery_in_site(self, current_site): + if self.cleaned_data['gallery']: + logger.debug('Using pre-existing gallery.') + gallery = self.cleaned_data['gallery'] + else: + logger.debug( + force_str('Creating new gallery "{0}".').format(self.cleaned_data['title'])) + gallery = create_gallery_in_site(current_site, + title=self.cleaned_data['title'], + description=self.cleaned_data['description'], + is_public=self.cleaned_data['is_public']) + + return gallery + + +def create_gallery_in_site(site: Site, title: str, description: str = "", is_public: bool = False) -> Gallery: + gallery = Gallery.objects.create(title=title, + slug=slugify(title), + description=description, + is_public=is_public) + gallery.sites.add(site) + return gallery + + +def upload_photos_to_site(site: Site, zip: zipfile.ZipFile, gallery: Gallery, photo_defaults: PhotoDefaults)\ + -> List[UploadMessage]: + upload_messages = [] + count = 1 + + for filename in sorted(zip.namelist()): + + logger.debug(f'Reading file "{filename}".') + + if filename.startswith('__') or filename.startswith('.'): + logger.debug(f'Ignoring file "{filename}".') + continue + + if os.path.dirname(filename): + logger.warning('Ignoring file "{}" as it is in a subfolder; all images should be in the top ' + 'folder of the zip.'.format(filename)) + upload_messages.append(UploadMessage.warning( + _('Ignoring file "{filename}" as it is in a subfolder; all images should be in the top folder of the ' + 'zip.').format(filename=filename))) + continue + + data = zip.read(filename) + + if not len(data): + logger.debug(f'File "{filename}" is empty.') + continue + + photo_title_root = photo_defaults.title if photo_defaults.title else gallery.title + + # A photo might already exist with the same slug. So it's somewhat inefficient, + # but we loop until we find a slug that's available. + while True: + photo_title = ' '.join([photo_title_root, str(count)]) + slug = slugify(photo_title) + if Photo.objects.filter(slug=slug).exists(): + count += 1 + continue + break + + photo = Photo(title=photo_title, + slug=slug, + caption=photo_defaults.caption, + is_public=photo_defaults.is_public) + + # Basic check that we have a valid image. + try: + file = BytesIO(data) + opened = Image.open(file) + opened.verify() + except Exception: + # Pillow doesn't recognize it as an image. + # If a "bad" file is found we just skip it. + # But we do flag this both in the logs and to the user. + logger.error('Could not process file "{}" in the .zip archive.'.format( + filename)) + upload_messages.append(UploadMessage.warning( + _('Could not process file "{0}" in the .zip archive.').format(filename))) + continue + + contentfile = ContentFile(data) + photo.image.save(filename, contentfile) + photo.save() + photo.sites.add(site) + gallery.photos.add(photo) + count += 1 + + zip.close() + + upload_messages.append(UploadMessage.success( + _('The photos have been added to gallery "{0}".').format(gallery.title))) + + return upload_messages diff --git a/photologue/locale/ca/LC_MESSAGES/django.mo b/photologue/locale/ca/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..89358a6c0edbcfa610df301f133a8ba6f2860d8c GIT binary patch literal 15942 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 ucC0+CrvuaFT%0%6HnGZtg8A$AoKqMm%V!c literal 0 HcmV?d00001 diff --git a/photologue/locale/ca/LC_MESSAGES/django.po b/photologue/locale/ca/LC_MESSAGES/django.po new file mode 100644 index 0000000..03f2d20 --- /dev/null +++ b/photologue/locale/ca/LC_MESSAGES/django.po @@ -0,0 +1,764 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Translators: +# cubells , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-09-03 21:22+0000\n" +"PO-Revision-Date: 2018-04-21 15:47+0000\n" +"Last-Translator: cubells \n" +"Language-Team: Catalan (http://www.transifex.com/richardbarran/django-photologue/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" + +#: admin.py:61 +#, python-format +msgid "" +"The following photo does not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgid_plural "" +"The following photos do not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgstr[0] "La següent fotografia no pertany al mateix lloc o llocs que la galeria, així que no es mostrarà mai: %(photo_list)s." +msgstr[1] "Les següents fotografies no pertanyen al mateix lloc o llocs que la galeria, així que no es mostraran mai: %(photo_list)s." + +#: admin.py:73 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "S'ha afegit la galeria correctament a %(site)s" +msgstr[1] "S'han afegit les galeries correctament a %(site)s" + +#: admin.py:80 +msgid "Add selected galleries to the current site" +msgstr "Afegeix les galeries seleccionades al lloc web actual" + +#: admin.py:86 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "S'ha suprimit correctament la galeria de %(site)s" +msgstr[1] "S'han suprimit correctament les galeries de %(site)s" + +#: admin.py:93 +msgid "Remove selected galleries from the current site" +msgstr "Suprimeix les galeries seleccionades del lloc web actual" + +#: admin.py:100 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "Totes les fotos de la galeria %(galleries)s s'han afegit amb èxit a %(site)s" +msgstr[1] "Totes les fotos de les galeries %(galleries)s s'han afegit amb èxit a %(site)s" + +#: admin.py:108 +msgid "Add all photos of selected galleries to the current site" +msgstr "Afegeix totes les fotos de les galeries seleccionades al lloc web actual" + +#: admin.py:115 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "Totes les fotos de la galeria %(galleries)s s'han suprimit amb èxit de %(site)s" +msgstr[1] "Totes les fotos de les galeries %(galleries)s s'han suprimit amb èxit de %(site)s" + +#: admin.py:123 +msgid "Remove all photos in selected galleries from the current site" +msgstr "Suprimeix totes les fotos de les galeries seleccionades del lloc web actual" + +#: admin.py:164 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "La foto s'ha afegit amb èxit a %(site)s" +msgstr[1] "Les fotos seleccionades s'ha afegit amb èxit a %(site)s" + +#: admin.py:171 +msgid "Add selected photos to the current site" +msgstr "Afegeix les fotografies seleccionades al lloc web actual" + +#: admin.py:177 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "" +"The selected photos have been successfully removed from %(site)s" +msgstr[0] "La fotografia s'ha suprimit amb èxit de %(site)s" +msgstr[1] "Les fotografies seleccionades s'han suprimit amb èxit de %(site)s" + +#: admin.py:184 +msgid "Remove selected photos from the current site" +msgstr "Suprimeix les fotos seleccionades del lloc web actual" + +#: admin.py:198 templates/admin/photologue/photo/upload_zip.html:27 +msgid "Upload a zip archive of photos" +msgstr "Penja un fitxer zip de fotografies" + +#: forms.py:27 +#| msgid "title" +msgid "Title" +msgstr "Títol" + +#: forms.py:30 +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number.
This field is required if creating a new gallery, but " +"is optional when adding to an existing gallery - if not supplied, the photo " +"titles will be creating from the existing gallery name." +msgstr "A totes les fotografies penjades se li posarà un títol compost pel títol + un número seqüencial.
Aquest camp és necessari si es crea una galeria nova, però és opcional en afegir a una galeria existent - si no es posa, el títols de les fotografies es crearan del nom de la galeria existent." + +#: forms.py:36 +#| msgid "gallery" +msgid "Gallery" +msgstr "Galeria" + +#: forms.py:38 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "Selecciona una galeria a la qual afegir aquestes imatges. Deixa en blanc per crear una galeria nova amb el títol subministrat." + +#: forms.py:40 +#| msgid "caption" +msgid "Caption" +msgstr "Títol" + +#: forms.py:42 +msgid "Caption will be added to all photos." +msgstr "El títol s'afegirà a totes les fotografies." + +#: forms.py:43 +#| msgid "description" +msgid "Description" +msgstr "Descripció" + +#: forms.py:45 +#| msgid "A description of this Gallery." +msgid "A description of this Gallery. Only required for new galleries." +msgstr "Una descripció d'aquesta galeria. Solament és necessari per a noves galeries." + +#: forms.py:46 +#| msgid "is public" +msgid "Is public" +msgstr "És pública" + +#: forms.py:49 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "Desmarca per fer privades la galeria penjada i les fotografies incloses." + +#: forms.py:72 +msgid "A gallery with that title already exists." +msgstr "Una galeria amb aquest títol ja existeix." + +#: forms.py:82 +#| msgid "Select a .zip file of images to upload into a new Gallery." +msgid "Select an existing gallery, or enter a title for a new gallery." +msgstr "Seleccioneu una galeria existent, o introduïu un títol per a la galeria nova." + +#: forms.py:115 +#, python-brace-format +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "S'està ignorant el fitxer \"{filename}\" ja que està en una subcarpeta; totes les imatges haurien d'estar en la carpeta superior del fitxer zip." + +#: forms.py:156 +#, python-brace-format +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "No s'ha pogut processar el fitxer \"{0}\" del fitxer zip." + +#: forms.py:172 +#, python-brace-format +msgid "The photos have been added to gallery \"{0}\"." +msgstr "Les fotografies s'han afegit a la galeria \"{0}\"." + +#: models.py:98 +msgid "Very Low" +msgstr "Molt baixa" + +#: models.py:99 +msgid "Low" +msgstr "Baixa" + +#: models.py:100 +msgid "Medium-Low" +msgstr "Mitja-baix" + +#: models.py:101 +msgid "Medium" +msgstr "Mitjana" + +#: models.py:102 +msgid "Medium-High" +msgstr "Mitja-alta" + +#: models.py:103 +msgid "High" +msgstr "Alta" + +#: models.py:104 +msgid "Very High" +msgstr "Molt alta" + +#: models.py:109 +msgid "Top" +msgstr "Principi" + +#: models.py:110 +msgid "Right" +msgstr "Dreta" + +#: models.py:111 +msgid "Bottom" +msgstr "A baix" + +#: models.py:112 +msgid "Left" +msgstr "Esquerra" + +#: models.py:113 +msgid "Center (Default)" +msgstr "Centrada (predeterminat)" + +#: models.py:117 +msgid "Flip left to right" +msgstr "Gira d'esquerra a dreta" + +#: models.py:118 +msgid "Flip top to bottom" +msgstr "Gira de dalt a baix" + +#: models.py:119 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Rota 90 graus en sentit contrari al de les agulles del rellotge" + +#: models.py:120 +msgid "Rotate 90 degrees clockwise" +msgstr "Rota 90 graus en el sentit de les agulles del rellotge" + +#: models.py:121 +msgid "Rotate 180 degrees" +msgstr "Rota 180 graus" + +#: models.py:125 +msgid "Tile" +msgstr "Mosaic" + +#: models.py:126 +msgid "Scale" +msgstr "Escala" + +#: models.py:136 +#, python-format +msgid "" +"Chain multiple filters using the following pattern " +"\"FILTER_ONE->FILTER_TWO->FILTER_THREE\". Image filters will be applied in " +"order. The following filters are available: %s." +msgstr "Encadeneu múltiple filtres fent servir el següent patró \"FILTRE_UN->FILTRE_DOS->FILTRE_TRES\". Els filtres d'imatge s'aplicaran en ordre. Estan disponibles els filtres següents: %s." + +#: models.py:158 +msgid "date published" +msgstr "data de publicació" + +#: models.py:160 models.py:513 +msgid "title" +msgstr "títol" + +#: models.py:163 +msgid "title slug" +msgstr "url del títol" + +#: models.py:166 models.py:519 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "L'url del títol és un URL sense espais per a un objecte." + +#: models.py:167 models.py:596 +msgid "description" +msgstr "descripció" + +#: models.py:169 models.py:524 +msgid "is public" +msgstr "és pública" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Les galeries públiques es mostraran en les vistes predeterminades." + +#: models.py:175 models.py:536 +msgid "photos" +msgstr "fotos" + +#: models.py:177 models.py:527 +msgid "sites" +msgstr "llocs web" + +#: models.py:185 +msgid "gallery" +msgstr "galeria" + +#: models.py:186 +msgid "galleries" +msgstr "galeries" + +#: models.py:224 +msgid "count" +msgstr "compta" + +#: models.py:240 models.py:741 +msgid "image" +msgstr "imatge" + +#: models.py:243 +msgid "date taken" +msgstr "data en la què es va fer" + +#: models.py:246 +msgid "Date image was taken; is obtained from the image EXIF data." +msgstr "La data en què la imatge es va fer; s'obté de la informació EXIF de la imatge." + +#: models.py:247 +msgid "view count" +msgstr "vistes" + +#: models.py:250 +msgid "crop from" +msgstr "escapça des de" + +#: models.py:259 +msgid "effect" +msgstr "efecte" + +#: models.py:279 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "No s'ha definit una mida de fotografia de la miniatura d'administració." + +#: models.py:286 +msgid "Thumbnail" +msgstr "Miniatura" + +#: models.py:516 +msgid "slug" +msgstr "url" + +#: models.py:520 +msgid "caption" +msgstr "títol" + +#: models.py:522 +msgid "date added" +msgstr "data en què s'ha afegit" + +#: models.py:526 +msgid "Public photographs will be displayed in the default views." +msgstr "Les fotografies públiques es mostraran en les vistes predeterminades." + +#: models.py:535 +msgid "photo" +msgstr "foto" + +#: models.py:593 models.py:771 +msgid "name" +msgstr "nom" + +#: models.py:672 +msgid "rotate or flip" +msgstr "rota o gira" + +#: models.py:676 models.py:704 +msgid "color" +msgstr "color" + +#: models.py:678 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "Un factor de 0.0 proporciona una imatge en blanc i negre, un factor d'1.0 proporciona la imatge original." + +#: models.py:680 +msgid "brightness" +msgstr "brillantor" + +#: models.py:682 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "Un factor de 0.0 proporciona una imatge en negre, un factor d'1.0 proporciona la imatge original." + +#: models.py:684 +msgid "contrast" +msgstr "contrast" + +#: models.py:686 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original" +" image." +msgstr "Un factor de 0.0 proporciona una imatge en gris sòlid, un factor d'1.0 proporciona la imatge original." + +#: models.py:688 +msgid "sharpness" +msgstr "nitidesa" + +#: models.py:690 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "Un factor de 0.0 proporciona una imatge borrosa, un factor d'1.0 proporciona la imatge original." + +#: models.py:692 +msgid "filters" +msgstr "filtres" + +#: models.py:696 +msgid "size" +msgstr "mida" + +#: models.py:698 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "L'alçada del reflex com un percentatge de la imatge original. Un factor de 0.0 no afegeix reflex, un factor d'1.0 afegeix un reflex igual a l'alçada de la imatge original." + +#: models.py:701 +msgid "strength" +msgstr "reforçament" + +#: models.py:703 +msgid "The initial opacity of the reflection gradient." +msgstr "L'opacitat inicial del gradient de reflex." + +#: models.py:707 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "El color de fons del gradient de reflex. Definiu això per coincidir amb el color de fons de la pàgina web." + +#: models.py:711 models.py:815 +msgid "photo effect" +msgstr "efecte" + +#: models.py:712 +msgid "photo effects" +msgstr "efectes" + +#: models.py:743 +msgid "style" +msgstr "estil" + +#: models.py:747 +msgid "opacity" +msgstr "opacitat" + +#: models.py:749 +msgid "The opacity of the overlay." +msgstr "L'opacitat de la superposició." + +#: models.py:752 +msgid "watermark" +msgstr "marca d'aigua" + +#: models.py:753 +msgid "watermarks" +msgstr "marques d'aigua" + +#: models.py:775 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "El nom de la mida de la foto solament deu contenir lletres, nombres i guions baixos. Exemples: \"miniatura\", \"pantalla\", \"petita\", \"giny_de_la_pagina_principal\"." + +#: models.py:782 +msgid "width" +msgstr "amplada" + +#: models.py:785 +msgid "If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "Si l'amplada està definida a \"0\", la imatge s'escalarà a l'altura proporcionada." + +#: models.py:786 +msgid "height" +msgstr "alçada" + +#: models.py:789 +msgid "If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "Si l'alçada està definida a \"0\", la imatge s'escalarà a l'amplada proporcionada" + +#: models.py:790 +msgid "quality" +msgstr "qualitat" + +#: models.py:793 +msgid "JPEG image quality." +msgstr "Qualitat de la imatge JPEG." + +#: models.py:794 +msgid "upscale images?" +msgstr "millorem les imatges?" + +#: models.py:796 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "Si la imatge s'escalarà el que calgui per ajustar-se a les dimensions proporcionades. Les mides escapçades s'escalaran tenint em compte aquest paràmetre. " + +#: models.py:800 +msgid "crop to fit?" +msgstr "escapcem per ajustar?" + +#: models.py:802 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "Si la imatge seleccionada s'escalarà i escapçarà per ajustar-se a les dimensions proporcionades." + +#: models.py:804 +msgid "pre-cache?" +msgstr "pre-cache?" + +#: models.py:806 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "Si se selecciona, la mida d'aquesta fotografia es posarà en la memòria cau conforme s'afegeixen." + +#: models.py:807 +msgid "increment view count?" +msgstr "incrementem el comptador de vistes?" + +#: models.py:809 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "Si se selecciona, el comptador de vistes de la imatge s'incrementarà quan la fotografia es mostre." + +#: models.py:821 +msgid "watermark image" +msgstr "imatge de la marca d'aigua" + +#: models.py:826 +msgid "photo size" +msgstr "mida de la foto" + +#: models.py:827 +msgid "photo sizes" +msgstr "mides de les fotos" + +#: models.py:844 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "Solament es poden escapçar imatges si l'amplada i l'altura estan definides." + +#: templates/admin/photologue/photo/change_list.html:9 +msgid "Upload a zip archive" +msgstr "Penja un fitxer zip" + +#: templates/admin/photologue/photo/upload_zip.html:15 +msgid "Home" +msgstr "Inici" + +#: templates/admin/photologue/photo/upload_zip.html:19 +#: templates/admin/photologue/photo/upload_zip.html:53 +msgid "Upload" +msgstr "Penja" + +#: templates/admin/photologue/photo/upload_zip.html:28 +msgid "" +"\n" +"\t\t

On this page you can upload many photos at once, as long as you have\n" +"\t\tput them all in a zip archive. The photos can be either:

\n" +"\t\t
    \n" +"\t\t\t
  • Added to an existing gallery.
  • \n" +"\t\t\t
  • Otherwise, a new gallery is created with the supplied title.
  • \n" +"\t\t
\n" +"\t" +msgstr "\n\t\t

En aquesta pàgina podeu penjar tantes fotos com tingueu, d'una sola vegada\n\t\tposeu-les totes en un fitxer zip. Les fotos es podran o bé:

\n\t\t
    \n\t\t\t
  • Afegir a una galeria existent.
  • \n\t\t\t
  • O bé, es crearà una galeria nova amb el títol que poseu.
  • \n\t\t
\n\t" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the error below." +msgstr "Corregiu l'error següent." + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the errors below." +msgstr "Corregiu els error següents." + +#: templates/photologue/gallery_archive.html:4 +#: templates/photologue/gallery_archive.html:9 +msgid "Latest photo galleries" +msgstr "Darreres galeries" + +#: templates/photologue/gallery_archive.html:16 +#: templates/photologue/photo_archive.html:16 +msgid "Filter by year" +msgstr "Filtra pe any" + +#: templates/photologue/gallery_archive.html:32 +#: templates/photologue/gallery_list.html:26 +msgid "No galleries were found" +msgstr "No s'han trobat galeries" + +#: templates/photologue/gallery_archive_day.html:4 +#: templates/photologue/gallery_archive_day.html:9 +#, python-format +msgid "Galleries for %(show_day)s" +msgstr "Galeries de %(show_day)s" + +#: templates/photologue/gallery_archive_day.html:18 +#: templates/photologue/gallery_archive_month.html:32 +#: templates/photologue/gallery_archive_year.html:32 +msgid "No galleries were found." +msgstr "No s'han trobat galeries." + +#: templates/photologue/gallery_archive_day.html:22 +msgid "View all galleries for month" +msgstr "Mostra totes les galeries per mesos" + +#: templates/photologue/gallery_archive_month.html:4 +#: templates/photologue/gallery_archive_month.html:9 +#, python-format +msgid "Galleries for %(show_month)s" +msgstr "Galeries del mes de %(show_month)s" + +#: templates/photologue/gallery_archive_month.html:16 +#: templates/photologue/photo_archive_month.html:16 +msgid "Filter by day" +msgstr "Filtra per dia" + +#: templates/photologue/gallery_archive_month.html:35 +msgid "View all galleries for year" +msgstr "Mostra totes les galeries per any" + +#: templates/photologue/gallery_archive_year.html:4 +#: templates/photologue/gallery_archive_year.html:9 +#, python-format +msgid "Galleries for %(show_year)s" +msgstr "Galeries de %(show_year)s" + +#: templates/photologue/gallery_archive_year.html:16 +#: templates/photologue/photo_archive_year.html:17 +msgid "Filter by month" +msgstr "Filtra per mes" + +#: templates/photologue/gallery_archive_year.html:35 +#: templates/photologue/gallery_detail.html:17 +msgid "View all galleries" +msgstr "Mostra totes les galeries" + +#: templates/photologue/gallery_detail.html:10 +#: templates/photologue/gallery_list.html:16 +#: templates/photologue/includes/gallery_sample.html:8 +#: templates/photologue/photo_detail.html:10 +msgid "Published" +msgstr "Publicada" + +#: templates/photologue/gallery_list.html:4 +#: templates/photologue/gallery_list.html:9 +msgid "All galleries" +msgstr "Totes les galeries" + +#: templates/photologue/includes/paginator.html:6 +#: templates/photologue/includes/paginator.html:8 +msgid "Previous" +msgstr "Anterior" + +#: templates/photologue/includes/paginator.html:11 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "\n\t\t\t\t pàgina %(page_number)s de %(total_pages)s\n\t\t\t\t" + +#: templates/photologue/includes/paginator.html:16 +#: templates/photologue/includes/paginator.html:18 +msgid "Next" +msgstr "Següent" + +#: templates/photologue/photo_archive.html:4 +#: templates/photologue/photo_archive.html:9 +msgid "Latest photos" +msgstr "Les darreres fotos" + +#: templates/photologue/photo_archive.html:34 +#: templates/photologue/photo_archive_day.html:21 +#: templates/photologue/photo_archive_month.html:36 +#: templates/photologue/photo_archive_year.html:37 +#: templates/photologue/photo_list.html:21 +msgid "No photos were found" +msgstr "No s'han trobat fotos" + +#: templates/photologue/photo_archive_day.html:4 +#: templates/photologue/photo_archive_day.html:9 +#, python-format +msgid "Photos for %(show_day)s" +msgstr "Fotos de%(show_day)s" + +#: templates/photologue/photo_archive_day.html:24 +msgid "View all photos for month" +msgstr "Mostra totes les fotos per mesos" + +#: templates/photologue/photo_archive_month.html:4 +#: templates/photologue/photo_archive_month.html:9 +#, python-format +msgid "Photos for %(show_month)s" +msgstr "Fotos del mes de %(show_month)s" + +#: templates/photologue/photo_archive_month.html:39 +msgid "View all photos for year" +msgstr "Mostra totes les fotos per any" + +#: templates/photologue/photo_archive_year.html:4 +#: templates/photologue/photo_archive_year.html:10 +#, python-format +msgid "Photos for %(show_year)s" +msgstr "Fotos de %(show_year)s" + +#: templates/photologue/photo_archive_year.html:40 +msgid "View all photos" +msgstr "Mostra totes les fotos" + +#: templates/photologue/photo_detail.html:22 +msgid "This photo is found in the following galleries" +msgstr "Aquesta foto es troba en les següents galeries" + +#: templates/photologue/photo_list.html:4 +#: templates/photologue/photo_list.html:9 +msgid "All photos" +msgstr "Totes les fotos" + +#~ msgid "" +#~ "All uploaded photos will be given a title made up of this title + a " +#~ "sequential number." +#~ msgstr "" +#~ "All photos in the gallery will be given a title made up of the gallery title" +#~ " + a sequential number." + +#~ msgid "Separate tags with spaces, put quotes around multiple-word tags." +#~ msgstr "Separate tags with spaces, put quotes around multiple-word tags." + +#~ msgid "Django-tagging was not found, tags will be treated as plain text." +#~ msgstr "Django-tagging was not found, tags will be treated as plain text." + +#~ msgid "tags" +#~ msgstr "tags" + +#~ msgid "images file (.zip)" +#~ msgstr "images file (.zip)" + +#~ msgid "gallery upload" +#~ msgstr "gallery upload" + +#~ msgid "gallery uploads" +#~ msgstr "gallery uploads" diff --git a/photologue/locale/cs/LC_MESSAGES/django.mo b/photologue/locale/cs/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..978bdc4fb936c05bff417691d8090cf7237ef205 GIT binary patch literal 9776 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 literal 0 HcmV?d00001 diff --git a/photologue/locale/cs/LC_MESSAGES/django.po b/photologue/locale/cs/LC_MESSAGES/django.po new file mode 100644 index 0000000..df029ea --- /dev/null +++ b/photologue/locale/cs/LC_MESSAGES/django.po @@ -0,0 +1,781 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Translators: +# Jakub Dorňák , 2013 +# Jakub Dorňák , 2013 +# Jakub Dorňák , 2013 +# Viktor Matys , 2015 +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-09-03 21:22+0000\n" +"PO-Revision-Date: 2017-09-23 19:18+0000\n" +"Last-Translator: Richard Barran \n" +"Language-Team: Czech (http://www.transifex.com/richardbarran/django-photologue/language/cs/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cs\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" + +#: admin.py:61 +#, python-format +msgid "" +"The following photo does not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgid_plural "" +"The following photos do not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: admin.py:73 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: admin.py:80 +msgid "Add selected galleries to the current site" +msgstr "" + +#: admin.py:86 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: admin.py:93 +msgid "Remove selected galleries from the current site" +msgstr "" + +#: admin.py:100 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: admin.py:108 +msgid "Add all photos of selected galleries to the current site" +msgstr "" + +#: admin.py:115 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: admin.py:123 +msgid "Remove all photos in selected galleries from the current site" +msgstr "" + +#: admin.py:164 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: admin.py:171 +msgid "Add selected photos to the current site" +msgstr "" + +#: admin.py:177 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "" +"The selected photos have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: admin.py:184 +msgid "Remove selected photos from the current site" +msgstr "" + +#: admin.py:198 templates/admin/photologue/photo/upload_zip.html:27 +msgid "Upload a zip archive of photos" +msgstr "" + +#: forms.py:27 +#| msgid "title" +msgid "Title" +msgstr "" + +#: forms.py:30 +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number.
This field is required if creating a new gallery, but " +"is optional when adding to an existing gallery - if not supplied, the photo " +"titles will be creating from the existing gallery name." +msgstr "" + +#: forms.py:36 +#| msgid "gallery" +msgid "Gallery" +msgstr "" + +#: forms.py:38 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "Vyberte fotogalerii, do které se mají tyto obrázky přidat. Ponechte prázdné pro vytvoření nové fotogalerie s daným názvem." + +#: forms.py:40 +#| msgid "caption" +msgid "Caption" +msgstr "" + +#: forms.py:42 +msgid "Caption will be added to all photos." +msgstr "Titulek bude přidán ke všem fotografiím." + +#: forms.py:43 +#| msgid "description" +msgid "Description" +msgstr "Popis" + +#: forms.py:45 +#| msgid "A description of this Gallery." +msgid "A description of this Gallery. Only required for new galleries." +msgstr "" + +#: forms.py:46 +#| msgid "is public" +msgid "Is public" +msgstr "Je veřejné" + +#: forms.py:49 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "Zrušte zaškrtnutí, pokud chcete, aby byla nově nahraná fotogalerie neveřejná." + +#: forms.py:72 +msgid "A gallery with that title already exists." +msgstr "Již existuje galerie s tímto titulkem." + +#: forms.py:82 +#| msgid "Select a .zip file of images to upload into a new Gallery." +msgid "Select an existing gallery, or enter a title for a new gallery." +msgstr "Vyberte existující galerii, nebo zadejte titulek pro novou galerii." + +#: forms.py:115 +#, python-brace-format +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "" + +#: forms.py:156 +#, python-brace-format +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "Nešlo zpracovat soubor \"{0}\" v zip archivu." + +#: forms.py:172 +#, python-brace-format +msgid "The photos have been added to gallery \"{0}\"." +msgstr "Fotografie byly přidány do galerie \"{0}\"." + +#: models.py:98 +msgid "Very Low" +msgstr "Velmi nízká" + +#: models.py:99 +msgid "Low" +msgstr "Nízká" + +#: models.py:100 +msgid "Medium-Low" +msgstr "Nížší střední" + +#: models.py:101 +msgid "Medium" +msgstr "Střední" + +#: models.py:102 +msgid "Medium-High" +msgstr "Vyšší střední" + +#: models.py:103 +msgid "High" +msgstr "Vysoká" + +#: models.py:104 +msgid "Very High" +msgstr "Velmi vysoká" + +#: models.py:109 +msgid "Top" +msgstr "Nahoře" + +#: models.py:110 +msgid "Right" +msgstr "Vpravo" + +#: models.py:111 +msgid "Bottom" +msgstr "Dole" + +#: models.py:112 +msgid "Left" +msgstr "Vlevo" + +#: models.py:113 +msgid "Center (Default)" +msgstr "Uprostřed (výchozí)" + +#: models.py:117 +msgid "Flip left to right" +msgstr "Obrátit vodorovně" + +#: models.py:118 +msgid "Flip top to bottom" +msgstr "Obrátit svisle" + +#: models.py:119 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Otočit o 90 stupňů vlevo" + +#: models.py:120 +msgid "Rotate 90 degrees clockwise" +msgstr "Otočit o 90 stupňů vpravo" + +#: models.py:121 +msgid "Rotate 180 degrees" +msgstr "Otočit o 180 stupňů" + +#: models.py:125 +msgid "Tile" +msgstr "Dláždit" + +#: models.py:126 +msgid "Scale" +msgstr "Přizpůsobit velikost" + +#: models.py:136 +#, python-format +msgid "" +"Chain multiple filters using the following pattern " +"\"FILTER_ONE->FILTER_TWO->FILTER_THREE\". Image filters will be applied in " +"order. The following filters are available: %s." +msgstr "Zřetězte více filtrů použitím vzoru „PRVNI_FILTR->DRUHY_FILTR->TRETI_FILTR“.\nFiltry budou aplikovány v daném pořadí. K dispozici jsou tyto filtry: %s." + +#: models.py:158 +msgid "date published" +msgstr "datum zveřejnění" + +#: models.py:160 models.py:513 +msgid "title" +msgstr "název" + +#: models.py:163 +msgid "title slug" +msgstr "identifikátor" + +#: models.py:166 models.py:519 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "Unikátní název, který bude použit v URL adrese (bez diakritiky)." + +#: models.py:167 models.py:596 +msgid "description" +msgstr "popis" + +#: models.py:169 models.py:524 +msgid "is public" +msgstr "veřejné" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Veřejné fotogalerie budou zobrazeny ve výchozích pohledech." + +#: models.py:175 models.py:536 +msgid "photos" +msgstr "fotografie" + +#: models.py:177 models.py:527 +msgid "sites" +msgstr "" + +#: models.py:185 +msgid "gallery" +msgstr "fotogalerie" + +#: models.py:186 +msgid "galleries" +msgstr "fotogalerie" + +#: models.py:224 +msgid "count" +msgstr "počet" + +#: models.py:240 models.py:741 +msgid "image" +msgstr "obrázek" + +#: models.py:243 +msgid "date taken" +msgstr "datum pořízení" + +#: models.py:246 +msgid "Date image was taken; is obtained from the image EXIF data." +msgstr "" + +#: models.py:247 +msgid "view count" +msgstr "počet zobrazení" + +#: models.py:250 +msgid "crop from" +msgstr "oříznout" + +#: models.py:259 +msgid "effect" +msgstr "efekt" + +#: models.py:279 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "Velikost „admin_thumbnail“ není definovaná." + +#: models.py:286 +msgid "Thumbnail" +msgstr "Náhled" + +#: models.py:516 +msgid "slug" +msgstr "identifikátor" + +#: models.py:520 +msgid "caption" +msgstr "titulek" + +#: models.py:522 +msgid "date added" +msgstr "datum přidání" + +#: models.py:526 +msgid "Public photographs will be displayed in the default views." +msgstr "Veřejné fotografie budou zobrazeny ve výchozích pohledech." + +#: models.py:535 +msgid "photo" +msgstr "fotografie" + +#: models.py:593 models.py:771 +msgid "name" +msgstr "název" + +#: models.py:672 +msgid "rotate or flip" +msgstr "obrátit nebo otočit" + +#: models.py:676 models.py:704 +msgid "color" +msgstr "barva" + +#: models.py:678 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "Hodnota 0,0 udělá černobílý obrázek, hodnota 1,0 zachová původní barvy." + +#: models.py:680 +msgid "brightness" +msgstr "jas" + +#: models.py:682 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "Hodnota 0,0 udělá černý obrázek, hodnota 1,0 zachová původní jas." + +#: models.py:684 +msgid "contrast" +msgstr "kontrast" + +#: models.py:686 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original" +" image." +msgstr "Hodnota 0,0 udělá šedý obrázek, hodnota 1,0 zachová původní kontrast." + +#: models.py:688 +msgid "sharpness" +msgstr "ostrost" + +#: models.py:690 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "Hodnota 0,0 udělá rozmazaný obrázek, hodnota 1,0 zachová původní ostrost." + +#: models.py:692 +msgid "filters" +msgstr "filtry" + +#: models.py:696 +msgid "size" +msgstr "velikost" + +#: models.py:698 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "Výška odrazu jako podíl výšky původního obrázku. Hodnota 0.0 nepřidá žádný odraz, hodnota 1.0 přidá odraz stejně vysoký, jako původní obrázek." + +#: models.py:701 +msgid "strength" +msgstr "intenzita" + +#: models.py:703 +msgid "The initial opacity of the reflection gradient." +msgstr "Počáteční intenzita postupně slábnoucího odrazu." + +#: models.py:707 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "Barva pozadí odrazu. Nastavte na barvu pozadí stránky." + +#: models.py:711 models.py:815 +msgid "photo effect" +msgstr "efekt" + +#: models.py:712 +msgid "photo effects" +msgstr "efekty" + +#: models.py:743 +msgid "style" +msgstr "styl" + +#: models.py:747 +msgid "opacity" +msgstr "krytí" + +#: models.py:749 +msgid "The opacity of the overlay." +msgstr "Neprůhlednost překrývajícího obrázku." + +#: models.py:752 +msgid "watermark" +msgstr "vodotisk" + +#: models.py:753 +msgid "watermarks" +msgstr "vodotisky" + +#: models.py:775 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "Název velikosti by měl obsahovat pouze písmena, číslice a podtržítka. Například: „nahled“, „male_zobrazeni“, „velke_zobrazeni“." + +#: models.py:782 +msgid "width" +msgstr "šířka" + +#: models.py:785 +msgid "If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "Pokud je šířka nastavena na 0, velikost obrázku bude upravena podle zadané výšky." + +#: models.py:786 +msgid "height" +msgstr "výška" + +#: models.py:789 +msgid "If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "Pokud je výška nastavena na 0, velikost obrázku bude upravena podle zadané šířky." + +#: models.py:790 +msgid "quality" +msgstr "kvalita" + +#: models.py:793 +msgid "JPEG image quality." +msgstr "Kvalita JPEG." + +#: models.py:794 +msgid "upscale images?" +msgstr "zvětšit obrázky?" + +#: models.py:796 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "Pokud je vybráno, obrázek bude podle potřeby zvětšen, aby odpovídal požadovaným rozměrům. Pokud má být obrázek oříznutý, bude podle potřeby zvětšen bez ohledu na toto nastavení." + +#: models.py:800 +msgid "crop to fit?" +msgstr "oříznout?" + +#: models.py:802 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "Pokud je vybráno, obrázek bude oříznutý, aby odpovídal požadovaným proporcím." + +#: models.py:804 +msgid "pre-cache?" +msgstr "vytvářet předem?" + +#: models.py:806 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "Pokud je vybráno, bude pro každý obrázek vytvořena varianta v této velikosti předem, místo až v době zobrazení." + +#: models.py:807 +msgid "increment view count?" +msgstr "navyšovat počet zobrazení?" + +#: models.py:809 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "Pokud je vybráno, bude hodnota „view_count“ obrázku navyšována s každým zobrazením obrázku této velikosti." + +#: models.py:821 +msgid "watermark image" +msgstr "obrázek s vodotiskem" + +#: models.py:826 +msgid "photo size" +msgstr "velikost obrázku" + +#: models.py:827 +msgid "photo sizes" +msgstr "velikosti obrázků" + +#: models.py:844 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "Ořezávat fotografie je možné, pouze pokud je zadána výška i šířka." + +#: templates/admin/photologue/photo/change_list.html:9 +msgid "Upload a zip archive" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:15 +msgid "Home" +msgstr "Domů" + +#: templates/admin/photologue/photo/upload_zip.html:19 +#: templates/admin/photologue/photo/upload_zip.html:53 +msgid "Upload" +msgstr "Nahrát" + +#: templates/admin/photologue/photo/upload_zip.html:28 +msgid "" +"\n" +"\t\t

On this page you can upload many photos at once, as long as you have\n" +"\t\tput them all in a zip archive. The photos can be either:

\n" +"\t\t
    \n" +"\t\t\t
  • Added to an existing gallery.
  • \n" +"\t\t\t
  • Otherwise, a new gallery is created with the supplied title.
  • \n" +"\t\t
\n" +"\t" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the error below." +msgstr "Prosím opravte chybu dole." + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the errors below." +msgstr "Prosím opravte chyby dole." + +#: templates/photologue/gallery_archive.html:4 +#: templates/photologue/gallery_archive.html:9 +msgid "Latest photo galleries" +msgstr "Nejnovější fotogalerie" + +#: templates/photologue/gallery_archive.html:16 +#: templates/photologue/photo_archive.html:16 +msgid "Filter by year" +msgstr "Filtrovat dle roku" + +#: templates/photologue/gallery_archive.html:32 +#: templates/photologue/gallery_list.html:26 +msgid "No galleries were found" +msgstr "Žádné fotogalerie nebyly nalezeny" + +#: templates/photologue/gallery_archive_day.html:4 +#: templates/photologue/gallery_archive_day.html:9 +#, python-format +msgid "Galleries for %(show_day)s" +msgstr "" + +#: templates/photologue/gallery_archive_day.html:18 +#: templates/photologue/gallery_archive_month.html:32 +#: templates/photologue/gallery_archive_year.html:32 +msgid "No galleries were found." +msgstr "Žádné fotogalerie nebyly nalezeny." + +#: templates/photologue/gallery_archive_day.html:22 +msgid "View all galleries for month" +msgstr "" + +#: templates/photologue/gallery_archive_month.html:4 +#: templates/photologue/gallery_archive_month.html:9 +#, python-format +msgid "Galleries for %(show_month)s" +msgstr "" + +#: templates/photologue/gallery_archive_month.html:16 +#: templates/photologue/photo_archive_month.html:16 +msgid "Filter by day" +msgstr "Filtovat dle dne" + +#: templates/photologue/gallery_archive_month.html:35 +msgid "View all galleries for year" +msgstr "" + +#: templates/photologue/gallery_archive_year.html:4 +#: templates/photologue/gallery_archive_year.html:9 +#, python-format +msgid "Galleries for %(show_year)s" +msgstr "" + +#: templates/photologue/gallery_archive_year.html:16 +#: templates/photologue/photo_archive_year.html:17 +msgid "Filter by month" +msgstr "Filtrovat dle měsíce" + +#: templates/photologue/gallery_archive_year.html:35 +#: templates/photologue/gallery_detail.html:17 +msgid "View all galleries" +msgstr "Prohlédnout všechny fotogalerie" + +#: templates/photologue/gallery_detail.html:10 +#: templates/photologue/gallery_list.html:16 +#: templates/photologue/includes/gallery_sample.html:8 +#: templates/photologue/photo_detail.html:10 +msgid "Published" +msgstr "Zveřejněné" + +#: templates/photologue/gallery_list.html:4 +#: templates/photologue/gallery_list.html:9 +msgid "All galleries" +msgstr "Všechny fotogalerie" + +#: templates/photologue/includes/paginator.html:6 +#: templates/photologue/includes/paginator.html:8 +msgid "Previous" +msgstr "předchozí" + +#: templates/photologue/includes/paginator.html:11 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "" + +#: templates/photologue/includes/paginator.html:16 +#: templates/photologue/includes/paginator.html:18 +msgid "Next" +msgstr "další" + +#: templates/photologue/photo_archive.html:4 +#: templates/photologue/photo_archive.html:9 +msgid "Latest photos" +msgstr "" + +#: templates/photologue/photo_archive.html:34 +#: templates/photologue/photo_archive_day.html:21 +#: templates/photologue/photo_archive_month.html:36 +#: templates/photologue/photo_archive_year.html:37 +#: templates/photologue/photo_list.html:21 +msgid "No photos were found" +msgstr "" + +#: templates/photologue/photo_archive_day.html:4 +#: templates/photologue/photo_archive_day.html:9 +#, python-format +msgid "Photos for %(show_day)s" +msgstr "" + +#: templates/photologue/photo_archive_day.html:24 +msgid "View all photos for month" +msgstr "" + +#: templates/photologue/photo_archive_month.html:4 +#: templates/photologue/photo_archive_month.html:9 +#, python-format +msgid "Photos for %(show_month)s" +msgstr "" + +#: templates/photologue/photo_archive_month.html:39 +msgid "View all photos for year" +msgstr "" + +#: templates/photologue/photo_archive_year.html:4 +#: templates/photologue/photo_archive_year.html:10 +#, python-format +msgid "Photos for %(show_year)s" +msgstr "" + +#: templates/photologue/photo_archive_year.html:40 +msgid "View all photos" +msgstr "" + +#: templates/photologue/photo_detail.html:22 +msgid "This photo is found in the following galleries" +msgstr "Tato fotografie se nachází v následujících fotogaleriích" + +#: templates/photologue/photo_list.html:4 +#: templates/photologue/photo_list.html:9 +msgid "All photos" +msgstr "" + +#~ msgid "" +#~ "All uploaded photos will be given a title made up of this title + a " +#~ "sequential number." +#~ msgstr "" +#~ "All photos in the gallery will be given a title made up of the gallery title" +#~ " + a sequential number." + +#~ msgid "Separate tags with spaces, put quotes around multiple-word tags." +#~ msgstr "Separate tags with spaces, put quotes around multiple-word tags." + +#~ msgid "Django-tagging was not found, tags will be treated as plain text." +#~ msgstr "Django-tagging was not found, tags will be treated as plain text." + +#~ msgid "tags" +#~ msgstr "tags" + +#~ msgid "images file (.zip)" +#~ msgstr "images file (.zip)" + +#~ msgid "gallery upload" +#~ msgstr "gallery upload" + +#~ msgid "gallery uploads" +#~ msgstr "gallery uploads" diff --git a/photologue/locale/da/LC_MESSAGES/django.mo b/photologue/locale/da/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..6871d23ab5a2ed0257d6281f0727447e63cbce65 GIT binary patch literal 14117 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 E3pR*mZ2$lO literal 0 HcmV?d00001 diff --git a/photologue/locale/da/LC_MESSAGES/django.po b/photologue/locale/da/LC_MESSAGES/django.po new file mode 100644 index 0000000..f31e2f2 --- /dev/null +++ b/photologue/locale/da/LC_MESSAGES/django.po @@ -0,0 +1,766 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Translators: +# Michael Lind Mortensen , 2009 +# Rasmus Klett , 2015 +# Rasmus Klett , 2015 +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-09-03 21:22+0000\n" +"PO-Revision-Date: 2017-12-03 14:46+0000\n" +"Last-Translator: Richard Barran \n" +"Language-Team: Danish (http://www.transifex.com/richardbarran/django-photologue/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" + +#: admin.py:61 +#, python-format +msgid "" +"The following photo does not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgid_plural "" +"The following photos do not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgstr[0] "" +msgstr[1] "" + +#: admin.py:73 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "Galleriet er blevet tilføjet til %(site)s" +msgstr[1] "Gallerierne er blevet tilføjet til %(site)s" + +#: admin.py:80 +msgid "Add selected galleries to the current site" +msgstr "Tilføj valgte gallerier til den nuværende webside" + +#: admin.py:86 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "Det valgte galleri er blevet fjernet fra %(site)s" +msgstr[1] "De valgte gallerier er blevet fjernet fra %(site)s" + +#: admin.py:93 +msgid "Remove selected galleries from the current site" +msgstr "Fjern valgte gallerier fra den nuværende webside" + +#: admin.py:100 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "Alle billeder i galleriet %(galleries)s er blevet tilføjet til %(site)s" +msgstr[1] "Alle billeder i gallerierne %(galleries)s er blevet tilføjet til %(site)s" + +#: admin.py:108 +msgid "Add all photos of selected galleries to the current site" +msgstr "Tilføj alle billeder fra de valgte gallerier til den nuværende webside" + +#: admin.py:115 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "Alle billeder i galleriet %(galleries)s er blevet slettet fra %(site)s" +msgstr[1] "Alle billeder i gallerierne %(galleries)s er blevet slettet fra %(site)s" + +#: admin.py:123 +msgid "Remove all photos in selected galleries from the current site" +msgstr "Fjern alle billeder i valgte gallerier fra den nuværende webside" + +#: admin.py:164 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "Billedet er blevet tilføjet til %(site)s" +msgstr[1] "De valgte billeder er blevet tilføjet til %(site)s" + +#: admin.py:171 +msgid "Add selected photos to the current site" +msgstr "Tilføj valgte billeder til den nuværende webside" + +#: admin.py:177 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "" +"The selected photos have been successfully removed from %(site)s" +msgstr[0] "Billedet er blevet fjernet fra %(site)s" +msgstr[1] "De valgte billeder er blevet fjernet fra %(site)s" + +#: admin.py:184 +msgid "Remove selected photos from the current site" +msgstr "Fjern valgte billeder fra den nuværende webside" + +#: admin.py:198 templates/admin/photologue/photo/upload_zip.html:27 +msgid "Upload a zip archive of photos" +msgstr "Upload et zip-arkiv af billeder" + +#: forms.py:27 +#| msgid "title" +msgid "Title" +msgstr "Titel" + +#: forms.py:30 +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number.
This field is required if creating a new gallery, but " +"is optional when adding to an existing gallery - if not supplied, the photo " +"titles will be creating from the existing gallery name." +msgstr "" + +#: forms.py:36 +#| msgid "gallery" +msgid "Gallery" +msgstr "Galleri" + +#: forms.py:38 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "Vælg et galleri at tilføje disse billeder til. Lad feltet være tomt for at oprette et nyt galleri med den valgte title" + +#: forms.py:40 +#| msgid "caption" +msgid "Caption" +msgstr "Billedtekst" + +#: forms.py:42 +msgid "Caption will be added to all photos." +msgstr "Billedeteksten vil blive tilføjet til alle billeder." + +#: forms.py:43 +#| msgid "description" +msgid "Description" +msgstr "Beskrivelse" + +#: forms.py:45 +#| msgid "A description of this Gallery." +msgid "A description of this Gallery. Only required for new galleries." +msgstr "" + +#: forms.py:46 +#| msgid "is public" +msgid "Is public" +msgstr "Er offentlig" + +#: forms.py:49 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "Fjern afkrydsningen her for at gøre det uploadede galleri og alle inkluderede billeder private." + +#: forms.py:72 +msgid "A gallery with that title already exists." +msgstr "Et galleri med den titel eksisterer allerede" + +#: forms.py:82 +#| msgid "Select a .zip file of images to upload into a new Gallery." +msgid "Select an existing gallery, or enter a title for a new gallery." +msgstr "Vælg et eksisterende galleri, eller skriv en titel til et nyt galleri" + +#: forms.py:115 +#, python-brace-format +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "Ignorerer fil \"{filename}\", da det er en undermappe; alle billeder bør være i topmappen af zip-filen" + +#: forms.py:156 +#, python-brace-format +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "Kunne ikke behandle fil \"{0}\" i zip-arkivet." + +#: forms.py:172 +#, python-brace-format +msgid "The photos have been added to gallery \"{0}\"." +msgstr "Billederne er blevet tilføjet til galleri \"{0}\"" + +#: models.py:98 +msgid "Very Low" +msgstr "Meget Lav" + +#: models.py:99 +msgid "Low" +msgstr "Lav" + +#: models.py:100 +msgid "Medium-Low" +msgstr "Medium Lav" + +#: models.py:101 +msgid "Medium" +msgstr "Medium" + +#: models.py:102 +msgid "Medium-High" +msgstr "Medium Høj" + +#: models.py:103 +msgid "High" +msgstr "Høj" + +#: models.py:104 +msgid "Very High" +msgstr "Meget Høj" + +#: models.py:109 +msgid "Top" +msgstr "Top" + +#: models.py:110 +msgid "Right" +msgstr "Højre" + +#: models.py:111 +msgid "Bottom" +msgstr "Bund" + +#: models.py:112 +msgid "Left" +msgstr "Venstre" + +#: models.py:113 +msgid "Center (Default)" +msgstr "Center (Standard)" + +#: models.py:117 +msgid "Flip left to right" +msgstr "Flip venstre til højre" + +#: models.py:118 +msgid "Flip top to bottom" +msgstr "Flip top til bund" + +#: models.py:119 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Roter 90 grader mod uret" + +#: models.py:120 +msgid "Rotate 90 degrees clockwise" +msgstr "Roter 90 grader med uret" + +#: models.py:121 +msgid "Rotate 180 degrees" +msgstr "Roter 180 grader" + +#: models.py:125 +msgid "Tile" +msgstr "Tile" + +#: models.py:126 +msgid "Scale" +msgstr "Skala" + +#: models.py:136 +#, python-format +msgid "" +"Chain multiple filters using the following pattern " +"\"FILTER_ONE->FILTER_TWO->FILTER_THREE\". Image filters will be applied in " +"order. The following filters are available: %s." +msgstr "Sæt adskillige filtre i kæde vha. følgende mønster \"FILTER_ONE->FILTER_TWO->FILTER_THREE\". Billedefiltre vil blive påført i den anførte rækkefølge. De følgende filtre er tilgænglige: %s." + +#: models.py:158 +msgid "date published" +msgstr "dato offentliggjort" + +#: models.py:160 models.py:513 +msgid "title" +msgstr "titel" + +#: models.py:163 +msgid "title slug" +msgstr "titel slug" + +#: models.py:166 models.py:519 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "En \"slug\" er en unik URL-venlig titel for et objekt" + +#: models.py:167 models.py:596 +msgid "description" +msgstr "beskrivelse" + +#: models.py:169 models.py:524 +msgid "is public" +msgstr "er offentlig" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Offentlige gallerier vil blive vist i standard views." + +#: models.py:175 models.py:536 +msgid "photos" +msgstr "billeder" + +#: models.py:177 models.py:527 +msgid "sites" +msgstr "websider" + +#: models.py:185 +msgid "gallery" +msgstr "galleri" + +#: models.py:186 +msgid "galleries" +msgstr "gallerier" + +#: models.py:224 +msgid "count" +msgstr "tæller" + +#: models.py:240 models.py:741 +msgid "image" +msgstr "billede" + +#: models.py:243 +msgid "date taken" +msgstr "dato taget" + +#: models.py:246 +msgid "Date image was taken; is obtained from the image EXIF data." +msgstr "" + +#: models.py:247 +msgid "view count" +msgstr "set tæller" + +#: models.py:250 +msgid "crop from" +msgstr "beskær fra" + +#: models.py:259 +msgid "effect" +msgstr "effekt" + +#: models.py:279 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "En \"admin_thumbnail\" billedestørrelse er ikke blevet defineret." + +#: models.py:286 +msgid "Thumbnail" +msgstr "Thumbnail" + +#: models.py:516 +msgid "slug" +msgstr "slug" + +#: models.py:520 +msgid "caption" +msgstr "billedetekst" + +#: models.py:522 +msgid "date added" +msgstr "dato tilføjet" + +#: models.py:526 +msgid "Public photographs will be displayed in the default views." +msgstr "Offentlige billeder vil blive vist i standard views." + +#: models.py:535 +msgid "photo" +msgstr "billede" + +#: models.py:593 models.py:771 +msgid "name" +msgstr "navn" + +#: models.py:672 +msgid "rotate or flip" +msgstr "roter eller flip" + +#: models.py:676 models.py:704 +msgid "color" +msgstr "farve" + +#: models.py:678 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "En faktor af 0.0 giver et sort og hvidt billede, en faktor af 1.0 giver det originale billede." + +#: models.py:680 +msgid "brightness" +msgstr "lysstyrke" + +#: models.py:682 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "En faktor af 0.0 giver et sort billede, en faktor af 1.0 giver det originale billede." + +#: models.py:684 +msgid "contrast" +msgstr "kontrast" + +#: models.py:686 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original" +" image." +msgstr "En faktor af 0.0 giver et solidt gråt billede, en faktor af 1.0 giver det originale billede." + +#: models.py:688 +msgid "sharpness" +msgstr "skarphed" + +#: models.py:690 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "En faktor af 0.0 giver et sløret billede, en faktor af 1.0 giver det originale billede." + +#: models.py:692 +msgid "filters" +msgstr "filtre" + +#: models.py:696 +msgid "size" +msgstr "størrelse" + +#: models.py:698 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "Højden af reflektionen som en procentdel af det originale billede. En faktor af 0.0 tilføjer ingen reflektion, en faktor af 1.0 tilføjer en reflektion lig med højden af det oprindelige billede." + +#: models.py:701 +msgid "strength" +msgstr "styrke" + +#: models.py:703 +msgid "The initial opacity of the reflection gradient." +msgstr "Den initielle uigennemsigtighed af den reflektive gradient." + +#: models.py:707 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "Baggrundsfarven af den reflektive gradient. Sæt dette til at passe med baggrundsfarven af din side." + +#: models.py:711 models.py:815 +msgid "photo effect" +msgstr "billedeeffekt" + +#: models.py:712 +msgid "photo effects" +msgstr "billedeeffekter" + +#: models.py:743 +msgid "style" +msgstr "stil" + +#: models.py:747 +msgid "opacity" +msgstr "uigennemsigtighed" + +#: models.py:749 +msgid "The opacity of the overlay." +msgstr "Uigennemsigtigheden af overlaget." + +#: models.py:752 +msgid "watermark" +msgstr "vandmærke" + +#: models.py:753 +msgid "watermarks" +msgstr "vandmærker" + +#: models.py:775 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "Billede størrelse navn må kun indeholde bogstaver, numre og underscores. Eksempler: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." + +#: models.py:782 +msgid "width" +msgstr "bredde" + +#: models.py:785 +msgid "If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "Hvis bredden er sat til \"0\" vil billede blive skaleret til den givne højde." + +#: models.py:786 +msgid "height" +msgstr "højde" + +#: models.py:789 +msgid "If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "Hvis højden er sat til \"0\" vil billede blive skaleret til den givne bredde." + +#: models.py:790 +msgid "quality" +msgstr "kvalitet" + +#: models.py:793 +msgid "JPEG image quality." +msgstr "JPEG billedekvalitet" + +#: models.py:794 +msgid "upscale images?" +msgstr "opskaler billeder?" + +#: models.py:796 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "Hvis valgt, vil billedet blive skaleret op såfremt det er nødvendigt for at passe til de givne dimensioner. Beskårede størrelser vil blive opskaleret uanset denne indstilling." + +#: models.py:800 +msgid "crop to fit?" +msgstr "beskær til at passe?" + +#: models.py:802 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "Hvis valgt, vil billedet blive skaleret og beskåret for at passe til de givne dimensioner." + +#: models.py:804 +msgid "pre-cache?" +msgstr "pre-cache?" + +#: models.py:806 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "Hvis valgt, vil dette billedes størrelse blive pre-cached som billeder bliver tilføjet." + +#: models.py:807 +msgid "increment view count?" +msgstr "inkrementer set tæller?" + +#: models.py:809 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "Hvis valgt, vil billedets \"view_count\" blive inkrementeret når billedets størrelse vises." + +#: models.py:821 +msgid "watermark image" +msgstr "vandmærkebillede" + +#: models.py:826 +msgid "photo size" +msgstr "billedestørrelse" + +#: models.py:827 +msgid "photo sizes" +msgstr "billedestørrelser" + +#: models.py:844 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "Kan kun beskære billeder hvis både bedde og højde er specificeret." + +#: templates/admin/photologue/photo/change_list.html:9 +msgid "Upload a zip archive" +msgstr "Upload et zip-arkiv" + +#: templates/admin/photologue/photo/upload_zip.html:15 +msgid "Home" +msgstr "Hjem" + +#: templates/admin/photologue/photo/upload_zip.html:19 +#: templates/admin/photologue/photo/upload_zip.html:53 +msgid "Upload" +msgstr "Upload" + +#: templates/admin/photologue/photo/upload_zip.html:28 +msgid "" +"\n" +"\t\t

On this page you can upload many photos at once, as long as you have\n" +"\t\tput them all in a zip archive. The photos can be either:

\n" +"\t\t
    \n" +"\t\t\t
  • Added to an existing gallery.
  • \n" +"\t\t\t
  • Otherwise, a new gallery is created with the supplied title.
  • \n" +"\t\t
\n" +"\t" +msgstr "\n\t\t

På denne side can du uploade flere billeder på én gang, så længe du har\n\t\tsamlet dem i et zip-arkiv. Billederne kan enten blive:

\n\t\t
    \n\t\t\t
  • Tilføjet til et eksisterende galleri.
  • \n\t\t\t
  • Ellers bliver et nyt galleri oprettet med den valgte titel.
  • \n\t\t
\n\t" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the error below." +msgstr "Ret venligst fejlen nedenfor" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the errors below." +msgstr "Ret venligst fejlene nedenfor" + +#: templates/photologue/gallery_archive.html:4 +#: templates/photologue/gallery_archive.html:9 +msgid "Latest photo galleries" +msgstr "Seneste billedgallerier" + +#: templates/photologue/gallery_archive.html:16 +#: templates/photologue/photo_archive.html:16 +msgid "Filter by year" +msgstr "Filtrer efter år" + +#: templates/photologue/gallery_archive.html:32 +#: templates/photologue/gallery_list.html:26 +msgid "No galleries were found" +msgstr "Ingen gallerier fundet" + +#: templates/photologue/gallery_archive_day.html:4 +#: templates/photologue/gallery_archive_day.html:9 +#, python-format +msgid "Galleries for %(show_day)s" +msgstr "Gallerier for %(show_day)s" + +#: templates/photologue/gallery_archive_day.html:18 +#: templates/photologue/gallery_archive_month.html:32 +#: templates/photologue/gallery_archive_year.html:32 +msgid "No galleries were found." +msgstr "Ingen gallerier fundet" + +#: templates/photologue/gallery_archive_day.html:22 +msgid "View all galleries for month" +msgstr "Se alle gallerier i måned" + +#: templates/photologue/gallery_archive_month.html:4 +#: templates/photologue/gallery_archive_month.html:9 +#, python-format +msgid "Galleries for %(show_month)s" +msgstr "Gallerier i %(show_month)s" + +#: templates/photologue/gallery_archive_month.html:16 +#: templates/photologue/photo_archive_month.html:16 +msgid "Filter by day" +msgstr "Filtrer efter dag" + +#: templates/photologue/gallery_archive_month.html:35 +msgid "View all galleries for year" +msgstr "Se alle gallerier i året" + +#: templates/photologue/gallery_archive_year.html:4 +#: templates/photologue/gallery_archive_year.html:9 +#, python-format +msgid "Galleries for %(show_year)s" +msgstr "Gallerier i %(show_year)s" + +#: templates/photologue/gallery_archive_year.html:16 +#: templates/photologue/photo_archive_year.html:17 +msgid "Filter by month" +msgstr "Filtrer efter måned" + +#: templates/photologue/gallery_archive_year.html:35 +#: templates/photologue/gallery_detail.html:17 +msgid "View all galleries" +msgstr "Se alle gallerier" + +#: templates/photologue/gallery_detail.html:10 +#: templates/photologue/gallery_list.html:16 +#: templates/photologue/includes/gallery_sample.html:8 +#: templates/photologue/photo_detail.html:10 +msgid "Published" +msgstr "Offentliggjort" + +#: templates/photologue/gallery_list.html:4 +#: templates/photologue/gallery_list.html:9 +msgid "All galleries" +msgstr "Alle gallerier" + +#: templates/photologue/includes/paginator.html:6 +#: templates/photologue/includes/paginator.html:8 +msgid "Previous" +msgstr "Forrige" + +#: templates/photologue/includes/paginator.html:11 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "\n\t\t\t\t side %(page_number)s af %(total_pages)s\n\t\t\t\t" + +#: templates/photologue/includes/paginator.html:16 +#: templates/photologue/includes/paginator.html:18 +msgid "Next" +msgstr "Næste" + +#: templates/photologue/photo_archive.html:4 +#: templates/photologue/photo_archive.html:9 +msgid "Latest photos" +msgstr "Seneste billeder" + +#: templates/photologue/photo_archive.html:34 +#: templates/photologue/photo_archive_day.html:21 +#: templates/photologue/photo_archive_month.html:36 +#: templates/photologue/photo_archive_year.html:37 +#: templates/photologue/photo_list.html:21 +msgid "No photos were found" +msgstr "Ingen billeder fundet" + +#: templates/photologue/photo_archive_day.html:4 +#: templates/photologue/photo_archive_day.html:9 +#, python-format +msgid "Photos for %(show_day)s" +msgstr "Billeder for %(show_day)s" + +#: templates/photologue/photo_archive_day.html:24 +msgid "View all photos for month" +msgstr "Se alle billeder i måned" + +#: templates/photologue/photo_archive_month.html:4 +#: templates/photologue/photo_archive_month.html:9 +#, python-format +msgid "Photos for %(show_month)s" +msgstr "Billeder i %(show_month)s" + +#: templates/photologue/photo_archive_month.html:39 +msgid "View all photos for year" +msgstr "Se alle billeder i år" + +#: templates/photologue/photo_archive_year.html:4 +#: templates/photologue/photo_archive_year.html:10 +#, python-format +msgid "Photos for %(show_year)s" +msgstr "Billeder i %(show_year)s" + +#: templates/photologue/photo_archive_year.html:40 +msgid "View all photos" +msgstr "Se alle billeder" + +#: templates/photologue/photo_detail.html:22 +msgid "This photo is found in the following galleries" +msgstr "Dette billede findes i følgende gallerier" + +#: templates/photologue/photo_list.html:4 +#: templates/photologue/photo_list.html:9 +msgid "All photos" +msgstr "Alle billeder" + +#~ msgid "" +#~ "All uploaded photos will be given a title made up of this title + a " +#~ "sequential number." +#~ msgstr "" +#~ "All photos in the gallery will be given a title made up of the gallery title" +#~ " + a sequential number." + +#~ msgid "Separate tags with spaces, put quotes around multiple-word tags." +#~ msgstr "Separate tags with spaces, put quotes around multiple-word tags." + +#~ msgid "Django-tagging was not found, tags will be treated as plain text." +#~ msgstr "Django-tagging was not found, tags will be treated as plain text." + +#~ msgid "tags" +#~ msgstr "tags" + +#~ msgid "images file (.zip)" +#~ msgstr "images file (.zip)" + +#~ msgid "gallery upload" +#~ msgstr "gallery upload" + +#~ msgid "gallery uploads" +#~ msgstr "gallery uploads" diff --git a/photologue/locale/de/LC_MESSAGES/django.mo b/photologue/locale/de/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..07d79100942b25f4ea9f617f0bb57a92674fa6f4 GIT binary patch literal 15912 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 WGIN`v43~+V`D8PVGb*^`%lscw?9@&G literal 0 HcmV?d00001 diff --git a/photologue/locale/de/LC_MESSAGES/django.po b/photologue/locale/de/LC_MESSAGES/django.po new file mode 100644 index 0000000..0304596 --- /dev/null +++ b/photologue/locale/de/LC_MESSAGES/django.po @@ -0,0 +1,771 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Translators: +# FIRST AUTHOR , 2009 +# Jannis, 2012 +# Jannis Š, 2012 +# Jannis Vajen, 2012-2013 +# Jannis Vajen, 2012 +# Jannis Vajen, 2012,2015 +# Jannis Vajen, 2015-2016 +# Martin Darmüntzel , 2014 +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-09-03 21:22+0000\n" +"PO-Revision-Date: 2017-12-03 14:47+0000\n" +"Last-Translator: Richard Barran \n" +"Language-Team: German (http://www.transifex.com/richardbarran/django-photologue/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" + +#: admin.py:61 +#, python-format +msgid "" +"The following photo does not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgid_plural "" +"The following photos do not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgstr[0] "Dieses Foto gehört nicht zur selben Seite wie seine Galerie und wird daher nie angezeigt werden: %(photo_list)s." +msgstr[1] "Diese Fotos gehören nicht zur selben Seite wie ihre Galerie und werden daher nie angezeigt werden: %(photo_list)s." + +#: admin.py:73 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "Die Galerie wurden erfolgreich zu %(site)s hinzugefügt." +msgstr[1] "Die Galerien wurden erfolgreich zu %(site)s hinzugefügt." + +#: admin.py:80 +msgid "Add selected galleries to the current site" +msgstr "Ausgewählte Galerien zur aktuellen Site hinzufügen" + +#: admin.py:86 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "Die ausgewählte Galerie wurde erfolgreich von %(site)s entfernt." +msgstr[1] "Die ausgewählten Galerien wurden erfolgreich von %(site)s entfernt." + +#: admin.py:93 +msgid "Remove selected galleries from the current site" +msgstr "Entferne ausgewählte Galerien von der aktuellen Site." + +#: admin.py:100 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "Alle Fotos der Galerie %(galleries)s wurden zu %(site)s hinzugefügt." +msgstr[1] "Alle Fotos der Galerien %(galleries)s wurden zu %(site)s hinzugefügt." + +#: admin.py:108 +msgid "Add all photos of selected galleries to the current site" +msgstr "Alle Fotos der ausgewählten Galerien zur aktuellen Site hinzufügen." + +#: admin.py:115 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "Alle Fotos der Galerie %(galleries)s wurden erfolgreich von %(site)s entfernt." +msgstr[1] "Alle Fotos der Galerien %(galleries)s wurden erfolgreich von %(site)s entfernt." + +#: admin.py:123 +msgid "Remove all photos in selected galleries from the current site" +msgstr "Entferne alle Fotos der ausgewählten Gallerien von der aktuellen Seite" + +#: admin.py:164 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "Das Foto wurde erfolgreich zu %(site)s hinzugefügt." +msgstr[1] "Die gewählten Fotos wurden erfolgreich zu %(site)s hinzugefügt." + +#: admin.py:171 +msgid "Add selected photos to the current site" +msgstr "Füge ausgewählte Fotos zur aktuellen Seite hinzu" + +#: admin.py:177 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "" +"The selected photos have been successfully removed from %(site)s" +msgstr[0] "Das Foto wurde erfolgreich von %(site)s entfernt." +msgstr[1] "Die gewählten Fotos wurden erfolgreich von %(site)s entfernt" + +#: admin.py:184 +msgid "Remove selected photos from the current site" +msgstr "Entferne ausgewählte Fotos von der aktuellen Seite" + +#: admin.py:198 templates/admin/photologue/photo/upload_zip.html:27 +msgid "Upload a zip archive of photos" +msgstr "Lade ein Zip-Archiv an Fotos hoch" + +#: forms.py:27 +#| msgid "title" +msgid "Title" +msgstr "Titel" + +#: forms.py:30 +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number.
This field is required if creating a new gallery, but " +"is optional when adding to an existing gallery - if not supplied, the photo " +"titles will be creating from the existing gallery name." +msgstr "Für alle hochgeladenen Fotos wird ein Titel aus diesem Titel und einer fortlaufenden Nummer generiert.
Dieses Feld muss nur ausgefüllt werden, wenn eine neue Galerie angelegt wird, andernfalls ist es optional – wenn keine Angabe getätigt wird der Name der Galerie als Titel für die Einzelbilder herangezogen." + +#: forms.py:36 +#| msgid "gallery" +msgid "Gallery" +msgstr "Galerie" + +#: forms.py:38 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "Wähle eine Galerie aus, zu der diese Bilder hinzugefügt werden sollen. Lasse dieses Feld leer, um eine neue Galerie mit dem angegeben Titel zu erzeugen." + +#: forms.py:40 +#| msgid "caption" +msgid "Caption" +msgstr "Bildunterschrift" + +#: forms.py:42 +msgid "Caption will be added to all photos." +msgstr "Die Bildunterschrift wird allen Fotos hinzugefügt." + +#: forms.py:43 +#| msgid "description" +msgid "Description" +msgstr "Beschreibung" + +#: forms.py:45 +#| msgid "A description of this Gallery." +msgid "A description of this Gallery. Only required for new galleries." +msgstr "Eine Beschreibung dieser Galerie. Nur erforderlich bei neuen Galerien." + +#: forms.py:46 +#| msgid "is public" +msgid "Is public" +msgstr "Ist öffentlich" + +#: forms.py:49 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "Schalte dies aus, um die hochgeladene Galerie und alle enthaltenen Bilder privat zu machen." + +#: forms.py:72 +msgid "A gallery with that title already exists." +msgstr "Es existiert bereits eine Gallerie mit diesem Titel." + +#: forms.py:82 +#| msgid "Select a .zip file of images to upload into a new Gallery." +msgid "Select an existing gallery, or enter a title for a new gallery." +msgstr "Wähle eine existierende Galerie aus oder gib einen Titel für eine neue Galerie ein." + +#: forms.py:115 +#, python-brace-format +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "Ignoriere die Datei \"{filename}\", da sie sich in einem Unterordner befindet; alle Bilder sollten sich im Wurzelverzeichnis der Zip-Datei befinden." + +#: forms.py:156 +#, python-brace-format +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "Konnte die Datei \"{0}\" aus dem Zip-Archiv nicht verarbeiten." + +#: forms.py:172 +#, python-brace-format +msgid "The photos have been added to gallery \"{0}\"." +msgstr "Die Fotos wurden zur Galerie \"{0}\" hinzugefügt." + +#: models.py:98 +msgid "Very Low" +msgstr "Sehr niedrig" + +#: models.py:99 +msgid "Low" +msgstr "Niedrig" + +#: models.py:100 +msgid "Medium-Low" +msgstr "Mittel-niedrig" + +#: models.py:101 +msgid "Medium" +msgstr "Mittel" + +#: models.py:102 +msgid "Medium-High" +msgstr "Mittel-hoch" + +#: models.py:103 +msgid "High" +msgstr "Hoch" + +#: models.py:104 +msgid "Very High" +msgstr "Sehr hoch" + +#: models.py:109 +msgid "Top" +msgstr "Oben" + +#: models.py:110 +msgid "Right" +msgstr "Rechts" + +#: models.py:111 +msgid "Bottom" +msgstr "Unten" + +#: models.py:112 +msgid "Left" +msgstr "Links" + +#: models.py:113 +msgid "Center (Default)" +msgstr "Mitte (Standard)" + +#: models.py:117 +msgid "Flip left to right" +msgstr "Horizontal spiegeln" + +#: models.py:118 +msgid "Flip top to bottom" +msgstr "Vertikal spiegeln" + +#: models.py:119 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Um 90° nach links drehen" + +#: models.py:120 +msgid "Rotate 90 degrees clockwise" +msgstr "Um 90° nach rechts drehen" + +#: models.py:121 +msgid "Rotate 180 degrees" +msgstr "Um 180° drehen" + +#: models.py:125 +msgid "Tile" +msgstr "Kacheln" + +#: models.py:126 +msgid "Scale" +msgstr "Skalieren" + +#: models.py:136 +#, python-format +msgid "" +"Chain multiple filters using the following pattern " +"\"FILTER_ONE->FILTER_TWO->FILTER_THREE\". Image filters will be applied in " +"order. The following filters are available: %s." +msgstr "Verkette mehrere Filter in der Art \"FILTER_EINS->FILTER_ZWEI->FILTER_DREI\". Bildfilter werden nach der Reihe angewendet. Folgende Filter sind verfügbar: %s." + +#: models.py:158 +msgid "date published" +msgstr "Veröffentlichungsdatum" + +#: models.py:160 models.py:513 +msgid "title" +msgstr "Titel" + +#: models.py:163 +msgid "title slug" +msgstr "Kurztitel" + +#: models.py:166 models.py:519 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "Ein Kurztitel (\"slug\") ist ein eindeutiger, URL-geeigneter Titel für ein Objekt." + +#: models.py:167 models.py:596 +msgid "description" +msgstr "Beschreibung" + +#: models.py:169 models.py:524 +msgid "is public" +msgstr "ist öffentlich" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Öffentliche Galerien werden in den Standard-Views angezeigt." + +#: models.py:175 models.py:536 +msgid "photos" +msgstr "Fotos" + +#: models.py:177 models.py:527 +msgid "sites" +msgstr "Seiten" + +#: models.py:185 +msgid "gallery" +msgstr "Galerie" + +#: models.py:186 +msgid "galleries" +msgstr "Galerien" + +#: models.py:224 +msgid "count" +msgstr "Anzahl" + +#: models.py:240 models.py:741 +msgid "image" +msgstr "Bild" + +#: models.py:243 +msgid "date taken" +msgstr "Aufnahmedatum" + +#: models.py:246 +msgid "Date image was taken; is obtained from the image EXIF data." +msgstr "Datum, an dem das Foto geschossen wurde; ausgelesen aus den EXIF-Daten." + +#: models.py:247 +msgid "view count" +msgstr "Anzahl an Aufrufen" + +#: models.py:250 +msgid "crop from" +msgstr "Beschneiden von" + +#: models.py:259 +msgid "effect" +msgstr "Effekt" + +#: models.py:279 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "Es ist keine Fotogröße \"admin_thumbnail\" definiert." + +#: models.py:286 +msgid "Thumbnail" +msgstr "Vorschaubild" + +#: models.py:516 +msgid "slug" +msgstr "Kurztitel" + +#: models.py:520 +msgid "caption" +msgstr "Bildunterschrift" + +#: models.py:522 +msgid "date added" +msgstr "Datum des Eintrags" + +#: models.py:526 +msgid "Public photographs will be displayed in the default views." +msgstr "Öffentliche Fotos werden in den Standard-Views angezeigt." + +#: models.py:535 +msgid "photo" +msgstr "Foto" + +#: models.py:593 models.py:771 +msgid "name" +msgstr "Name" + +#: models.py:672 +msgid "rotate or flip" +msgstr "drehen oder spiegeln" + +#: models.py:676 models.py:704 +msgid "color" +msgstr "Farbe" + +#: models.py:678 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "Ein Faktor von 0.0 erzeugt ein Schwarzweißbild, ein Faktor von 1.0 erhält das Originalbild." + +#: models.py:680 +msgid "brightness" +msgstr "Helligkeit" + +#: models.py:682 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "Ein Faktor von 0.0 erzeugt ein schwarzes Bild, ein Faktor von 1.0 erhält das Originalbild." + +#: models.py:684 +msgid "contrast" +msgstr "Kontrast" + +#: models.py:686 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original" +" image." +msgstr "Ein Faktor von 0.0 erzeugt ein opak graues Bild, ein Faktor von 1.0 erhält das Originalbild." + +#: models.py:688 +msgid "sharpness" +msgstr "Schärfe" + +#: models.py:690 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "Ein Faktor von 0.0 erzeugt ein sehr unscharfes Bild, ein Faktor von 1.0 erhält das Originalbild." + +#: models.py:692 +msgid "filters" +msgstr "Filter" + +#: models.py:696 +msgid "size" +msgstr "Größe" + +#: models.py:698 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "Die Höhe der Reflexion als Prozentwert des Originalbildes. Ein Faktor von 0.0 erzeugt keine Reflexion, ein Faktor von 1.0 ergibt eine Reflexion von der Höhe des Originalbildes." + +#: models.py:701 +msgid "strength" +msgstr "Stärke" + +#: models.py:703 +msgid "The initial opacity of the reflection gradient." +msgstr "Die Anfangs-Deckung des Reflexions-Verlaufs." + +#: models.py:707 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "Die Hintergrundfarbe des Reflexions-Verlaufs. Setze dies auf die Hintergrundfarbe deiner Seite." + +#: models.py:711 models.py:815 +msgid "photo effect" +msgstr "Foto-Effekt" + +#: models.py:712 +msgid "photo effects" +msgstr "Foto-Effekte" + +#: models.py:743 +msgid "style" +msgstr "Stil" + +#: models.py:747 +msgid "opacity" +msgstr "Deckung" + +#: models.py:749 +msgid "The opacity of the overlay." +msgstr "Deckung (Opazität) der Überlagerung" + +#: models.py:752 +msgid "watermark" +msgstr "Wasserzeichen" + +#: models.py:753 +msgid "watermarks" +msgstr "Wasserzeichen" + +#: models.py:775 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "Der Name der Fotogröße darf nur Buchstaben, Zahlen und Unterstriche enthalten. Beispiele: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." + +#: models.py:782 +msgid "width" +msgstr "Breite" + +#: models.py:785 +msgid "If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "Wenn die Breite auf \"0\" gesetzt ist, wird das Bild proportional auf die angebene Höhe skaliert." + +#: models.py:786 +msgid "height" +msgstr "Höhe" + +#: models.py:789 +msgid "If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "Wenn die Höhe auf \"0\" gesetzt ist, wird das Bild proportional auf die angebene Breite skaliert." + +#: models.py:790 +msgid "quality" +msgstr "Qualität" + +#: models.py:793 +msgid "JPEG image quality." +msgstr "JPEG-Bildqualität" + +#: models.py:794 +msgid "upscale images?" +msgstr "Bilder hochskalieren?" + +#: models.py:796 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "Soll das Bild hochskaliert werden, um das angegebene Format zu erreichen? Beschnittene Größen werden unabhängig von dieser Einstellung bei Bedarf hochskaliert." + +#: models.py:800 +msgid "crop to fit?" +msgstr "Zuschneiden?" + +#: models.py:802 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "Soll das Bild auf das angegebene Format skaliert und beschnitten werden?" + +#: models.py:804 +msgid "pre-cache?" +msgstr "Vorausspeichern?" + +#: models.py:806 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "Soll diese Bildgröße im Voraus gespeichert (pre-cached) werden, wenn Fotos hinzugefügt werden?" + +#: models.py:807 +msgid "increment view count?" +msgstr "Bildzähler?" + +#: models.py:809 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "Soll der Ansichts-Zähler (view-count) hochgezählt werden, wenn ein Foto dieser Größe angezeigt wird?" + +#: models.py:821 +msgid "watermark image" +msgstr "Wasserzeichen-Bild" + +#: models.py:826 +msgid "photo size" +msgstr "Foto-Größe" + +#: models.py:827 +msgid "photo sizes" +msgstr "Foto-Größen" + +#: models.py:844 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "Fotos können nur zugeschnitten werden, wenn Breite und Höhe angegeben sind." + +#: templates/admin/photologue/photo/change_list.html:9 +msgid "Upload a zip archive" +msgstr "Lade ein Zip-Archiv hoch" + +#: templates/admin/photologue/photo/upload_zip.html:15 +msgid "Home" +msgstr "Start" + +#: templates/admin/photologue/photo/upload_zip.html:19 +#: templates/admin/photologue/photo/upload_zip.html:53 +msgid "Upload" +msgstr "Hochladen" + +#: templates/admin/photologue/photo/upload_zip.html:28 +msgid "" +"\n" +"\t\t

On this page you can upload many photos at once, as long as you have\n" +"\t\tput them all in a zip archive. The photos can be either:

\n" +"\t\t
    \n" +"\t\t\t
  • Added to an existing gallery.
  • \n" +"\t\t\t
  • Otherwise, a new gallery is created with the supplied title.
  • \n" +"\t\t
\n" +"\t" +msgstr "\n

Auf dieser Seite können mehrere Fotos auf einmal hochgeladen werden, sofern sie alle in einem Zip-Archiv vorliegen. Die Fotos können entweder:

\n
    \n
  • einer existierenden Galerie zugeordnet werden
  • \n
  • oder eine neue Galerie wird durch Angabe eines Titels angelegt
  • \n
" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the error below." +msgstr "Bitte korrigiere den unten aufgeführten Fehler." + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the errors below." +msgstr "Bitte korrigiere die unten aufgeführten Fehler." + +#: templates/photologue/gallery_archive.html:4 +#: templates/photologue/gallery_archive.html:9 +msgid "Latest photo galleries" +msgstr "Aktuelle Fotogalerien" + +#: templates/photologue/gallery_archive.html:16 +#: templates/photologue/photo_archive.html:16 +msgid "Filter by year" +msgstr "Filtere nach Jahr" + +#: templates/photologue/gallery_archive.html:32 +#: templates/photologue/gallery_list.html:26 +msgid "No galleries were found" +msgstr "Es wurden keine Galerien gefunden." + +#: templates/photologue/gallery_archive_day.html:4 +#: templates/photologue/gallery_archive_day.html:9 +#, python-format +msgid "Galleries for %(show_day)s" +msgstr "Gallerien vom %(show_day)s." + +#: templates/photologue/gallery_archive_day.html:18 +#: templates/photologue/gallery_archive_month.html:32 +#: templates/photologue/gallery_archive_year.html:32 +msgid "No galleries were found." +msgstr "Es wurden keine Galerien gefunden." + +#: templates/photologue/gallery_archive_day.html:22 +msgid "View all galleries for month" +msgstr "Zeige alle Gallerien vom Monat" + +#: templates/photologue/gallery_archive_month.html:4 +#: templates/photologue/gallery_archive_month.html:9 +#, python-format +msgid "Galleries for %(show_month)s" +msgstr "Gallerien von %(show_month)s" + +#: templates/photologue/gallery_archive_month.html:16 +#: templates/photologue/photo_archive_month.html:16 +msgid "Filter by day" +msgstr "Filtere nach Tag" + +#: templates/photologue/gallery_archive_month.html:35 +msgid "View all galleries for year" +msgstr "Zeige alle Gallerien vom Jahr" + +#: templates/photologue/gallery_archive_year.html:4 +#: templates/photologue/gallery_archive_year.html:9 +#, python-format +msgid "Galleries for %(show_year)s" +msgstr "Gallerien von %(show_year)s" + +#: templates/photologue/gallery_archive_year.html:16 +#: templates/photologue/photo_archive_year.html:17 +msgid "Filter by month" +msgstr "Filtere nach Monat" + +#: templates/photologue/gallery_archive_year.html:35 +#: templates/photologue/gallery_detail.html:17 +msgid "View all galleries" +msgstr "Zeige alle Galerien." + +#: templates/photologue/gallery_detail.html:10 +#: templates/photologue/gallery_list.html:16 +#: templates/photologue/includes/gallery_sample.html:8 +#: templates/photologue/photo_detail.html:10 +msgid "Published" +msgstr "Veröffentlicht" + +#: templates/photologue/gallery_list.html:4 +#: templates/photologue/gallery_list.html:9 +msgid "All galleries" +msgstr "Alle Galerien" + +#: templates/photologue/includes/paginator.html:6 +#: templates/photologue/includes/paginator.html:8 +msgid "Previous" +msgstr "Vorherige" + +#: templates/photologue/includes/paginator.html:11 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "\nSeite %(page_number)s von %(total_pages)s" + +#: templates/photologue/includes/paginator.html:16 +#: templates/photologue/includes/paginator.html:18 +msgid "Next" +msgstr "Nächste" + +#: templates/photologue/photo_archive.html:4 +#: templates/photologue/photo_archive.html:9 +msgid "Latest photos" +msgstr "Aktuelle Fotos" + +#: templates/photologue/photo_archive.html:34 +#: templates/photologue/photo_archive_day.html:21 +#: templates/photologue/photo_archive_month.html:36 +#: templates/photologue/photo_archive_year.html:37 +#: templates/photologue/photo_list.html:21 +msgid "No photos were found" +msgstr "Keine Fotos gefunden" + +#: templates/photologue/photo_archive_day.html:4 +#: templates/photologue/photo_archive_day.html:9 +#, python-format +msgid "Photos for %(show_day)s" +msgstr "Fotos vom %(show_day)s." + +#: templates/photologue/photo_archive_day.html:24 +msgid "View all photos for month" +msgstr "Zeige alle Fotos vom Monat" + +#: templates/photologue/photo_archive_month.html:4 +#: templates/photologue/photo_archive_month.html:9 +#, python-format +msgid "Photos for %(show_month)s" +msgstr "Fotos von %(show_month)s" + +#: templates/photologue/photo_archive_month.html:39 +msgid "View all photos for year" +msgstr "Zeige alle Fotos vom Jahr" + +#: templates/photologue/photo_archive_year.html:4 +#: templates/photologue/photo_archive_year.html:10 +#, python-format +msgid "Photos for %(show_year)s" +msgstr "Fotos von %(show_year)s" + +#: templates/photologue/photo_archive_year.html:40 +msgid "View all photos" +msgstr "Zeige alle Fotos" + +#: templates/photologue/photo_detail.html:22 +msgid "This photo is found in the following galleries" +msgstr "Dieses Foto befindet sich in folgenden Galerien" + +#: templates/photologue/photo_list.html:4 +#: templates/photologue/photo_list.html:9 +msgid "All photos" +msgstr "Alle Fotos" + +#~ msgid "" +#~ "All uploaded photos will be given a title made up of this title + a " +#~ "sequential number." +#~ msgstr "" +#~ "All photos in the gallery will be given a title made up of the gallery title" +#~ " + a sequential number." + +#~ msgid "Separate tags with spaces, put quotes around multiple-word tags." +#~ msgstr "Separate tags with spaces, put quotes around multiple-word tags." + +#~ msgid "Django-tagging was not found, tags will be treated as plain text." +#~ msgstr "Django-tagging was not found, tags will be treated as plain text." + +#~ msgid "tags" +#~ msgstr "tags" + +#~ msgid "images file (.zip)" +#~ msgstr "images file (.zip)" + +#~ msgid "gallery upload" +#~ msgstr "gallery upload" + +#~ msgid "gallery uploads" +#~ msgstr "gallery uploads" diff --git a/photologue/locale/en/LC_MESSAGES/django.mo b/photologue/locale/en/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..637f512233f8605c831a979d1ec989b5bebeac72 GIT binary patch literal 454 zcmYLE(N4lJ6vgP%9)0$qCO$y4>xPnGamJvKkVss}^u27CtvK4H?F9e9SAWlM@eT-_ z1G@v\n" +"Language-Team: English (http://www.transifex.com/richardbarran/django-photologue/language/en/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: admin.py:61 +#, python-format +msgid "" +"The following photo does not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgid_plural "" +"The following photos do not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgstr[0] "" +msgstr[1] "" + +#: admin.py:73 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:80 +msgid "Add selected galleries to the current site" +msgstr "" + +#: admin.py:86 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:93 +msgid "Remove selected galleries from the current site" +msgstr "" + +#: admin.py:100 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:108 +msgid "Add all photos of selected galleries to the current site" +msgstr "" + +#: admin.py:115 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:123 +msgid "Remove all photos in selected galleries from the current site" +msgstr "" + +#: admin.py:164 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:171 +msgid "Add selected photos to the current site" +msgstr "" + +#: admin.py:177 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "" +"The selected photos have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:184 +msgid "Remove selected photos from the current site" +msgstr "" + +#: admin.py:198 templates/admin/photologue/photo/upload_zip.html:27 +msgid "Upload a zip archive of photos" +msgstr "" + +#: forms.py:27 +#| msgid "title" +msgid "Title" +msgstr "" + +#: forms.py:30 +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number.
This field is required if creating a new gallery, but " +"is optional when adding to an existing gallery - if not supplied, the photo " +"titles will be creating from the existing gallery name." +msgstr "" + +#: forms.py:36 +#| msgid "gallery" +msgid "Gallery" +msgstr "" + +#: forms.py:38 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "" + +#: forms.py:40 +#| msgid "caption" +msgid "Caption" +msgstr "" + +#: forms.py:42 +msgid "Caption will be added to all photos." +msgstr "" + +#: forms.py:43 +#| msgid "description" +msgid "Description" +msgstr "" + +#: forms.py:45 +#| msgid "A description of this Gallery." +msgid "A description of this Gallery. Only required for new galleries." +msgstr "" + +#: forms.py:46 +#| msgid "is public" +msgid "Is public" +msgstr "" + +#: forms.py:49 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "" + +#: forms.py:72 +msgid "A gallery with that title already exists." +msgstr "" + +#: forms.py:82 +#| msgid "Select a .zip file of images to upload into a new Gallery." +msgid "Select an existing gallery, or enter a title for a new gallery." +msgstr "" + +#: forms.py:115 +#, python-brace-format +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "" + +#: forms.py:156 +#, python-brace-format +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "" + +#: forms.py:172 +#, python-brace-format +msgid "The photos have been added to gallery \"{0}\"." +msgstr "" + +#: models.py:98 +msgid "Very Low" +msgstr "" + +#: models.py:99 +msgid "Low" +msgstr "" + +#: models.py:100 +msgid "Medium-Low" +msgstr "" + +#: models.py:101 +msgid "Medium" +msgstr "" + +#: models.py:102 +msgid "Medium-High" +msgstr "" + +#: models.py:103 +msgid "High" +msgstr "" + +#: models.py:104 +msgid "Very High" +msgstr "" + +#: models.py:109 +msgid "Top" +msgstr "" + +#: models.py:110 +msgid "Right" +msgstr "" + +#: models.py:111 +msgid "Bottom" +msgstr "" + +#: models.py:112 +msgid "Left" +msgstr "" + +#: models.py:113 +msgid "Center (Default)" +msgstr "" + +#: models.py:117 +msgid "Flip left to right" +msgstr "" + +#: models.py:118 +msgid "Flip top to bottom" +msgstr "" + +#: models.py:119 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "" + +#: models.py:120 +msgid "Rotate 90 degrees clockwise" +msgstr "" + +#: models.py:121 +msgid "Rotate 180 degrees" +msgstr "" + +#: models.py:125 +msgid "Tile" +msgstr "" + +#: models.py:126 +msgid "Scale" +msgstr "" + +#: models.py:136 +#, python-format +msgid "" +"Chain multiple filters using the following pattern " +"\"FILTER_ONE->FILTER_TWO->FILTER_THREE\". Image filters will be applied in " +"order. The following filters are available: %s." +msgstr "" + +#: models.py:158 +msgid "date published" +msgstr "" + +#: models.py:160 models.py:513 +msgid "title" +msgstr "" + +#: models.py:163 +msgid "title slug" +msgstr "" + +#: models.py:166 models.py:519 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "" + +#: models.py:167 models.py:596 +msgid "description" +msgstr "" + +#: models.py:169 models.py:524 +msgid "is public" +msgstr "" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "" + +#: models.py:175 models.py:536 +msgid "photos" +msgstr "" + +#: models.py:177 models.py:527 +msgid "sites" +msgstr "" + +#: models.py:185 +msgid "gallery" +msgstr "" + +#: models.py:186 +msgid "galleries" +msgstr "" + +#: models.py:224 +msgid "count" +msgstr "" + +#: models.py:240 models.py:741 +msgid "image" +msgstr "" + +#: models.py:243 +msgid "date taken" +msgstr "" + +#: models.py:246 +msgid "Date image was taken; is obtained from the image EXIF data." +msgstr "" + +#: models.py:247 +msgid "view count" +msgstr "" + +#: models.py:250 +msgid "crop from" +msgstr "" + +#: models.py:259 +msgid "effect" +msgstr "" + +#: models.py:279 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "" + +#: models.py:286 +msgid "Thumbnail" +msgstr "" + +#: models.py:516 +msgid "slug" +msgstr "" + +#: models.py:520 +msgid "caption" +msgstr "" + +#: models.py:522 +msgid "date added" +msgstr "" + +#: models.py:526 +msgid "Public photographs will be displayed in the default views." +msgstr "" + +#: models.py:535 +msgid "photo" +msgstr "" + +#: models.py:593 models.py:771 +msgid "name" +msgstr "" + +#: models.py:672 +msgid "rotate or flip" +msgstr "" + +#: models.py:676 models.py:704 +msgid "color" +msgstr "" + +#: models.py:678 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "" + +#: models.py:680 +msgid "brightness" +msgstr "" + +#: models.py:682 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "" + +#: models.py:684 +msgid "contrast" +msgstr "" + +#: models.py:686 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original" +" image." +msgstr "" + +#: models.py:688 +msgid "sharpness" +msgstr "" + +#: models.py:690 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "" + +#: models.py:692 +msgid "filters" +msgstr "" + +#: models.py:696 +msgid "size" +msgstr "" + +#: models.py:698 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "" + +#: models.py:701 +msgid "strength" +msgstr "" + +#: models.py:703 +msgid "The initial opacity of the reflection gradient." +msgstr "" + +#: models.py:707 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "" + +#: models.py:711 models.py:815 +msgid "photo effect" +msgstr "" + +#: models.py:712 +msgid "photo effects" +msgstr "" + +#: models.py:743 +msgid "style" +msgstr "" + +#: models.py:747 +msgid "opacity" +msgstr "" + +#: models.py:749 +msgid "The opacity of the overlay." +msgstr "" + +#: models.py:752 +msgid "watermark" +msgstr "" + +#: models.py:753 +msgid "watermarks" +msgstr "" + +#: models.py:775 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "" + +#: models.py:782 +msgid "width" +msgstr "" + +#: models.py:785 +msgid "If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "" + +#: models.py:786 +msgid "height" +msgstr "" + +#: models.py:789 +msgid "If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "" + +#: models.py:790 +msgid "quality" +msgstr "" + +#: models.py:793 +msgid "JPEG image quality." +msgstr "" + +#: models.py:794 +msgid "upscale images?" +msgstr "" + +#: models.py:796 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "" + +#: models.py:800 +msgid "crop to fit?" +msgstr "" + +#: models.py:802 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "" + +#: models.py:804 +msgid "pre-cache?" +msgstr "" + +#: models.py:806 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "" + +#: models.py:807 +msgid "increment view count?" +msgstr "" + +#: models.py:809 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "" + +#: models.py:821 +msgid "watermark image" +msgstr "" + +#: models.py:826 +msgid "photo size" +msgstr "" + +#: models.py:827 +msgid "photo sizes" +msgstr "" + +#: models.py:844 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "" + +#: templates/admin/photologue/photo/change_list.html:9 +msgid "Upload a zip archive" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:15 +msgid "Home" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:19 +#: templates/admin/photologue/photo/upload_zip.html:53 +msgid "Upload" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:28 +msgid "" +"\n" +"\t\t

On this page you can upload many photos at once, as long as you have\n" +"\t\tput them all in a zip archive. The photos can be either:

\n" +"\t\t
    \n" +"\t\t\t
  • Added to an existing gallery.
  • \n" +"\t\t\t
  • Otherwise, a new gallery is created with the supplied title.
  • \n" +"\t\t
\n" +"\t" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the error below." +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the errors below." +msgstr "" + +#: templates/photologue/gallery_archive.html:4 +#: templates/photologue/gallery_archive.html:9 +msgid "Latest photo galleries" +msgstr "" + +#: templates/photologue/gallery_archive.html:16 +#: templates/photologue/photo_archive.html:16 +msgid "Filter by year" +msgstr "" + +#: templates/photologue/gallery_archive.html:32 +#: templates/photologue/gallery_list.html:26 +msgid "No galleries were found" +msgstr "" + +#: templates/photologue/gallery_archive_day.html:4 +#: templates/photologue/gallery_archive_day.html:9 +#, python-format +msgid "Galleries for %(show_day)s" +msgstr "" + +#: templates/photologue/gallery_archive_day.html:18 +#: templates/photologue/gallery_archive_month.html:32 +#: templates/photologue/gallery_archive_year.html:32 +msgid "No galleries were found." +msgstr "" + +#: templates/photologue/gallery_archive_day.html:22 +msgid "View all galleries for month" +msgstr "" + +#: templates/photologue/gallery_archive_month.html:4 +#: templates/photologue/gallery_archive_month.html:9 +#, python-format +msgid "Galleries for %(show_month)s" +msgstr "" + +#: templates/photologue/gallery_archive_month.html:16 +#: templates/photologue/photo_archive_month.html:16 +msgid "Filter by day" +msgstr "" + +#: templates/photologue/gallery_archive_month.html:35 +msgid "View all galleries for year" +msgstr "" + +#: templates/photologue/gallery_archive_year.html:4 +#: templates/photologue/gallery_archive_year.html:9 +#, python-format +msgid "Galleries for %(show_year)s" +msgstr "" + +#: templates/photologue/gallery_archive_year.html:16 +#: templates/photologue/photo_archive_year.html:17 +msgid "Filter by month" +msgstr "" + +#: templates/photologue/gallery_archive_year.html:35 +#: templates/photologue/gallery_detail.html:17 +msgid "View all galleries" +msgstr "" + +#: templates/photologue/gallery_detail.html:10 +#: templates/photologue/gallery_list.html:16 +#: templates/photologue/includes/gallery_sample.html:8 +#: templates/photologue/photo_detail.html:10 +msgid "Published" +msgstr "" + +#: templates/photologue/gallery_list.html:4 +#: templates/photologue/gallery_list.html:9 +msgid "All galleries" +msgstr "" + +#: templates/photologue/includes/paginator.html:6 +#: templates/photologue/includes/paginator.html:8 +msgid "Previous" +msgstr "" + +#: templates/photologue/includes/paginator.html:11 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "" + +#: templates/photologue/includes/paginator.html:16 +#: templates/photologue/includes/paginator.html:18 +msgid "Next" +msgstr "" + +#: templates/photologue/photo_archive.html:4 +#: templates/photologue/photo_archive.html:9 +msgid "Latest photos" +msgstr "" + +#: templates/photologue/photo_archive.html:34 +#: templates/photologue/photo_archive_day.html:21 +#: templates/photologue/photo_archive_month.html:36 +#: templates/photologue/photo_archive_year.html:37 +#: templates/photologue/photo_list.html:21 +msgid "No photos were found" +msgstr "" + +#: templates/photologue/photo_archive_day.html:4 +#: templates/photologue/photo_archive_day.html:9 +#, python-format +msgid "Photos for %(show_day)s" +msgstr "" + +#: templates/photologue/photo_archive_day.html:24 +msgid "View all photos for month" +msgstr "" + +#: templates/photologue/photo_archive_month.html:4 +#: templates/photologue/photo_archive_month.html:9 +#, python-format +msgid "Photos for %(show_month)s" +msgstr "" + +#: templates/photologue/photo_archive_month.html:39 +msgid "View all photos for year" +msgstr "" + +#: templates/photologue/photo_archive_year.html:4 +#: templates/photologue/photo_archive_year.html:10 +#, python-format +msgid "Photos for %(show_year)s" +msgstr "" + +#: templates/photologue/photo_archive_year.html:40 +msgid "View all photos" +msgstr "" + +#: templates/photologue/photo_detail.html:22 +msgid "This photo is found in the following galleries" +msgstr "" + +#: templates/photologue/photo_list.html:4 +#: templates/photologue/photo_list.html:9 +msgid "All photos" +msgstr "" + +#~ msgid "" +#~ "All uploaded photos will be given a title made up of this title + a " +#~ "sequential number." +#~ msgstr "" +#~ "All photos in the gallery will be given a title made up of the gallery title" +#~ " + a sequential number." + +#~ msgid "Separate tags with spaces, put quotes around multiple-word tags." +#~ msgstr "Separate tags with spaces, put quotes around multiple-word tags." + +#~ msgid "Django-tagging was not found, tags will be treated as plain text." +#~ msgstr "Django-tagging was not found, tags will be treated as plain text." + +#~ msgid "tags" +#~ msgstr "tags" + +#~ msgid "images file (.zip)" +#~ msgstr "images file (.zip)" + +#~ msgid "gallery upload" +#~ msgstr "gallery upload" + +#~ msgid "gallery uploads" +#~ msgstr "gallery uploads" diff --git a/photologue/locale/en_US/LC_MESSAGES/django.mo b/photologue/locale/en_US/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..5524315f731c55a5a7fc49c37d0ce98e77228994 GIT binary patch literal 8130 zcmeH~UyNK;8Nd(n$9AoNP*4=*FcxT~GrLH?nE!vpXtDEdDI zzXYFzcfq~ulp2HIgtx*!!^`2OcbDyVLZ+bhK^eyZNK=LD(fmhC2?_4g3|6TDE`!P z&jl1aeGZD<9)P0vAt>#??w-Hv-ai4QzaK)DUOf$^-g8jq@p~xk{{*Gp3sCxh8H(S( z4rLr`t||My97?~}Kq|~neTBZ{TRmuD0=RO;`g6%&ksP+ z^RO#_)RjL8rTsGyx3_I4AYpFHf%>TYafx4Fi`w&_B!q;zIn{uUk|H@ zj9;#!$Q&YmaRfPpY(aJ*;sZA!vKJ95Y7-(C;b-Fmw^SoY1(9oy{V#3hZY>V;kEs>Y zvT;ios2QYpjdLUR5F6fr;I=j{BnCDja=in&5s`Q}^Ag*RA-Jc#b~}C?ivP+QegwG= zkvNgH-+*jKdY7!b_>km>QDg@qzH$(eoU$2dAd+W3hKQfuh3rS}K;+Vh#N|$;cS-)( zhnzq@*(-Fs)A2TV3-Sr~toG_k78dP_4l?cOA`0#=MNNq&7gGD0>=0mT!Kt*3Kb%NaJpzF2GW?l@ckM^tQ9i!tk zXa|uOmNoyE;kM_v$Cbkd3QSZBe# zMt8hSM{%y_jfu2xT0vy|n%WoVdE8ZFvMLel)J)@~Y?bMtrRU?kqn84oe_4)>3EG`p z`$5-4SrA7oR%&!+Sj#al$tj_77}AIKd>_luxyQ2|Mn)wQjYRnjJI}9i^9Am$u$(b(GHk7MHP%mzuh5di++mdUqFI805<}HHjyw z$#_W}GJa5W9jexU%A%^goig|2YAV)k;>eIqv9Q56TiC`|(}VDiye|IJiHi_-h@)KM z%0_f(ByO_JIwC7baEZgvnA>KYnyjYB@A0}sUsl(ZLF(A7E6$h|ZnG}k%S{)(a|w|( zhhf?#uhi6ZY8HdI$kcQ(9|p~pBXzl;zbX=T;+&)(iGMB2Ok}x+*8c6(OF9ELI;W-? z3#evnM9##y$Br?&ZG=upq$X3YXnVgzH^aEOuoPtGZ12SBOj;e(nUxS#vo;XfgUW@l zVS$&(bTSv28KF|slg3*#rEi*UlG}*dXkReLrS%W;vCN!zCE#pQDwm#66_ z8a$ntw26L6qppVRvx99`pSgcy57}c@4DyYewyoo>sG^O8gbZEgclwA<@6Q@0h=M$z zew=ts;;1*Wv)RSgKcil}Xi^e{OuwHJxUu2X^UlGZ(+@hTyFFDk0=%ISC+bK<;@~@F zVEF}EccY6Wj6K=?dafc7NA?N}DO~C0Ng6ET7&Ud&kZ5h_+dB#Tqr`^YJO_iAx4TY6 zDpk#LyH(aX_>c0`%W`h;US&6Naj){OOyIkfZ+%eqc(t)(-{jtciIi`$W*XSN zT$xr2UsG;RRD*%IiK%k6l--w9KR?^B#%&qOZY5T>c|l2rQf@hvwL?td5T`}k-?%m2IRF#&IPpGums8!bS(!`p|>X6ScZc2;e~bv-nFxH>}~mFm^~bXM0}Mn-R{j*eEhjOfwP`pC^Uj&Kc4vdq;+ z>P1=T@#$RWOQgwE{dq5?P~YMn_joBEdR11Fh^;l_TCuQ;wo$tvoU0Avb?bUOYRmfT zjYo(nJabl3XSPXi?Bsb;A0A#>TB_kzeCf5!J?Q8TC*{<#;bho9iL$tA7tKy=ICR>F zO*D68c6d|2ySla|Lx&~~jSo!17yQr|eoKa_HkK16oU_#pvwa8A4lQ%y!)fP{#)0a# zK|L8wi|jleHDjMoh`Qc3ALK*RVUc=a^+23<*~Oy7K4v?&?9k=y&W(}2cBdZQv}0)X ztbzl)F)f!zFUel#dX`!}tE`??>``j8_qtIMwtHpS=&svmJ9*&nl~Dm9w1T RR?jM{XBCch|L?QPe*u=1>#P6( literal 0 HcmV?d00001 diff --git a/photologue/locale/en_US/LC_MESSAGES/django.po b/photologue/locale/en_US/LC_MESSAGES/django.po new file mode 100644 index 0000000..ca0d522 --- /dev/null +++ b/photologue/locale/en_US/LC_MESSAGES/django.po @@ -0,0 +1,813 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-09-03 21:22+0000\n" +"PO-Revision-Date: 2013-11-20 11:06+0000\n" +"Last-Translator: richardbarran \n" +"Language-Team: English (United States) (http://www.transifex.com/projects/p/" +"django-photologue/language/en_US/)\n" +"Language: en_US\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" + +#: admin.py:61 +#, python-format +msgid "" +"The following photo does not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgid_plural "" +"The following photos do not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgstr[0] "" +msgstr[1] "" + +#: admin.py:73 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:80 +msgid "Add selected galleries to the current site" +msgstr "" + +#: admin.py:86 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:93 +msgid "Remove selected galleries from the current site" +msgstr "" + +#: admin.py:100 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:108 +msgid "Add all photos of selected galleries to the current site" +msgstr "" + +#: admin.py:115 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:123 +msgid "Remove all photos in selected galleries from the current site" +msgstr "" + +#: admin.py:164 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:171 +msgid "Add selected photos to the current site" +msgstr "" + +#: admin.py:177 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "The selected photos have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:184 +msgid "Remove selected photos from the current site" +msgstr "" + +#: admin.py:198 templates/admin/photologue/photo/upload_zip.html:27 +msgid "Upload a zip archive of photos" +msgstr "" + +#: forms.py:27 +#, fuzzy +#| msgid "title" +msgid "Title" +msgstr "title" + +#: forms.py:30 +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number.
This field is required if creating a new gallery, but " +"is optional when adding to an existing gallery - if not supplied, the photo " +"titles will be creating from the existing gallery name." +msgstr "" + +#: forms.py:36 +#, fuzzy +#| msgid "gallery" +msgid "Gallery" +msgstr "gallery" + +#: forms.py:38 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." + +#: forms.py:40 +#, fuzzy +#| msgid "caption" +msgid "Caption" +msgstr "caption" + +#: forms.py:42 +msgid "Caption will be added to all photos." +msgstr "Caption will be added to all photos." + +#: forms.py:43 +#, fuzzy +#| msgid "description" +msgid "Description" +msgstr "description" + +#: forms.py:45 +#, fuzzy +#| msgid "A description of this Gallery." +msgid "A description of this Gallery. Only required for new galleries." +msgstr "A description of this Gallery." + +#: forms.py:46 +#, fuzzy +#| msgid "is public" +msgid "Is public" +msgstr "is public" + +#: forms.py:49 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "" +"Uncheck this to make the uploaded gallery and included photographs private." + +#: forms.py:72 +msgid "A gallery with that title already exists." +msgstr "" + +#: forms.py:82 +#, fuzzy +#| msgid "Select a .zip file of images to upload into a new Gallery." +msgid "Select an existing gallery, or enter a title for a new gallery." +msgstr "Select a .zip file of images to upload into a new Gallery." + +#: forms.py:115 +#, python-brace-format +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "" + +#: forms.py:156 +#, python-brace-format +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "" + +#: forms.py:172 +#, python-brace-format +msgid "The photos have been added to gallery \"{0}\"." +msgstr "" + +#: models.py:98 +msgid "Very Low" +msgstr "Very Low" + +#: models.py:99 +msgid "Low" +msgstr "Low" + +#: models.py:100 +msgid "Medium-Low" +msgstr "Medium-Low" + +#: models.py:101 +msgid "Medium" +msgstr "Medium" + +#: models.py:102 +msgid "Medium-High" +msgstr "Medium-High" + +#: models.py:103 +msgid "High" +msgstr "High" + +#: models.py:104 +msgid "Very High" +msgstr "Very High" + +#: models.py:109 +msgid "Top" +msgstr "Top" + +#: models.py:110 +msgid "Right" +msgstr "Right" + +#: models.py:111 +msgid "Bottom" +msgstr "Bottom" + +#: models.py:112 +msgid "Left" +msgstr "Left" + +#: models.py:113 +msgid "Center (Default)" +msgstr "Center (Default)" + +#: models.py:117 +msgid "Flip left to right" +msgstr "Flip left to right" + +#: models.py:118 +msgid "Flip top to bottom" +msgstr "Flip top to bottom" + +#: models.py:119 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Rotate 90 degrees counter-clockwise" + +#: models.py:120 +msgid "Rotate 90 degrees clockwise" +msgstr "Rotate 90 degrees clockwise" + +#: models.py:121 +msgid "Rotate 180 degrees" +msgstr "Rotate 180 degrees" + +#: models.py:125 +msgid "Tile" +msgstr "Tile" + +#: models.py:126 +msgid "Scale" +msgstr "Scale" + +#: models.py:136 +#, python-format +msgid "" +"Chain multiple filters using the following pattern \"FILTER_ONE->FILTER_TWO-" +">FILTER_THREE\". Image filters will be applied in order. The following " +"filters are available: %s." +msgstr "" +"Chain multiple filters using the following pattern \"FILTER_ONE->FILTER_TWO-" +">FILTER_THREE\". Image filters will be applied in order. The following " +"filters are available: %s." + +#: models.py:158 +msgid "date published" +msgstr "date published" + +#: models.py:160 models.py:513 +msgid "title" +msgstr "title" + +#: models.py:163 +msgid "title slug" +msgstr "title slug" + +#: models.py:166 models.py:519 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "A \"slug\" is a unique URL-friendly title for an object." + +#: models.py:167 models.py:596 +msgid "description" +msgstr "description" + +#: models.py:169 models.py:524 +msgid "is public" +msgstr "is public" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Public galleries will be displayed in the default views." + +#: models.py:175 models.py:536 +msgid "photos" +msgstr "photos" + +#: models.py:177 models.py:527 +msgid "sites" +msgstr "" + +#: models.py:185 +msgid "gallery" +msgstr "gallery" + +#: models.py:186 +msgid "galleries" +msgstr "galleries" + +#: models.py:224 +msgid "count" +msgstr "count" + +#: models.py:240 models.py:741 +msgid "image" +msgstr "image" + +#: models.py:243 +msgid "date taken" +msgstr "date taken" + +#: models.py:246 +msgid "Date image was taken; is obtained from the image EXIF data." +msgstr "" + +#: models.py:247 +msgid "view count" +msgstr "view count" + +#: models.py:250 +msgid "crop from" +msgstr "crop from" + +#: models.py:259 +msgid "effect" +msgstr "effect" + +#: models.py:279 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "An \"admin_thumbnail\" photo size has not been defined." + +#: models.py:286 +msgid "Thumbnail" +msgstr "Thumbnail" + +#: models.py:516 +msgid "slug" +msgstr "slug" + +#: models.py:520 +msgid "caption" +msgstr "caption" + +#: models.py:522 +msgid "date added" +msgstr "date added" + +#: models.py:526 +msgid "Public photographs will be displayed in the default views." +msgstr "Public photographs will be displayed in the default views." + +#: models.py:535 +msgid "photo" +msgstr "photo" + +#: models.py:593 models.py:771 +msgid "name" +msgstr "name" + +#: models.py:672 +msgid "rotate or flip" +msgstr "rotate or flip" + +#: models.py:676 models.py:704 +msgid "color" +msgstr "color" + +#: models.py:678 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." + +#: models.py:680 +msgid "brightness" +msgstr "brightness" + +#: models.py:682 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." + +#: models.py:684 +msgid "contrast" +msgstr "contrast" + +#: models.py:686 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original " +"image." +msgstr "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original " +"image." + +#: models.py:688 +msgid "sharpness" +msgstr "sharpness" + +#: models.py:690 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." + +#: models.py:692 +msgid "filters" +msgstr "filters" + +#: models.py:696 +msgid "size" +msgstr "size" + +#: models.py:698 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." + +#: models.py:701 +msgid "strength" +msgstr "strength" + +#: models.py:703 +msgid "The initial opacity of the reflection gradient." +msgstr "The initial opacity of the reflection gradient." + +#: models.py:707 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." + +#: models.py:711 models.py:815 +msgid "photo effect" +msgstr "photo effect" + +#: models.py:712 +msgid "photo effects" +msgstr "photo effects" + +#: models.py:743 +msgid "style" +msgstr "style" + +#: models.py:747 +msgid "opacity" +msgstr "opacity" + +#: models.py:749 +msgid "The opacity of the overlay." +msgstr "The opacity of the overlay." + +#: models.py:752 +msgid "watermark" +msgstr "watermark" + +#: models.py:753 +msgid "watermarks" +msgstr "watermarks" + +#: models.py:775 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." + +#: models.py:782 +msgid "width" +msgstr "width" + +#: models.py:785 +msgid "" +"If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "" +"If width is set to \"0\" the image will be scaled to the supplied height." + +#: models.py:786 +msgid "height" +msgstr "height" + +#: models.py:789 +msgid "" +"If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "" +"If height is set to \"0\" the image will be scaled to the supplied width" + +#: models.py:790 +msgid "quality" +msgstr "quality" + +#: models.py:793 +msgid "JPEG image quality." +msgstr "JPEG image quality." + +#: models.py:794 +msgid "upscale images?" +msgstr "upscale images?" + +#: models.py:796 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." + +#: models.py:800 +msgid "crop to fit?" +msgstr "crop to fit?" + +#: models.py:802 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." + +#: models.py:804 +msgid "pre-cache?" +msgstr "pre-cache?" + +#: models.py:806 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "If selected this photo size will be pre-cached as photos are added." + +#: models.py:807 +msgid "increment view count?" +msgstr "increment view count?" + +#: models.py:809 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." + +#: models.py:821 +msgid "watermark image" +msgstr "watermark image" + +#: models.py:826 +msgid "photo size" +msgstr "photo size" + +#: models.py:827 +msgid "photo sizes" +msgstr "photo sizes" + +#: models.py:844 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "Can only crop photos if both width and height dimensions are set." + +#: templates/admin/photologue/photo/change_list.html:9 +msgid "Upload a zip archive" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:15 +msgid "Home" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:19 +#: templates/admin/photologue/photo/upload_zip.html:53 +msgid "Upload" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:28 +msgid "" +"\n" +"\t\t

On this page you can upload many photos at once, as long as you have\n" +"\t\tput them all in a zip archive. The photos can be either:

\n" +"\t\t
    \n" +"\t\t\t
  • Added to an existing gallery.
  • \n" +"\t\t\t
  • Otherwise, a new gallery is created with the supplied title.
  • \n" +"\t\t
\n" +"\t" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the error below." +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the errors below." +msgstr "" + +#: templates/photologue/gallery_archive.html:4 +#: templates/photologue/gallery_archive.html:9 +#, fuzzy +msgid "Latest photo galleries" +msgstr "Latest Photo Galleries" + +#: templates/photologue/gallery_archive.html:16 +#: templates/photologue/photo_archive.html:16 +msgid "Filter by year" +msgstr "" + +#: templates/photologue/gallery_archive.html:32 +#: templates/photologue/gallery_list.html:26 +msgid "No galleries were found" +msgstr "No galleries were found" + +#: templates/photologue/gallery_archive_day.html:4 +#: templates/photologue/gallery_archive_day.html:9 +#, python-format +msgid "Galleries for %(show_day)s" +msgstr "" + +#: templates/photologue/gallery_archive_day.html:18 +#: templates/photologue/gallery_archive_month.html:32 +#: templates/photologue/gallery_archive_year.html:32 +#, fuzzy +msgid "No galleries were found." +msgstr "No galleries were found" + +#: templates/photologue/gallery_archive_day.html:22 +#, fuzzy +msgid "View all galleries for month" +msgstr "View all galleries" + +#: templates/photologue/gallery_archive_month.html:4 +#: templates/photologue/gallery_archive_month.html:9 +#, python-format +msgid "Galleries for %(show_month)s" +msgstr "" + +#: templates/photologue/gallery_archive_month.html:16 +#: templates/photologue/photo_archive_month.html:16 +msgid "Filter by day" +msgstr "" + +#: templates/photologue/gallery_archive_month.html:35 +#, fuzzy +msgid "View all galleries for year" +msgstr "View all galleries" + +#: templates/photologue/gallery_archive_year.html:4 +#: templates/photologue/gallery_archive_year.html:9 +#, python-format +msgid "Galleries for %(show_year)s" +msgstr "" + +#: templates/photologue/gallery_archive_year.html:16 +#: templates/photologue/photo_archive_year.html:17 +msgid "Filter by month" +msgstr "" + +#: templates/photologue/gallery_archive_year.html:35 +#: templates/photologue/gallery_detail.html:17 +msgid "View all galleries" +msgstr "View all galleries" + +#: templates/photologue/gallery_detail.html:10 +#: templates/photologue/gallery_list.html:16 +#: templates/photologue/includes/gallery_sample.html:8 +#: templates/photologue/photo_detail.html:10 +msgid "Published" +msgstr "Published" + +#: templates/photologue/gallery_list.html:4 +#: templates/photologue/gallery_list.html:9 +#, fuzzy +msgid "All galleries" +msgstr "All Galleries" + +#: templates/photologue/includes/paginator.html:6 +#: templates/photologue/includes/paginator.html:8 +msgid "Previous" +msgstr "Previous" + +#: templates/photologue/includes/paginator.html:11 +#, fuzzy, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" + +#: templates/photologue/includes/paginator.html:16 +#: templates/photologue/includes/paginator.html:18 +msgid "Next" +msgstr "Next" + +#: templates/photologue/photo_archive.html:4 +#: templates/photologue/photo_archive.html:9 +#, fuzzy +msgid "Latest photos" +msgstr "Latest Photo Galleries" + +#: templates/photologue/photo_archive.html:34 +#: templates/photologue/photo_archive_day.html:21 +#: templates/photologue/photo_archive_month.html:36 +#: templates/photologue/photo_archive_year.html:37 +#: templates/photologue/photo_list.html:21 +#, fuzzy +msgid "No photos were found" +msgstr "No galleries were found" + +#: templates/photologue/photo_archive_day.html:4 +#: templates/photologue/photo_archive_day.html:9 +#, python-format +msgid "Photos for %(show_day)s" +msgstr "" + +#: templates/photologue/photo_archive_day.html:24 +msgid "View all photos for month" +msgstr "" + +#: templates/photologue/photo_archive_month.html:4 +#: templates/photologue/photo_archive_month.html:9 +#, python-format +msgid "Photos for %(show_month)s" +msgstr "" + +#: templates/photologue/photo_archive_month.html:39 +msgid "View all photos for year" +msgstr "" + +#: templates/photologue/photo_archive_year.html:4 +#: templates/photologue/photo_archive_year.html:10 +#, python-format +msgid "Photos for %(show_year)s" +msgstr "" + +#: templates/photologue/photo_archive_year.html:40 +#, fuzzy +msgid "View all photos" +msgstr "View all galleries" + +#: templates/photologue/photo_detail.html:22 +msgid "This photo is found in the following galleries" +msgstr "This photo is found in the following galleries" + +#: templates/photologue/photo_list.html:4 +#: templates/photologue/photo_list.html:9 +#, fuzzy +msgid "All photos" +msgstr "photos" + +#, fuzzy +#~ msgid "" +#~ "All uploaded photos will be given a title made up of this title + a " +#~ "sequential number." +#~ msgstr "" +#~ "All photos in the gallery will be given a title made up of the gallery " +#~ "title + a sequential number." + +#~ msgid "Separate tags with spaces, put quotes around multiple-word tags." +#~ msgstr "Separate tags with spaces, put quotes around multiple-word tags." + +#~ msgid "Django-tagging was not found, tags will be treated as plain text." +#~ msgstr "Django-tagging was not found, tags will be treated as plain text." + +#~ msgid "tags" +#~ msgstr "tags" + +#~ msgid "images file (.zip)" +#~ msgstr "images file (.zip)" + +#~ msgid "gallery upload" +#~ msgstr "gallery upload" + +#~ msgid "gallery uploads" +#~ msgstr "gallery uploads" diff --git a/photologue/locale/es_ES/LC_MESSAGES/django.mo b/photologue/locale/es_ES/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..cd509dc9601d8360141162179fc8419edf6e4af1 GIT binary patch literal 14861 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, 2014 +# dmalisani , 2014 +# Rafa Muñoz Cárdenas , 2009 +# salvador ortiz , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-09-03 21:22+0000\n" +"PO-Revision-Date: 2017-12-03 14:46+0000\n" +"Last-Translator: Richard Barran \n" +"Language-Team: Spanish (Spain) (http://www.transifex.com/richardbarran/django-photologue/language/es_ES/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_ES\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: admin.py:61 +#, python-format +msgid "" +"The following photo does not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgid_plural "" +"The following photos do not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgstr[0] "" +msgstr[1] "" + +#: admin.py:73 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "La galería ha sido agregada exitosamente a %(site)s" +msgstr[1] "Las galerías han sido agregadas exitosamente a %(site)s" + +#: admin.py:80 +msgid "Add selected galleries to the current site" +msgstr "Agregar galerías al sitio" + +#: admin.py:86 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "La galería ha sido eliminada correctamente de %(site)s" +msgstr[1] "Las galerías seleccionadas han sido eliminadas correctamente de %(site)s" + +#: admin.py:93 +msgid "Remove selected galleries from the current site" +msgstr "Eliminar las galerías seleccionadas del sitio actual" + +#: admin.py:100 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "Todas las fotos en la galería %(galleries)s han sido correctamente agregadas a %(site)s" +msgstr[1] "Todas las fotos en las galerías %(galleries)s han sido correctamente agregadas a %(site)s" + +#: admin.py:108 +msgid "Add all photos of selected galleries to the current site" +msgstr "Agregar todas las fotos de las galerías seleccionadas al sitio actual" + +#: admin.py:115 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "Todas las fotos en la galería %(galleries)s han sido correctamente eliminadas de %(site)s" +msgstr[1] "Todas las fotos en las galerías %(galleries)s han sido correctamente eliminadas de %(site)s" + +#: admin.py:123 +msgid "Remove all photos in selected galleries from the current site" +msgstr "Eliminar todas las fotos seleccionadas en las galerías del sito actual" + +#: admin.py:164 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "La foto a sido agregada correctamente a %(site)s" +msgstr[1] "Las fotos seleccionadas han sido agregadas correctamente a %(site)s" + +#: admin.py:171 +msgid "Add selected photos to the current site" +msgstr "Agregar las fotos seleccionadas al sitio actual" + +#: admin.py:177 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "" +"The selected photos have been successfully removed from %(site)s" +msgstr[0] "La foto ha sido eliminada correctamente de %(site)s" +msgstr[1] "Las fotos han sido correctamente eliminadas de %(site)s" + +#: admin.py:184 +msgid "Remove selected photos from the current site" +msgstr "Eliminar la foto seleccionada del sitio actual" + +#: admin.py:198 templates/admin/photologue/photo/upload_zip.html:27 +msgid "Upload a zip archive of photos" +msgstr "Subir un archivo ZIP de fotos" + +#: forms.py:27 +#| msgid "title" +msgid "Title" +msgstr "Titulo" + +#: forms.py:30 +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number.
This field is required if creating a new gallery, but " +"is optional when adding to an existing gallery - if not supplied, the photo " +"titles will be creating from the existing gallery name." +msgstr "" + +#: forms.py:36 +#| msgid "gallery" +msgid "Gallery" +msgstr "Galería" + +#: forms.py:38 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "Seleccione una galería para agregarle estas imágenes. Déjelo vacío para crear una nueva galería a partir de este título." + +#: forms.py:40 +#| msgid "caption" +msgid "Caption" +msgstr "Pie de foto" + +#: forms.py:42 +msgid "Caption will be added to all photos." +msgstr "El pie de foto se añadirá a todas las fotos." + +#: forms.py:43 +#| msgid "description" +msgid "Description" +msgstr "Descripción" + +#: forms.py:45 +#| msgid "A description of this Gallery." +msgid "A description of this Gallery. Only required for new galleries." +msgstr "Una descripción para esta galería. Solo es requerido para nuevas galerías." + +#: forms.py:46 +#| msgid "is public" +msgid "Is public" +msgstr "Es público" + +#: forms.py:49 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "Desactive esto para hacer que la galería subida y fotos incluidas sean privadas." + +#: forms.py:72 +msgid "A gallery with that title already exists." +msgstr "Ya existe una galería con ese título." + +#: forms.py:82 +#| msgid "Select a .zip file of images to upload into a new Gallery." +msgid "Select an existing gallery, or enter a title for a new gallery." +msgstr "Seleccione una galería existente o ingrese un nuevo nombre para la galería." + +#: forms.py:115 +#, python-brace-format +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "Ignorando archivos \"{filename}\" por estar en subcarpetas, todas las imágenes deben estar en la carpeta de primer nivel del zip." + +#: forms.py:156 +#, python-brace-format +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "No se pudo procesar el archivo \"{0}\" en el archivo zip." + +#: forms.py:172 +#, python-brace-format +msgid "The photos have been added to gallery \"{0}\"." +msgstr "La foto a sido agregada correctamente a \"{0}\"." + +#: models.py:98 +msgid "Very Low" +msgstr "Muy bajo" + +#: models.py:99 +msgid "Low" +msgstr "Bajo" + +#: models.py:100 +msgid "Medium-Low" +msgstr "Medio-bajo" + +#: models.py:101 +msgid "Medium" +msgstr "Medio" + +#: models.py:102 +msgid "Medium-High" +msgstr "Medio-alto" + +#: models.py:103 +msgid "High" +msgstr "Alto" + +#: models.py:104 +msgid "Very High" +msgstr "Muy alto" + +#: models.py:109 +msgid "Top" +msgstr "Arriba" + +#: models.py:110 +msgid "Right" +msgstr "Derecha" + +#: models.py:111 +msgid "Bottom" +msgstr "Abajo" + +#: models.py:112 +msgid "Left" +msgstr "Izquierda" + +#: models.py:113 +msgid "Center (Default)" +msgstr "Centro (por defecto)" + +#: models.py:117 +msgid "Flip left to right" +msgstr "Voltear de izquerda a derecha" + +#: models.py:118 +msgid "Flip top to bottom" +msgstr "Voltear de arriba a abajo" + +#: models.py:119 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Rotar 90 grados en sentido horario" + +#: models.py:120 +msgid "Rotate 90 degrees clockwise" +msgstr "Rotar 90 grados en sentido antihorario" + +#: models.py:121 +msgid "Rotate 180 degrees" +msgstr "Rotar 180 grados" + +#: models.py:125 +msgid "Tile" +msgstr "Mosaico" + +#: models.py:126 +msgid "Scale" +msgstr "Escalar" + +#: models.py:136 +#, python-format +msgid "" +"Chain multiple filters using the following pattern " +"\"FILTER_ONE->FILTER_TWO->FILTER_THREE\". Image filters will be applied in " +"order. The following filters are available: %s." +msgstr "Encadene múltiples filtros usando el siguiente patrón \"FILTRO_UNO->FILTRO_DOS->FILTRO_TRES\". Los filtros de imagen se aplicarán en orden. Los siguientes filtros están disponibles: %s." + +#: models.py:158 +msgid "date published" +msgstr "fecha de publicación" + +#: models.py:160 models.py:513 +msgid "title" +msgstr "título" + +#: models.py:163 +msgid "title slug" +msgstr "título slug" + +#: models.py:166 models.py:519 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "Un \"slug\" es un único título URL-amigable para un objeto." + +#: models.py:167 models.py:596 +msgid "description" +msgstr "descripción" + +#: models.py:169 models.py:524 +msgid "is public" +msgstr "es público" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Las galerías públicas serán mostradas en las vistas por defecto." + +#: models.py:175 models.py:536 +msgid "photos" +msgstr "fotos" + +#: models.py:177 models.py:527 +msgid "sites" +msgstr "sitios" + +#: models.py:185 +msgid "gallery" +msgstr "galería" + +#: models.py:186 +msgid "galleries" +msgstr "galerías" + +#: models.py:224 +msgid "count" +msgstr "contar" + +#: models.py:240 models.py:741 +msgid "image" +msgstr "imagen" + +#: models.py:243 +msgid "date taken" +msgstr "fecha en la que se tomó" + +#: models.py:246 +msgid "Date image was taken; is obtained from the image EXIF data." +msgstr "La fecha de la imagen fue obtenida por información EXIF de la imagen." + +#: models.py:247 +msgid "view count" +msgstr "Contador de visitas" + +#: models.py:250 +msgid "crop from" +msgstr "Recortar desde" + +#: models.py:259 +msgid "effect" +msgstr "efecto" + +#: models.py:279 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "El tamaño de foto de \"miniatura de admin\" no ha sido definido." + +#: models.py:286 +msgid "Thumbnail" +msgstr "Miniatura" + +#: models.py:516 +msgid "slug" +msgstr "slug" + +#: models.py:520 +msgid "caption" +msgstr "pie de foto" + +#: models.py:522 +msgid "date added" +msgstr "fecha añadida" + +#: models.py:526 +msgid "Public photographs will be displayed in the default views." +msgstr "Las fotos públicas serán mostradas en las vistas por defecto." + +#: models.py:535 +msgid "photo" +msgstr "foto" + +#: models.py:593 models.py:771 +msgid "name" +msgstr "nombre" + +#: models.py:672 +msgid "rotate or flip" +msgstr "rotar o voltear" + +#: models.py:676 models.py:704 +msgid "color" +msgstr "color" + +#: models.py:678 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "Un factor de 0.0 proporciona una imagen blanca y negra. Un factor de 1.0 proporciona la imagen original." + +#: models.py:680 +msgid "brightness" +msgstr "iluminación" + +#: models.py:682 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "Un factor de 0.0 proporciona una imagen negra. Un factor de 1.0 proporciona la imagen original." + +#: models.py:684 +msgid "contrast" +msgstr "contraste" + +#: models.py:686 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original" +" image." +msgstr "Un factor de 0.0 proporciona una imagen sólida gris. Un factor de 1.0 proporciona la imagen original." + +#: models.py:688 +msgid "sharpness" +msgstr "Resaltado" + +#: models.py:690 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "Un factor de 0.0 proporciona una imagen desenfocada, un factor de 1.0 proporciona la imagen original." + +#: models.py:692 +msgid "filters" +msgstr "filtros" + +#: models.py:696 +msgid "size" +msgstr "tamaño" + +#: models.py:698 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "La altura de la reflexión como porcentaje de la imagen original. Un factor de 0.0 no da ninguna reflexión, un factor de 1.0 añade una reflexión igual a la altura de la imagen original." + +#: models.py:701 +msgid "strength" +msgstr "fortaleza" + +#: models.py:703 +msgid "The initial opacity of the reflection gradient." +msgstr "La opacidad inicial del gradiente de reflexión." + +#: models.py:707 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "El color de fondo del gradiente de reflexión. Establezca esto para hacer coincidir el color de fondo con el color de tu página." + +#: models.py:711 models.py:815 +msgid "photo effect" +msgstr "efecto de foto" + +#: models.py:712 +msgid "photo effects" +msgstr "efectos de foto" + +#: models.py:743 +msgid "style" +msgstr "estilo" + +#: models.py:747 +msgid "opacity" +msgstr "opacidad" + +#: models.py:749 +msgid "The opacity of the overlay." +msgstr "La opacidad de la superposición" + +#: models.py:752 +msgid "watermark" +msgstr "marca de agua" + +#: models.py:753 +msgid "watermarks" +msgstr "marcas de agua" + +#: models.py:775 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "El nombre del tamaño solo puede contener letras, números y subrayados. Por ejemplo:\"miniaturas\", \"muestra\", \"muestra_principal\"." + +#: models.py:782 +msgid "width" +msgstr "anchura" + +#: models.py:785 +msgid "If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "Si la anchura se establece a \"0\" la imagen será escalada hasta la altura proporcionada" + +#: models.py:786 +msgid "height" +msgstr "altura" + +#: models.py:789 +msgid "If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "Si la altura se establece a \"0\" la imagen será escalada hasta la anchura proporcionada" + +#: models.py:790 +msgid "quality" +msgstr "calidad" + +#: models.py:793 +msgid "JPEG image quality." +msgstr "Calidad de imagen JPEG." + +#: models.py:794 +msgid "upscale images?" +msgstr "¿Aumentar imágenes?" + +#: models.py:796 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "Si se selecciona la imagen será aumentada si es necesario para ajustarse a las dimensiones proporcionadas. Los tamaños recortados serán aumentados de acuerdo a esta opción." + +#: models.py:800 +msgid "crop to fit?" +msgstr "¿Recortar hasta ajustar?" + +#: models.py:802 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "Si se selecciona la imagen será escalada y recortada para ajustarse a las dimensiones proporcionadas." + +#: models.py:804 +msgid "pre-cache?" +msgstr "¿pre-cachear?" + +#: models.py:806 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "Si se selecciona, este tamaño de foto será pre-cacheado cuando se añadan nuevas fotos." + +#: models.py:807 +msgid "increment view count?" +msgstr "¿incrementar contador de visualizaciones?" + +#: models.py:809 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "Si se selecciona el \"contador de visualizaciones\" se incrementará cuando esta foto sea visualizada." + +#: models.py:821 +msgid "watermark image" +msgstr "marca de agua" + +#: models.py:826 +msgid "photo size" +msgstr "tamaño de foto" + +#: models.py:827 +msgid "photo sizes" +msgstr "tamaños de foto" + +#: models.py:844 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "Solo puede recortar las fotos si ancho y alto están establecidos." + +#: templates/admin/photologue/photo/change_list.html:9 +msgid "Upload a zip archive" +msgstr "Subir archivo ZIP" + +#: templates/admin/photologue/photo/upload_zip.html:15 +msgid "Home" +msgstr "Inicio" + +#: templates/admin/photologue/photo/upload_zip.html:19 +#: templates/admin/photologue/photo/upload_zip.html:53 +msgid "Upload" +msgstr "Subir" + +#: templates/admin/photologue/photo/upload_zip.html:28 +msgid "" +"\n" +"\t\t

On this page you can upload many photos at once, as long as you have\n" +"\t\tput them all in a zip archive. The photos can be either:

\n" +"\t\t
    \n" +"\t\t\t
  • Added to an existing gallery.
  • \n" +"\t\t\t
  • Otherwise, a new gallery is created with the supplied title.
  • \n" +"\t\t
\n" +"\t" +msgstr "\n\t\t

En esta página puedes subir las fotos que gustes al mismo tiempo, siemprew y cuando tengas\n\t\tponer todas en un archivo zip. las fotos pueden ser:

\n\t\t
    \n\t\t\t
  • Agregadas a una galería existente.
  • \n\t\t\t
  • O, crear una nueva galería con un titulo.
  • \n\t\t
\n\t" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the error below." +msgstr "Favor de corregir los errores." + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the errors below." +msgstr "Favor de corregir los errores." + +#: templates/photologue/gallery_archive.html:4 +#: templates/photologue/gallery_archive.html:9 +msgid "Latest photo galleries" +msgstr "Fotos de galerías mas recientes" + +#: templates/photologue/gallery_archive.html:16 +#: templates/photologue/photo_archive.html:16 +msgid "Filter by year" +msgstr "Filtrar por año" + +#: templates/photologue/gallery_archive.html:32 +#: templates/photologue/gallery_list.html:26 +msgid "No galleries were found" +msgstr "No se encontraron galerías" + +#: templates/photologue/gallery_archive_day.html:4 +#: templates/photologue/gallery_archive_day.html:9 +#, python-format +msgid "Galleries for %(show_day)s" +msgstr "Galerías por %(show_day)s" + +#: templates/photologue/gallery_archive_day.html:18 +#: templates/photologue/gallery_archive_month.html:32 +#: templates/photologue/gallery_archive_year.html:32 +msgid "No galleries were found." +msgstr "No se encontraron galerías" + +#: templates/photologue/gallery_archive_day.html:22 +msgid "View all galleries for month" +msgstr "Ver todas las galerías por mes" + +#: templates/photologue/gallery_archive_month.html:4 +#: templates/photologue/gallery_archive_month.html:9 +#, python-format +msgid "Galleries for %(show_month)s" +msgstr "Galerías para %(show_month)s" + +#: templates/photologue/gallery_archive_month.html:16 +#: templates/photologue/photo_archive_month.html:16 +msgid "Filter by day" +msgstr "Filtrar por día" + +#: templates/photologue/gallery_archive_month.html:35 +msgid "View all galleries for year" +msgstr "Ver todas las galerías por año" + +#: templates/photologue/gallery_archive_year.html:4 +#: templates/photologue/gallery_archive_year.html:9 +#, python-format +msgid "Galleries for %(show_year)s" +msgstr "Galerías por %(show_year)s" + +#: templates/photologue/gallery_archive_year.html:16 +#: templates/photologue/photo_archive_year.html:17 +msgid "Filter by month" +msgstr "Filtrar por mes" + +#: templates/photologue/gallery_archive_year.html:35 +#: templates/photologue/gallery_detail.html:17 +msgid "View all galleries" +msgstr "Ver todas las galerías" + +#: templates/photologue/gallery_detail.html:10 +#: templates/photologue/gallery_list.html:16 +#: templates/photologue/includes/gallery_sample.html:8 +#: templates/photologue/photo_detail.html:10 +msgid "Published" +msgstr "Publicado" + +#: templates/photologue/gallery_list.html:4 +#: templates/photologue/gallery_list.html:9 +msgid "All galleries" +msgstr "Todas las Galerías" + +#: templates/photologue/includes/paginator.html:6 +#: templates/photologue/includes/paginator.html:8 +msgid "Previous" +msgstr "Anterior" + +#: templates/photologue/includes/paginator.html:11 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "\n\t\t\t\t página %(page_number)s de %(total_pages)s\n\t\t\t\t" + +#: templates/photologue/includes/paginator.html:16 +#: templates/photologue/includes/paginator.html:18 +msgid "Next" +msgstr "Próximo" + +#: templates/photologue/photo_archive.html:4 +#: templates/photologue/photo_archive.html:9 +msgid "Latest photos" +msgstr "Fotos más recientes" + +#: templates/photologue/photo_archive.html:34 +#: templates/photologue/photo_archive_day.html:21 +#: templates/photologue/photo_archive_month.html:36 +#: templates/photologue/photo_archive_year.html:37 +#: templates/photologue/photo_list.html:21 +msgid "No photos were found" +msgstr "No se encontraron fotos" + +#: templates/photologue/photo_archive_day.html:4 +#: templates/photologue/photo_archive_day.html:9 +#, python-format +msgid "Photos for %(show_day)s" +msgstr "Fotos por %(show_day)s" + +#: templates/photologue/photo_archive_day.html:24 +msgid "View all photos for month" +msgstr "Ver todas las fotos por mes" + +#: templates/photologue/photo_archive_month.html:4 +#: templates/photologue/photo_archive_month.html:9 +#, python-format +msgid "Photos for %(show_month)s" +msgstr "Fotos por %(show_month)s" + +#: templates/photologue/photo_archive_month.html:39 +msgid "View all photos for year" +msgstr "Ver todas las fotos por año" + +#: templates/photologue/photo_archive_year.html:4 +#: templates/photologue/photo_archive_year.html:10 +#, python-format +msgid "Photos for %(show_year)s" +msgstr "Fotos por %(show_year)s" + +#: templates/photologue/photo_archive_year.html:40 +msgid "View all photos" +msgstr "Ver todas las fotos" + +#: templates/photologue/photo_detail.html:22 +msgid "This photo is found in the following galleries" +msgstr "Esta foto se encontró en las siguientes galerías" + +#: templates/photologue/photo_list.html:4 +#: templates/photologue/photo_list.html:9 +msgid "All photos" +msgstr "Todas las fotos" + +#~ msgid "" +#~ "All uploaded photos will be given a title made up of this title + a " +#~ "sequential number." +#~ msgstr "" +#~ "All photos in the gallery will be given a title made up of the gallery title" +#~ " + a sequential number." + +#~ msgid "Separate tags with spaces, put quotes around multiple-word tags." +#~ msgstr "Separate tags with spaces, put quotes around multiple-word tags." + +#~ msgid "Django-tagging was not found, tags will be treated as plain text." +#~ msgstr "Django-tagging was not found, tags will be treated as plain text." + +#~ msgid "tags" +#~ msgstr "tags" + +#~ msgid "images file (.zip)" +#~ msgstr "images file (.zip)" + +#~ msgid "gallery upload" +#~ msgstr "gallery upload" + +#~ msgid "gallery uploads" +#~ msgstr "gallery uploads" diff --git a/photologue/locale/eu/LC_MESSAGES/django.mo b/photologue/locale/eu/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..be85c019283e7ff8a4e25d0a183dbb3a318f6fff GIT binary patch literal 10240 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 literal 0 HcmV?d00001 diff --git a/photologue/locale/eu/LC_MESSAGES/django.po b/photologue/locale/eu/LC_MESSAGES/django.po new file mode 100644 index 0000000..5b903c2 --- /dev/null +++ b/photologue/locale/eu/LC_MESSAGES/django.po @@ -0,0 +1,764 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Translators: +# Urtzi Odriozola , 2016,2018 +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-09-03 21:22+0000\n" +"PO-Revision-Date: 2018-03-15 09:14+0000\n" +"Last-Translator: Urtzi Odriozola \n" +"Language-Team: Basque (http://www.transifex.com/richardbarran/django-photologue/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" + +#: admin.py:61 +#, python-format +msgid "" +"The following photo does not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgid_plural "" +"The following photos do not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgstr[0] "" +msgstr[1] "" + +#: admin.py:73 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "Galeria arrakastaz gehitu da %(site)s-(e)n" +msgstr[1] "Galeriak arrakastaz gehitu dira %(site)s-(e)n" + +#: admin.py:80 +msgid "Add selected galleries to the current site" +msgstr "Gehitu aukeratutako galeriak uneko webgunera" + +#: admin.py:86 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "Aukeratutako galeria arrakastaz ezabatu da %(site)s-(e)tik" +msgstr[1] "Aukeratutako galeriak arrakastaz ezabatu dira %(site)s-(e)tik" + +#: admin.py:93 +msgid "Remove selected galleries from the current site" +msgstr "Ezabatu aukeratutako galeriak uneko webgunetik" + +#: admin.py:100 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "%(galleries)s galeriako argazki guztiak arrakastaz gehitu dira %(site)s-(e)ra" +msgstr[1] "%(galleries)s galerietako argazki guztiak arrakastaz gehitu dira %(site)s-(e)ra" + +#: admin.py:108 +msgid "Add all photos of selected galleries to the current site" +msgstr "Gehitu aukeratutako gealerietako argazki guztiak uneko webgunera" + +#: admin.py:115 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "%(galleries)s galeriako argazki guztiak arrakastaz ezabatu dira %(site)s-(e)tik" +msgstr[1] "%(galleries)s galerietako argazki guztiak arrakastaz ezabatu dira %(site)s-(e)tik" + +#: admin.py:123 +msgid "Remove all photos in selected galleries from the current site" +msgstr "Ezabatu aukeratutako galeriako argazki guztiak uneko webgunetik " + +#: admin.py:164 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "Argazkia arrakastaz gehitu da %(site)s-(e)n" +msgstr[1] "Aukeratutako argazkiak arrakastaz gehitu dira %(site)s-(e)n" + +#: admin.py:171 +msgid "Add selected photos to the current site" +msgstr "Gehitu aukeratutako argazkiak uneko webgunera" + +#: admin.py:177 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "" +"The selected photos have been successfully removed from %(site)s" +msgstr[0] "Argazkia arrakastaz ezabatu da %(site)s-(e)tik" +msgstr[1] "Aukeratutako argazkiak arrakastaz ezabatu dira %(site)s-(e)tik" + +#: admin.py:184 +msgid "Remove selected photos from the current site" +msgstr "Ezabatu aukeratutako argazkiak uneko webgunetik." + +#: admin.py:198 templates/admin/photologue/photo/upload_zip.html:27 +msgid "Upload a zip archive of photos" +msgstr "Igo argazkien zip artxiboa" + +#: forms.py:27 +#| msgid "title" +msgid "Title" +msgstr "Izenburua" + +#: forms.py:30 +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number.
This field is required if creating a new gallery, but " +"is optional when adding to an existing gallery - if not supplied, the photo " +"titles will be creating from the existing gallery name." +msgstr "" + +#: forms.py:36 +#| msgid "gallery" +msgid "Gallery" +msgstr "Galeria" + +#: forms.py:38 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "Aukeratu irudi hau gehitzeko galeria. Utzi hau hutsik emandako izenburutik galeria berri bat sortzeko." + +#: forms.py:40 +#| msgid "caption" +msgid "Caption" +msgstr "Irudi testua" + +#: forms.py:42 +msgid "Caption will be added to all photos." +msgstr "Irudi testua argazki guztiei gehituko zaie." + +#: forms.py:43 +#| msgid "description" +msgid "Description" +msgstr "Deskribapena" + +#: forms.py:45 +#| msgid "A description of this Gallery." +msgid "A description of this Gallery. Only required for new galleries." +msgstr "Galeria honen deskribapena. Galeria berrientzat bakarrik da beharrezkoa." + +#: forms.py:46 +#| msgid "is public" +msgid "Is public" +msgstr "Publikoa da" + +#: forms.py:49 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "Ez markatu hau igotako galeria eta bertako argazkiak pribatu izatea nahi baduzu." + +#: forms.py:72 +msgid "A gallery with that title already exists." +msgstr "Izenburu hori duen galeria existitzen da." + +#: forms.py:82 +#| msgid "Select a .zip file of images to upload into a new Gallery." +msgid "Select an existing gallery, or enter a title for a new gallery." +msgstr "Aukeratu existitzen den galeria edo sartu galeria berri baten izenburua." + +#: forms.py:115 +#, python-brace-format +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "" + +#: forms.py:156 +#, python-brace-format +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "Ezin izan da .zip artxiboko \"{0}\" fitxategia prozesatu." + +#: forms.py:172 +#, python-brace-format +msgid "The photos have been added to gallery \"{0}\"." +msgstr "Argazkiak \"{0}\" galeriara gehitu dira." + +#: models.py:98 +msgid "Very Low" +msgstr "Oso baxua" + +#: models.py:99 +msgid "Low" +msgstr "Baxua" + +#: models.py:100 +msgid "Medium-Low" +msgstr "Ertaina-Baxua" + +#: models.py:101 +msgid "Medium" +msgstr "Ertaina" + +#: models.py:102 +msgid "Medium-High" +msgstr "Ertaina-Altua" + +#: models.py:103 +msgid "High" +msgstr "Altua" + +#: models.py:104 +msgid "Very High" +msgstr "Oso altua" + +#: models.py:109 +msgid "Top" +msgstr "Goia" + +#: models.py:110 +msgid "Right" +msgstr "Eskuina" + +#: models.py:111 +msgid "Bottom" +msgstr "Behea" + +#: models.py:112 +msgid "Left" +msgstr "Ezkerra" + +#: models.py:113 +msgid "Center (Default)" +msgstr "Erdia (Lehenetsia)" + +#: models.py:117 +msgid "Flip left to right" +msgstr "Itzuli eskerretik eskuinera" + +#: models.py:118 +msgid "Flip top to bottom" +msgstr "Itzuli goitik behera" + +#: models.py:119 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Biratu 90 gradu erlojuaren kontrako norantzan" + +#: models.py:120 +msgid "Rotate 90 degrees clockwise" +msgstr "Biratu 90 gradu erloju norantzan" + +#: models.py:121 +msgid "Rotate 180 degrees" +msgstr "Biratu 180 gradu" + +#: models.py:125 +msgid "Tile" +msgstr "Lauza" + +#: models.py:126 +msgid "Scale" +msgstr "Tamaina" + +#: models.py:136 +#, python-format +msgid "" +"Chain multiple filters using the following pattern " +"\"FILTER_ONE->FILTER_TWO->FILTER_THREE\". Image filters will be applied in " +"order. The following filters are available: %s." +msgstr "" + +#: models.py:158 +msgid "date published" +msgstr "argitaratze data" + +#: models.py:160 models.py:513 +msgid "title" +msgstr "izenburua" + +#: models.py:163 +msgid "title slug" +msgstr "izenburuaren sluga" + +#: models.py:166 models.py:519 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "" + +#: models.py:167 models.py:596 +msgid "description" +msgstr "deskribapena" + +#: models.py:169 models.py:524 +msgid "is public" +msgstr "publikoa da" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "" + +#: models.py:175 models.py:536 +msgid "photos" +msgstr "argazkiak" + +#: models.py:177 models.py:527 +msgid "sites" +msgstr "webguneak" + +#: models.py:185 +msgid "gallery" +msgstr "galeria" + +#: models.py:186 +msgid "galleries" +msgstr "galeriak" + +#: models.py:224 +msgid "count" +msgstr "zenbatu" + +#: models.py:240 models.py:741 +msgid "image" +msgstr "irudia" + +#: models.py:243 +msgid "date taken" +msgstr "" + +#: models.py:246 +msgid "Date image was taken; is obtained from the image EXIF data." +msgstr "Irudia atera zeneko data; irudiaren EXIF datutik hartzen da." + +#: models.py:247 +msgid "view count" +msgstr "" + +#: models.py:250 +msgid "crop from" +msgstr "moztu hemendik" + +#: models.py:259 +msgid "effect" +msgstr "efektua" + +#: models.py:279 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "" + +#: models.py:286 +msgid "Thumbnail" +msgstr "" + +#: models.py:516 +msgid "slug" +msgstr "slug" + +#: models.py:520 +msgid "caption" +msgstr "irudi testua" + +#: models.py:522 +msgid "date added" +msgstr "" + +#: models.py:526 +msgid "Public photographs will be displayed in the default views." +msgstr "" + +#: models.py:535 +msgid "photo" +msgstr "argazkia" + +#: models.py:593 models.py:771 +msgid "name" +msgstr "izena" + +#: models.py:672 +msgid "rotate or flip" +msgstr "biratu edo itzuli" + +#: models.py:676 models.py:704 +msgid "color" +msgstr "kolorea" + +#: models.py:678 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "" + +#: models.py:680 +msgid "brightness" +msgstr "dizdira" + +#: models.py:682 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "" + +#: models.py:684 +msgid "contrast" +msgstr "kontrastea" + +#: models.py:686 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original" +" image." +msgstr "" + +#: models.py:688 +msgid "sharpness" +msgstr "zorroztasuna" + +#: models.py:690 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "" + +#: models.py:692 +msgid "filters" +msgstr "filtroak" + +#: models.py:696 +msgid "size" +msgstr "tamaina" + +#: models.py:698 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "" + +#: models.py:701 +msgid "strength" +msgstr "indarra" + +#: models.py:703 +msgid "The initial opacity of the reflection gradient." +msgstr "" + +#: models.py:707 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "" + +#: models.py:711 models.py:815 +msgid "photo effect" +msgstr "argazki efektua" + +#: models.py:712 +msgid "photo effects" +msgstr "argazki efektuak" + +#: models.py:743 +msgid "style" +msgstr "estiloa" + +#: models.py:747 +msgid "opacity" +msgstr "opakutasun" + +#: models.py:749 +msgid "The opacity of the overlay." +msgstr "Estalkiaren opakutasuna." + +#: models.py:752 +msgid "watermark" +msgstr "ur marka" + +#: models.py:753 +msgid "watermarks" +msgstr "ur markak" + +#: models.py:775 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "Irudiaren tamaina izenak hizkiak, zenbakiak eta beheko marrak bakarrik izan ditzake. Adibidez: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." + +#: models.py:782 +msgid "width" +msgstr "zabalera" + +#: models.py:785 +msgid "If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "Zabaleran \"0\" jarriz gero, irudiaren tamaina altueraren arabera ezarriko da." + +#: models.py:786 +msgid "height" +msgstr "altuera" + +#: models.py:789 +msgid "If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "Altueran \"0\" jarriz gero, irudiaren tamaina zabaleraren arabera ezarriko da." + +#: models.py:790 +msgid "quality" +msgstr "kalitatea" + +#: models.py:793 +msgid "JPEG image quality." +msgstr "JPEG irudi kalitatea." + +#: models.py:794 +msgid "upscale images?" +msgstr "irudiak handitu?" + +#: models.py:796 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "" + +#: models.py:800 +msgid "crop to fit?" +msgstr "neurrira moztu?" + +#: models.py:802 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "" + +#: models.py:804 +msgid "pre-cache?" +msgstr "aurrez katxeatu?" + +#: models.py:806 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "" + +#: models.py:807 +msgid "increment view count?" +msgstr "ikustaldi kopurua zenbatu?" + +#: models.py:809 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "" + +#: models.py:821 +msgid "watermark image" +msgstr "jarri ur marka irudiari" + +#: models.py:826 +msgid "photo size" +msgstr "argazki tamaina" + +#: models.py:827 +msgid "photo sizes" +msgstr "argazki tamainak" + +#: models.py:844 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "Zabalera eta altuera definituta badaude bakarrik moztu daitezke irudiak." + +#: templates/admin/photologue/photo/change_list.html:9 +msgid "Upload a zip archive" +msgstr "Igo zip fitxategia" + +#: templates/admin/photologue/photo/upload_zip.html:15 +msgid "Home" +msgstr "Sarrera" + +#: templates/admin/photologue/photo/upload_zip.html:19 +#: templates/admin/photologue/photo/upload_zip.html:53 +msgid "Upload" +msgstr "Igo" + +#: templates/admin/photologue/photo/upload_zip.html:28 +msgid "" +"\n" +"\t\t

On this page you can upload many photos at once, as long as you have\n" +"\t\tput them all in a zip archive. The photos can be either:

\n" +"\t\t
    \n" +"\t\t\t
  • Added to an existing gallery.
  • \n" +"\t\t\t
  • Otherwise, a new gallery is created with the supplied title.
  • \n" +"\t\t
\n" +"\t" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the error below." +msgstr "Mesedez zuzendu beheko errorea." + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the errors below." +msgstr "Mesedez zuzendu beheko erroreak." + +#: templates/photologue/gallery_archive.html:4 +#: templates/photologue/gallery_archive.html:9 +msgid "Latest photo galleries" +msgstr "Azken argazki galeriak" + +#: templates/photologue/gallery_archive.html:16 +#: templates/photologue/photo_archive.html:16 +msgid "Filter by year" +msgstr "Filtratu urteka" + +#: templates/photologue/gallery_archive.html:32 +#: templates/photologue/gallery_list.html:26 +msgid "No galleries were found" +msgstr "Ez da galeriarik aurkitu" + +#: templates/photologue/gallery_archive_day.html:4 +#: templates/photologue/gallery_archive_day.html:9 +#, python-format +msgid "Galleries for %(show_day)s" +msgstr "Galeriak %(show_day)s egunetan" + +#: templates/photologue/gallery_archive_day.html:18 +#: templates/photologue/gallery_archive_month.html:32 +#: templates/photologue/gallery_archive_year.html:32 +msgid "No galleries were found." +msgstr "Ez da galeriarik aurkitu." + +#: templates/photologue/gallery_archive_day.html:22 +msgid "View all galleries for month" +msgstr "Ikusi hilabeteko galeria guztiak" + +#: templates/photologue/gallery_archive_month.html:4 +#: templates/photologue/gallery_archive_month.html:9 +#, python-format +msgid "Galleries for %(show_month)s" +msgstr "Galeriak %(show_month)s hilabetetan" + +#: templates/photologue/gallery_archive_month.html:16 +#: templates/photologue/photo_archive_month.html:16 +msgid "Filter by day" +msgstr "Filtratu eguneka" + +#: templates/photologue/gallery_archive_month.html:35 +msgid "View all galleries for year" +msgstr "Ikusi urteko galeria guztiak" + +#: templates/photologue/gallery_archive_year.html:4 +#: templates/photologue/gallery_archive_year.html:9 +#, python-format +msgid "Galleries for %(show_year)s" +msgstr "Galeriak %(show_year)s urtetan" + +#: templates/photologue/gallery_archive_year.html:16 +#: templates/photologue/photo_archive_year.html:17 +msgid "Filter by month" +msgstr "Filtratu hilabeteka" + +#: templates/photologue/gallery_archive_year.html:35 +#: templates/photologue/gallery_detail.html:17 +msgid "View all galleries" +msgstr "Ikusi galeria guztiak" + +#: templates/photologue/gallery_detail.html:10 +#: templates/photologue/gallery_list.html:16 +#: templates/photologue/includes/gallery_sample.html:8 +#: templates/photologue/photo_detail.html:10 +msgid "Published" +msgstr "Argitaratuta" + +#: templates/photologue/gallery_list.html:4 +#: templates/photologue/gallery_list.html:9 +msgid "All galleries" +msgstr "Galeria guztiak" + +#: templates/photologue/includes/paginator.html:6 +#: templates/photologue/includes/paginator.html:8 +msgid "Previous" +msgstr "Aurrekoa" + +#: templates/photologue/includes/paginator.html:11 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "\n\t\t\t\t %(page_number)s/%(total_pages)s orri\n\t\t\t\t" + +#: templates/photologue/includes/paginator.html:16 +#: templates/photologue/includes/paginator.html:18 +msgid "Next" +msgstr "Hurrengoa" + +#: templates/photologue/photo_archive.html:4 +#: templates/photologue/photo_archive.html:9 +msgid "Latest photos" +msgstr "Azken argazkiak" + +#: templates/photologue/photo_archive.html:34 +#: templates/photologue/photo_archive_day.html:21 +#: templates/photologue/photo_archive_month.html:36 +#: templates/photologue/photo_archive_year.html:37 +#: templates/photologue/photo_list.html:21 +msgid "No photos were found" +msgstr "Ez da argazkirik aurkitu" + +#: templates/photologue/photo_archive_day.html:4 +#: templates/photologue/photo_archive_day.html:9 +#, python-format +msgid "Photos for %(show_day)s" +msgstr "Argazkiak %(show_day)s egunetan" + +#: templates/photologue/photo_archive_day.html:24 +msgid "View all photos for month" +msgstr "Ikusi hilabeteko argazki guztiak" + +#: templates/photologue/photo_archive_month.html:4 +#: templates/photologue/photo_archive_month.html:9 +#, python-format +msgid "Photos for %(show_month)s" +msgstr "Argazkiak %(show_month)s hilabetetan" + +#: templates/photologue/photo_archive_month.html:39 +msgid "View all photos for year" +msgstr "Ikusi urteko argazki guztiak" + +#: templates/photologue/photo_archive_year.html:4 +#: templates/photologue/photo_archive_year.html:10 +#, python-format +msgid "Photos for %(show_year)s" +msgstr "Argazkiak %(show_year)s urtetan" + +#: templates/photologue/photo_archive_year.html:40 +msgid "View all photos" +msgstr "Ikusi argazki guztiak" + +#: templates/photologue/photo_detail.html:22 +msgid "This photo is found in the following galleries" +msgstr "Argazki hau ondorengo galerietan aurkitu da" + +#: templates/photologue/photo_list.html:4 +#: templates/photologue/photo_list.html:9 +msgid "All photos" +msgstr "Argazki guztiak" + +#~ msgid "" +#~ "All uploaded photos will be given a title made up of this title + a " +#~ "sequential number." +#~ msgstr "" +#~ "All photos in the gallery will be given a title made up of the gallery title" +#~ " + a sequential number." + +#~ msgid "Separate tags with spaces, put quotes around multiple-word tags." +#~ msgstr "Separate tags with spaces, put quotes around multiple-word tags." + +#~ msgid "Django-tagging was not found, tags will be treated as plain text." +#~ msgstr "Django-tagging was not found, tags will be treated as plain text." + +#~ msgid "tags" +#~ msgstr "tags" + +#~ msgid "images file (.zip)" +#~ msgstr "images file (.zip)" + +#~ msgid "gallery upload" +#~ msgstr "gallery upload" + +#~ msgid "gallery uploads" +#~ msgstr "gallery uploads" diff --git a/photologue/locale/fr/LC_MESSAGES/django.mo b/photologue/locale/fr/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..1491dbf5f3af574244af50fe4ace33cc2faf33c9 GIT binary patch literal 16491 zcmcJWdypJQea9Ox1`BNP1M`OQVfpm9y_1Bo<R@S_nk-gue*Q!dv>qBea&SbFkBy`ynynh%Z&LN__{0j!}W!y8}l;oi{O<{ zFyfQAVW7l0qMeA_AH0b2A{|CCQ$sD0G|)eg6jA6AS^R) z_4rQk0M8GBli=6E_ktU)H|EvgpMd+o>z-}QLGT{12|f&p z{oDyY2|Nyp57VIL^D0pMYl5nG285(p0QqO$!yl$*J_0@feiqdCz0Wm2J^lfg$o@$)C3`1Vx(yac=v z)b~T+DexF5dHM_(fjB2k$s{K_rIDR|_)Vyv0B^Nh? z8pmCr zO5Q#Ks^3rf_kRki{a=C_=a)gz{}w2E-v`ytzj^!*Q1kw&|NaY)PewS@&(lEh@p}J! z6DWFH{resM{mVhozZ-nV6O4HcxR2)_+-OY5^XB!&O!55go18v=2YjvQ3_JVu5IDp0 z_x$s18=Sp*Hz;}hH26~Rzrbza=8aB2UkhTAOb&h)d;t7BxOWq}O21FsjBVt34?_4P zeFt9+z72dT_&rc^`6E#4@q(H$e+6y>cYr?!RsUsF62IRE%C7yk$B%=Ozt4fFg!w8c zIs384D^NyM&J2N)!(E`(=M|vV;iP|VfOVb|a31^{@KfMzTd-~5kHAphF`}yX74VJV zHkk2r@Kd1Ze;(90z6pviKLalZ*TFo^|7uX{^ej;8`+V>U@Fq~>+5*ZRZ3i`vNl<)= z!Owti0A&wvyV-vSRX+w{wRscB)Xg7&qW>-M4)6!yL2%Q{93OM=PM%*6-U5CR1^4r||1@P~9{#OtY zF@HYp?8Lu-=Xk!1#ZJLDfUwN`JE;C{*y;E)?eShv{F?(c&K5WacEBsaZ-Ju!Ll9P( z>vlOl90JAXY48Q$y&$S#&Vh)u`5jPl@&ynTH2(zN1YW+|wX1=W*IPlY)9wEKAyDI( z0 zD6gaZ8U>YFaUtfGpOUTTQ$9$UplA&u%5jRW_fTX{-l7M8-2~oE=}_h`1;IqP)_-lO1>oMeD9>!GZnT;O_~_4CVclO_ZxB8!5V^dv%JH zVZHFzgCMG4ufrY%8~lCO;{ou!{{AwLf+td*OSzVEl=5mylM+zgNSUXg^7hL3`&!ED zDN~eL%4W)wC?_dzpvdOkLeX`Ovd!LMf596mlazZYPp3SE(xTi!IZM&?0Od85Gn98w zbiLexd7sB|@IHSp*h^XT&(8zbQ{GO&q*~tuAPiS<1zhcLE(+Ff5S&cAt=TBwSOi&< zSDmaACMWfw*jU*5YPGYy`*<33=HtROUCO#aJxqgcJITUE&E;OnjjTXyV z0rRQnQP_dbBK>G&LD6lulUS7FP7+mwc8=Mu&E83 z(nhl6+6B!l*TAybQ&GJ$O0z~()bqIAi8J0d9WxL5(FVs;8s^cNZk*Gz+V+MSM}^uq z!+MAJG~F_~C76R<8o+E4)=$$B6PS-XQ4qISI!&`zeQQ-+)64RBE>1(3ubRJ%@Z(6X zn`>&18^Iz=;zlr+M@x@|rWccP)e%~|+DIkh&{%TvB(^siR#Lri!~7yjSWsr-NU%5( zL2$73$5PdIv?@t7rs~w}<;hjT(bMm^>CBD{)__4831+d6 zRL!iNfY{=^x^Fa8b#+r0)B@)^HOm`O?i^XKmvRJ}U$_7-!`UPn57uL0_GMk9 zL(A9BGbyHsN5Rm2Tkgll$mvGGXupp%`|(%K<^_waLMJ>Or8}(9%yyV}sWED3t!*%I z&*1|>BkY8uW`EBKnFE$B!R!*>minGrS=yQJdtQpd+#E=7(@E6CP-X!xWWM8Gby#5D zu(DeCgVvwPT*!r?v-8>FNvLC2R{dnVTI-|wt-dXpLv(5mWv$2@ZkD2hrXVgFz|fW< z%PKeHa$Smgn7|LdiyNhWI1vHjpw4MLyl%urI|-Mh>4VJUn=?1oHk2%E=TWU5*5_dza_SAMRRMV& zOT!t1$GD8nen4j~C9088bDATN6+?mO7v@4AO~OcbXVFRYbB7B*rOQaryj4Mry;nEM zw5#WM8YxDl8|KiRP2#$_b8_OK*R3<%Fo`=$qvi-&S)jz0VU_0{cwLwyD3CdlEt;cI zBks05)U0T`S2cY-7M<;wV_DDJ2a6GwqsfXj)_Omx51z+;wI_QED3+9yt)t_zk=9Bl z2n_ad#CtBxFhWmPysKw9(PuDmHf&)@i}7Hn=MF}KAukX^+!if#UpFo2+63Yxi#r!} zhDMDY#40vn<@?egto-7w!DJGJ1+i8}tW|ev6XiL^W;Vj2)72W^i>g8%EyP*3Fq3vI z`+4krWF_ULJmB8sR|2UG7TY&$i?efi*q-mH4ge*X@W+EVNy^av38-KIxVaU6R2+}Hp;f?ooC}nP-M=S zr_ln@5az6sMk0+3mhQ=fGyQT|g=vRDJId=wi{eOMLpgabB@Zsl_0bLqL!Zd4Oz>@; zu&+u$LPGxFL!ZGB4fbb+Ax>kPykzaLjz23$wwjdN`WMtAQOk)8oM1T-el%-bG2I)c zH8@^H|5Y}q6}wn>Yp>BIcDXiz6+^8?S4z2!;l&aRf*T|^)`^#%rKf_GlvCa3TV{qh zhCl2=nVGC@PNalVZ1(gF%xRfNC8XMgBg!f}mj5Q6OS*b#d-i^+oyQAU^-*)eHt~Q= z_9YmrzLY$;37fmwUJGo*V(%2M+>K+juBI2DGn$4Eq6aH%lOc=a-NYVL2~yRonQ zL*YLu?C!huuYocG-(!5BYI5h-S&JqqohjzSylq*f{guL4O4{HwMTgz2IWobbvxEd% zm+Jlo_Pb9(yvN>S7PL@~v5RmpZ-x13Q{B00z30N%(BDkvnKnpkhZ{A-NxJ~!!K5Oq zB%A9->!zZ1mUn7Li@CT_yQ4c-)Mm2rVBO^L+7w}&s@Iebj|bbfY`wL%bz5!AOM|U9 zkKcUj<}F<7jOt=x;5$3!NcINK+_Atjs)L2vu@n}68?VjFE z<8-czm9EW1VQV}%06TE#8|FKm_W0P?;^N{c!o|1{y;o1Y zH;J$&(t4&1qVZt+Y}~2FJx*Y>ZZhfSVNyGgZ2Vo5-2Qx3@L{gNuoPqaI>+;4AsQ!VZ*7c%ebMy@YD;s z9kJu@_Rm6AZp0lq476gyDN9Fe{Zw;j=)Hzyi}if@JVeGat%?)}R7IgSQXI+-9kFQRT@HwhdGEkrr5qMR7fC1cd_1B)tJI<9DBDV>OKZi9yX zg*1x^!HICui@JE!-$rK^u1zxRS}11GxrLn9K-JaAi#DeqkBTM%@x{m7OtS7J5N!;* zpisLzlv& zRtUTH=t4Fe%hDNW@0*}^18oRreIr=cjgo;jzR$H%%d}HN$q_j?|3M9J@PWMbTPS4WrT>W~fDXCfkZnJIp)SFnpA>Z&0`F zv5MS+Gp}s6$@Wvn%JV8`E9o$qA%h^uV9(8qE~?DQN(_-ZLUs>BvRM=Zvx?nB^b>hd z8QDyyRHZlT<9#FQo|QeYM3{-}ejd5O$TpXgWBU^C!SQvZPVlGp-YsgWK4b}fl$~0- zvlkXA;I{-2q$dWr(HsZ~CfRO{7nll@9yp3&N0C_u-A>GIgv=K+k)w7E#4~pqGc|GY z#4&dO!|ncw6ZcdPGgHS8Pjeb0kFKy=BpcpQ_;s>JGH1HW=Y3?5V3r#>KQZWUqY=`f z4=1!=lBM#Ogi1P_IoxVzMPVH%lOWn#{x!PWICEi_#8RC%asnaFSNgw7;&3(e zHf7}+)dFIrmN@lBm*``_DP5c(s>W7x*kBxJuQaHhEq@}d$Lx>y;;L#8r5VA*{gRGC zlJb;|L%eRl(CvW`VaucI!-{iX=i#Yt;o{U%4}34kxB_G{!W1>oiYh!r*9acqS=d_s zC~CCYm{CXNcIAQ525s|`CU6r11z&4P2YWLJ80~Z=XTiX$WzpHeA zk!CGvk0zosCPgAHRnVQHi8B6>)h>;gTa-Sbuzu(NDq*F#RuXogG7o)cQKXicOl2Jj z#qS`aupNuyVh!9?L5@^w$l}-&9ipRhnSxzTwSCl1yP4Dl0)IP7%uNM~D>#Ot9Q5hUow zopZS}FHAb7p^c&JoqJtqEhn|V(QiacTUma%&{EzVbrn9GV~ROxkYf5_PQB#%>#=q% zBsm-aEO1J>N?m5_YBTE#t4|`4^{7GgVB{DpDJX>pv*F^NN=JL4@j{mt*6%pKPZXgS z)w!4)LP=)@8Rjp0Bt>0GXHr{XvbQ=fauG0-UJ-tH5^H8OFkZV_u+3#OJyPnnn(Kfw z;KRk6+4;Fd2-Yb$bzb_yR{NbZwTEWj)0T&61SRgk%)j?1YQ0zmdE_TC!F-mpbrj{7 zRGBy?uJu~jQIG(T1md+iu|@7;Sv!xA|N;6BJ~9vpZ8I6iH_Qe zz#Otjh7XV37DbG+Q$U81Uvo57*c|YaQG`-~43^Om@Y@zE(*T{mYmpPb^i_ zFejU4Pck^7v!N-9paW!udvb;YF3|h*RR~7GLdJ-gn0`1(msS*Pm}{d}3=zNK!B^sN z6v{J#*7C;`*CK>Ev6ErKY384wo7R)eAH?|d6cIHJ_G6P00k#jY*mrx z*?k$J6zd)Px>#+)%2$@g_SJ-o;*Ae*%kX2>A($h>?l1xWUmo(Ut{VL{-SpY+MXLy| z`lP*Fi%VPjK4aP2X?m2qCkTR5w6g2oT3%!+kvrdcPwILNFD3-5we+(sH>XR%^e24# z+&;G)ADZkU7ebKIzg6;IX{|Y0MioR*MY#M4g=sU|$Tibhs}*(3etb&?=kfWLcwN7G z@%g*8Sx90z3WYO%u2H&>En$^qA++-+!?NHv4A?Tq>?ua-Vy9w4F{0raOfg-#z4*Z= z>n6&a7K75inSPO)h>jo3iZ;3S-E6QpV{a8K?zKq-X1>q6mkhh;M{8b{-(HM@EI*04 z%X(L<=!Uu~4L=K6@wK`stMqlk;bWp5?Z}kdD8_px&>cTU#-&h({Sv{f#~Z_g0zmRawe-DTh-ah5?=%KwF6&n?}tC9crG zbho>yJDZq$yJC9hmTtR`u^?G1)4(FwW9(j{a3@x{uyIgsW5X22^PMfJ|9rSlV}dRrL3M`8XK DdZPuq literal 0 HcmV?d00001 diff --git a/photologue/locale/fr/LC_MESSAGES/django.po b/photologue/locale/fr/LC_MESSAGES/django.po new file mode 100644 index 0000000..7137a75 --- /dev/null +++ b/photologue/locale/fr/LC_MESSAGES/django.po @@ -0,0 +1,765 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Translators: +# Matthieu Payet , 2017 +# Théophane Hufschmitt , 2014 +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-09-03 21:22+0000\n" +"PO-Revision-Date: 2017-12-03 14:47+0000\n" +"Last-Translator: Richard Barran \n" +"Language-Team: French (http://www.transifex.com/richardbarran/django-photologue/language/fr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: admin.py:61 +#, python-format +msgid "" +"The following photo does not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgid_plural "" +"The following photos do not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgstr[0] "La photo suivante ne provient pas du même site(s) que la galerie et donc ne sera pas affichée : %(photo_list)s." +msgstr[1] "Les photos suivantes n’appartiennent pas au même site(s) que la galerie et donc ne seront pas affichées : %(photo_list)s." + +#: admin.py:73 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "La gallerie a été ajoutée avec succès à %(site)s" +msgstr[1] "Les galeries ont été ajoutées avec succès à %(site)s" + +#: admin.py:80 +msgid "Add selected galleries to the current site" +msgstr "Ajouter les galeries sélectionnées au site actuel" + +#: admin.py:86 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "La galerie a été supprimée avec succès de %(site)s" +msgstr[1] "Les galeries ont été supprimées avec succès de %(site)s" + +#: admin.py:93 +msgid "Remove selected galleries from the current site" +msgstr "Supprimer les galeries sélectionnées du site courant" + +#: admin.py:100 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "Toutes les photos dans la gallerie %(galleries)s ont été ajoutées avec succès à %(site)s" +msgstr[1] "Toutes les photos dans les galeries %(galleries)s ont été ajoutées avec succès à %(site)s" + +#: admin.py:108 +msgid "Add all photos of selected galleries to the current site" +msgstr "Ajouter les photos de la galerie sélectionnée au site courant" + +#: admin.py:115 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "Toutes les photos dans la gallerie %(galleries)s ont été supprimées avec succès de %(site)s" +msgstr[1] "Toutes les photos dans les galeries %(galleries)s ont été supprimées avec succès de %(site)s" + +#: admin.py:123 +msgid "Remove all photos in selected galleries from the current site" +msgstr "Supprimer toutes les photos dans la galerie sélectionnée du site courant" + +#: admin.py:164 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "La photo a été ajoutée avec succès à %(site)s" +msgstr[1] "Les photos sélectionnées ont été ajoutées avec succès à %(site)s" + +#: admin.py:171 +msgid "Add selected photos to the current site" +msgstr "Ajouter les photos sélectionnées au site courant" + +#: admin.py:177 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "" +"The selected photos have been successfully removed from %(site)s" +msgstr[0] "La photo a été supprimée avec succès de %(site)s" +msgstr[1] "Les photos ont été supprimées avec succès de %(site)s" + +#: admin.py:184 +msgid "Remove selected photos from the current site" +msgstr "Supprimer les photos séléctionnées du site courant" + +#: admin.py:198 templates/admin/photologue/photo/upload_zip.html:27 +msgid "Upload a zip archive of photos" +msgstr "Télécharger une archive de photos au format *.zip" + +#: forms.py:27 +#| msgid "title" +msgid "Title" +msgstr "Titre" + +#: forms.py:30 +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number.
This field is required if creating a new gallery, but " +"is optional when adding to an existing gallery - if not supplied, the photo " +"titles will be creating from the existing gallery name." +msgstr "Ce titre + un nombre incrémental sera donné à toutes les photos téléchargées.
Ce champ est requis lors de la création d'une nouvelle galerie mais est facultatif lors d'un ajout à une galerie existante. S'il n'est pas fourni, les titres des photos seront créés à partir du nom de la galerie existante." + +#: forms.py:36 +#| msgid "gallery" +msgid "Gallery" +msgstr "Galerie" + +#: forms.py:38 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "Sélectionner une galerie à laquelle ajouter ces images. Laisser ce champ vide pour créer une nouvelle galerie à partir du titre indiqué." + +#: forms.py:40 +#| msgid "caption" +msgid "Caption" +msgstr "Légende" + +#: forms.py:42 +msgid "Caption will be added to all photos." +msgstr "La légende sera ajoutée a toutes les photos." + +#: forms.py:43 +#| msgid "description" +msgid "Description" +msgstr "Description" + +#: forms.py:45 +#| msgid "A description of this Gallery." +msgid "A description of this Gallery. Only required for new galleries." +msgstr "Une description de cette galerie. Requise seulement pour les nouvelles galeries." + +#: forms.py:46 +#| msgid "is public" +msgid "Is public" +msgstr "Est publique" + +#: forms.py:49 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "Décochez cette case pour rendre la galerie des photos envoyées sur le serveur et son contenu privés." + +#: forms.py:72 +msgid "A gallery with that title already exists." +msgstr "Une galerie portant ce nom existe déjà." + +#: forms.py:82 +#| msgid "Select a .zip file of images to upload into a new Gallery." +msgid "Select an existing gallery, or enter a title for a new gallery." +msgstr "Sélectionner une galerie existante ou entrer un titre pour une nouvelle galerie." + +#: forms.py:115 +#, python-brace-format +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "Fichier \"{filename}\" ignoré car il apparaît dans un sous-dossier. Toutes les images doivent être à la racine du fichier zip." + +#: forms.py:156 +#, python-brace-format +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "Impossible de traîter le fichier \"{0}\" dans l'archive zip." + +#: forms.py:172 +#, python-brace-format +msgid "The photos have been added to gallery \"{0}\"." +msgstr "Les photos ont été ajoutés à la galerie \"{0}\"." + +#: models.py:98 +msgid "Very Low" +msgstr "Très Bas" + +#: models.py:99 +msgid "Low" +msgstr "Bas" + +#: models.py:100 +msgid "Medium-Low" +msgstr "Moyen-Bas" + +#: models.py:101 +msgid "Medium" +msgstr "Moyen" + +#: models.py:102 +msgid "Medium-High" +msgstr "Moyen-Haut" + +#: models.py:103 +msgid "High" +msgstr "Haut" + +#: models.py:104 +msgid "Very High" +msgstr "Très Haut" + +#: models.py:109 +msgid "Top" +msgstr "Sommet" + +#: models.py:110 +msgid "Right" +msgstr "Droite" + +#: models.py:111 +msgid "Bottom" +msgstr "Bas" + +#: models.py:112 +msgid "Left" +msgstr "Gauche" + +#: models.py:113 +msgid "Center (Default)" +msgstr "Centré (par défaut)" + +#: models.py:117 +msgid "Flip left to right" +msgstr "Inversion de gauche à droite" + +#: models.py:118 +msgid "Flip top to bottom" +msgstr "Inversion de haut en bas" + +#: models.py:119 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Rotation de 90 degrés dans le sens anti-horloger" + +#: models.py:120 +msgid "Rotate 90 degrees clockwise" +msgstr "Rotation de 90 degrés dans le sens horloger" + +#: models.py:121 +msgid "Rotate 180 degrees" +msgstr "Rotation de 180 degrés" + +#: models.py:125 +msgid "Tile" +msgstr "Mosaïque" + +#: models.py:126 +msgid "Scale" +msgstr "Redimensionner" + +#: models.py:136 +#, python-format +msgid "" +"Chain multiple filters using the following pattern " +"\"FILTER_ONE->FILTER_TWO->FILTER_THREE\". Image filters will be applied in " +"order. The following filters are available: %s." +msgstr "Faite suivre de multiple filtres en utilisant la forme suivante \"FILTRE_UN->FILTRE_DEUX->FILTRE_TROIS\". Les filtres d'image seront appliqués dans l'ordre. Les filtres suivants sont disponibles: %s." + +#: models.py:158 +msgid "date published" +msgstr "date de publication" + +#: models.py:160 models.py:513 +msgid "title" +msgstr "titre" + +#: models.py:163 +msgid "title slug" +msgstr "version abrégée du titre" + +#: models.py:166 models.py:519 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "Un \"slug\" est un titre abrégé et unique, compatible avec les URL, pour un objet." + +#: models.py:167 models.py:596 +msgid "description" +msgstr "description" + +#: models.py:169 models.py:524 +msgid "is public" +msgstr "est public" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Les galeries publiques seront affichée dans les vues par défaut." + +#: models.py:175 models.py:536 +msgid "photos" +msgstr "photos" + +#: models.py:177 models.py:527 +msgid "sites" +msgstr "sites" + +#: models.py:185 +msgid "gallery" +msgstr "galerie" + +#: models.py:186 +msgid "galleries" +msgstr "galleries" + +#: models.py:224 +msgid "count" +msgstr "nombre" + +#: models.py:240 models.py:741 +msgid "image" +msgstr "image" + +#: models.py:243 +msgid "date taken" +msgstr "date de prise de vue" + +#: models.py:246 +msgid "Date image was taken; is obtained from the image EXIF data." +msgstr "La date à laquelle l'image a été prise ; obtenue à partir des données EXIF de l'image." + +#: models.py:247 +msgid "view count" +msgstr "nombre" + +#: models.py:250 +msgid "crop from" +msgstr "découper à partir de" + +#: models.py:259 +msgid "effect" +msgstr "effet" + +#: models.py:279 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "Une taille de photo \"admin_thumbnail\" n'a pas encore été définie." + +#: models.py:286 +msgid "Thumbnail" +msgstr "Miniature" + +#: models.py:516 +msgid "slug" +msgstr "libellé court" + +#: models.py:520 +msgid "caption" +msgstr "légende" + +#: models.py:522 +msgid "date added" +msgstr "date d'ajout" + +#: models.py:526 +msgid "Public photographs will be displayed in the default views." +msgstr "Les photographies publique seront affichées dans les vues par défaut." + +#: models.py:535 +msgid "photo" +msgstr "photo" + +#: models.py:593 models.py:771 +msgid "name" +msgstr "nom" + +#: models.py:672 +msgid "rotate or flip" +msgstr "rotation ou inversion" + +#: models.py:676 models.py:704 +msgid "color" +msgstr "couleur" + +#: models.py:678 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "Un facteur de 0.0 donne une image en noir et blanc, un facteur de 1.0 donne l'image originale." + +#: models.py:680 +msgid "brightness" +msgstr "brillance" + +#: models.py:682 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "Un facteur de 0.0 donne une image noire, un facteur de 1.0 donne l'image originale." + +#: models.py:684 +msgid "contrast" +msgstr "contraste" + +#: models.py:686 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original" +" image." +msgstr "Un facteur de 0.0 donne une image grise, un facteur de 1.0 donne l'image originale." + +#: models.py:688 +msgid "sharpness" +msgstr "netteté" + +#: models.py:690 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "Une facteur de 0.0 donne une image floue, un facteur de 1.0 donne l'image d'origine." + +#: models.py:692 +msgid "filters" +msgstr "filtres" + +#: models.py:696 +msgid "size" +msgstr "taille" + +#: models.py:698 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "La hauteur de la réflection sous la forme d'un pourcentage de l'image d'origine. Un facteur de 0.0 n'ajoute aucune réflection, un facteur de 1.0 ajoute une réflection égale à la hauteur de l'image d'origine." + +#: models.py:701 +msgid "strength" +msgstr "force" + +#: models.py:703 +msgid "The initial opacity of the reflection gradient." +msgstr "L'opacité initial du gradient de reflet." + +#: models.py:707 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "La couleur de fond du gradient de reflet. Faites correspondre ce paramètre avec la couleur de fond de votre page." + +#: models.py:711 models.py:815 +msgid "photo effect" +msgstr "effet photo" + +#: models.py:712 +msgid "photo effects" +msgstr "effets photo" + +#: models.py:743 +msgid "style" +msgstr "style" + +#: models.py:747 +msgid "opacity" +msgstr "opacité" + +#: models.py:749 +msgid "The opacity of the overlay." +msgstr "L'opacité de la surcouche." + +#: models.py:752 +msgid "watermark" +msgstr "filigrane" + +#: models.py:753 +msgid "watermarks" +msgstr "filigranes" + +#: models.py:775 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "Le nom de la taille de la photo ne doit contenir que des lettres, des chiffres et des caractères de soulignement. Exemples: \"miniature\", \"affichage\", \"petit\", \"widget_page_principale\"." + +#: models.py:782 +msgid "width" +msgstr "largeur" + +#: models.py:785 +msgid "If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "Si la largeur est réglée à \"0\" l l'image sera redimensionnée par rapport à la hauteur fournie." + +#: models.py:786 +msgid "height" +msgstr "hauteur" + +#: models.py:789 +msgid "If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "Si la hauteur est réglée à \"0\" l l'image sera redimensionnée par rapport à la largeur fournie." + +#: models.py:790 +msgid "quality" +msgstr "qualité" + +#: models.py:793 +msgid "JPEG image quality." +msgstr "Qualité JPEG de l'image." + +#: models.py:794 +msgid "upscale images?" +msgstr "agrandir les images ?" + +#: models.py:796 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "Si sélectionné l'image sera agrandie si nécessaire pour coïncider avec les dimensions fournies. Les dimensions ajustées seront agrandies sans prendre en compte ce paramètre." + +#: models.py:800 +msgid "crop to fit?" +msgstr "découper pour adapter à la taille ?" + +#: models.py:802 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "Si sélectionné l'image sera redimensionnée et recadrée pour coïncider avec les dimensions fournies." + +#: models.py:804 +msgid "pre-cache?" +msgstr "mise en cache ?" + +#: models.py:806 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "Si sélectionné cette taille de photo sera mise en cache au moment au les photos sont ajoutées." + +#: models.py:807 +msgid "increment view count?" +msgstr "incrémenter le nombre d'affichages ?" + +#: models.py:809 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "Si sélectionné le \"view_count\" (nombre d'affichage) de l'image sera incrémenté quand cette taille de photo sera affichée." + +#: models.py:821 +msgid "watermark image" +msgstr "placer un filigrane sur l'image" + +#: models.py:826 +msgid "photo size" +msgstr "taille de la photo" + +#: models.py:827 +msgid "photo sizes" +msgstr "tailles des photos" + +#: models.py:844 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "La hauteur et la largeur doivent être toutes les deux définies pour retailler des photos." + +#: templates/admin/photologue/photo/change_list.html:9 +msgid "Upload a zip archive" +msgstr "Télécharger une archive au format *.zip" + +#: templates/admin/photologue/photo/upload_zip.html:15 +msgid "Home" +msgstr "Accueil" + +#: templates/admin/photologue/photo/upload_zip.html:19 +#: templates/admin/photologue/photo/upload_zip.html:53 +msgid "Upload" +msgstr "Télécharger" + +#: templates/admin/photologue/photo/upload_zip.html:28 +msgid "" +"\n" +"\t\t

On this page you can upload many photos at once, as long as you have\n" +"\t\tput them all in a zip archive. The photos can be either:

\n" +"\t\t
    \n" +"\t\t\t
  • Added to an existing gallery.
  • \n" +"\t\t\t
  • Otherwise, a new gallery is created with the supplied title.
  • \n" +"\t\t
\n" +"\t" +msgstr "\n⇥⇥

Sur cette page vous pouvez télécharger plusieurs photos à la fois, du moment\n⇥⇥qu'elles sont rassemblées dans une archive au format *.zip. Les photos peuvent être soit :

\n⇥⇥
    \n⇥⇥⇥
  • Ajoutées à une galerie existante,
  • \n⇥⇥⇥
  • sinon, une nouvelle galerie est créée avec le titre fourni.
  • \n⇥⇥
\n⇥" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the error below." +msgstr "Veuillez corriger l'erreur ci-dessous, svp." + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the errors below." +msgstr "Veuillez corriger les erreurs ci-dessous, svp." + +#: templates/photologue/gallery_archive.html:4 +#: templates/photologue/gallery_archive.html:9 +msgid "Latest photo galleries" +msgstr "Dernières galeries de photos" + +#: templates/photologue/gallery_archive.html:16 +#: templates/photologue/photo_archive.html:16 +msgid "Filter by year" +msgstr "Filtrer par année" + +#: templates/photologue/gallery_archive.html:32 +#: templates/photologue/gallery_list.html:26 +msgid "No galleries were found" +msgstr "Aucune galerie trouvée" + +#: templates/photologue/gallery_archive_day.html:4 +#: templates/photologue/gallery_archive_day.html:9 +#, python-format +msgid "Galleries for %(show_day)s" +msgstr "Galeries du %(show_day)s" + +#: templates/photologue/gallery_archive_day.html:18 +#: templates/photologue/gallery_archive_month.html:32 +#: templates/photologue/gallery_archive_year.html:32 +msgid "No galleries were found." +msgstr "Aucune galerie trouvée." + +#: templates/photologue/gallery_archive_day.html:22 +msgid "View all galleries for month" +msgstr "Afficher toutes les galeries du mois" + +#: templates/photologue/gallery_archive_month.html:4 +#: templates/photologue/gallery_archive_month.html:9 +#, python-format +msgid "Galleries for %(show_month)s" +msgstr "Galeries de %(show_month)s" + +#: templates/photologue/gallery_archive_month.html:16 +#: templates/photologue/photo_archive_month.html:16 +msgid "Filter by day" +msgstr "Filtrer par date" + +#: templates/photologue/gallery_archive_month.html:35 +msgid "View all galleries for year" +msgstr "Afficher toutes les galeries de l'année" + +#: templates/photologue/gallery_archive_year.html:4 +#: templates/photologue/gallery_archive_year.html:9 +#, python-format +msgid "Galleries for %(show_year)s" +msgstr "Galeries de %(show_year)s" + +#: templates/photologue/gallery_archive_year.html:16 +#: templates/photologue/photo_archive_year.html:17 +msgid "Filter by month" +msgstr "Filtrer par mois" + +#: templates/photologue/gallery_archive_year.html:35 +#: templates/photologue/gallery_detail.html:17 +msgid "View all galleries" +msgstr "Afficher toutes les galeries" + +#: templates/photologue/gallery_detail.html:10 +#: templates/photologue/gallery_list.html:16 +#: templates/photologue/includes/gallery_sample.html:8 +#: templates/photologue/photo_detail.html:10 +msgid "Published" +msgstr "Publiée le" + +#: templates/photologue/gallery_list.html:4 +#: templates/photologue/gallery_list.html:9 +msgid "All galleries" +msgstr "Toutes les galeries" + +#: templates/photologue/includes/paginator.html:6 +#: templates/photologue/includes/paginator.html:8 +msgid "Previous" +msgstr "Précedent" + +#: templates/photologue/includes/paginator.html:11 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "\n⇥⇥⇥⇥ page %(page_number)s sur %(total_pages)s\n⇥⇥⇥⇥" + +#: templates/photologue/includes/paginator.html:16 +#: templates/photologue/includes/paginator.html:18 +msgid "Next" +msgstr "Suivant" + +#: templates/photologue/photo_archive.html:4 +#: templates/photologue/photo_archive.html:9 +msgid "Latest photos" +msgstr "Dernières photos" + +#: templates/photologue/photo_archive.html:34 +#: templates/photologue/photo_archive_day.html:21 +#: templates/photologue/photo_archive_month.html:36 +#: templates/photologue/photo_archive_year.html:37 +#: templates/photologue/photo_list.html:21 +msgid "No photos were found" +msgstr "Aucune photo trouvée" + +#: templates/photologue/photo_archive_day.html:4 +#: templates/photologue/photo_archive_day.html:9 +#, python-format +msgid "Photos for %(show_day)s" +msgstr "Photos du %(show_day)s" + +#: templates/photologue/photo_archive_day.html:24 +msgid "View all photos for month" +msgstr "Afficher toutes les photos du mois" + +#: templates/photologue/photo_archive_month.html:4 +#: templates/photologue/photo_archive_month.html:9 +#, python-format +msgid "Photos for %(show_month)s" +msgstr "Photos du %(show_month)s" + +#: templates/photologue/photo_archive_month.html:39 +msgid "View all photos for year" +msgstr "Afficher toutes les photos de l'année" + +#: templates/photologue/photo_archive_year.html:4 +#: templates/photologue/photo_archive_year.html:10 +#, python-format +msgid "Photos for %(show_year)s" +msgstr "Photos de %(show_year)s" + +#: templates/photologue/photo_archive_year.html:40 +msgid "View all photos" +msgstr "Afficher toutes les photos" + +#: templates/photologue/photo_detail.html:22 +msgid "This photo is found in the following galleries" +msgstr "Cette photo se trouve dans les galeries suivantes" + +#: templates/photologue/photo_list.html:4 +#: templates/photologue/photo_list.html:9 +msgid "All photos" +msgstr "Toutes les photos" + +#~ msgid "" +#~ "All uploaded photos will be given a title made up of this title + a " +#~ "sequential number." +#~ msgstr "" +#~ "All photos in the gallery will be given a title made up of the gallery title" +#~ " + a sequential number." + +#~ msgid "Separate tags with spaces, put quotes around multiple-word tags." +#~ msgstr "Separate tags with spaces, put quotes around multiple-word tags." + +#~ msgid "Django-tagging was not found, tags will be treated as plain text." +#~ msgstr "Django-tagging was not found, tags will be treated as plain text." + +#~ msgid "tags" +#~ msgstr "tags" + +#~ msgid "images file (.zip)" +#~ msgstr "images file (.zip)" + +#~ msgid "gallery upload" +#~ msgstr "gallery upload" + +#~ msgid "gallery uploads" +#~ msgstr "gallery uploads" diff --git a/photologue/locale/hu/LC_MESSAGES/django.mo b/photologue/locale/hu/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..4a55fefcf90380b1ef71565f70fc72f7cee201d2 GIT binary patch literal 16361 zcmcJVd5|1eea9adFcui_!F@d~7T&dYW+flktYisE-j!sXNGsWxL-fq_%=AuA_qe-f z*E7aoPD2dFf*4YexV)8vC`80YDOX}#l@wE(3KjSxaaEv5NI9-Rih_y*2|36?KEL-~ z&&*!-+A&@G=G*=H9l!T`zw`C}-G$G)S8;ug@;b^lpQqHL;QP+whwIN@tkl)uH^B3s zqtq|JxA1)aOO)CHUJu>`egr%Oeh)kXj=xl?W8m%J82Fdqwcvk&mw{KkOsPx3li>N_ zo!|!WUhs?H{orqc+b&S*BIbPz6gvL(LZw~+UUrdEJHajBxnK%j0^SDFRoxGM8GI1j z0>1lVrM7~f244jJ1t{}=8-yhFeGt;s&p@V7&wIJWSAwtM`7%)WGX=gDEP*ob`$1Ty zKIZT)aGK|Pz$4(d!B2yuuTbip;2(jz!HZw1)E@9AunOJ}3d_%Z73&2r0BNc=fkNjt zQ0BP-JO?}s3LlPvvYwkk;a?S$cDH~Gspdfb)ZP5BH1#F$Bj6*Tyx;k1rTA0t;78h} z;2XhDf*SmN@P**Fz-z(31}DLn!W5zR2Jkv?2Alvt1CE1V2cHi<0SZ5V1`6L^$j_U= zOF((Q7n}tTfg(?T4Eo@IfSYief#cvD_(f3Y zxKJxq1b2W!Zv+Z|ZUtrj+d<*yhr#{eouKgbQBe5xU63i%6QJ~e$wteMSAnvwjiAWI zRiM!Ec2MN03BoFMJ1BhpJSh9~04Q?vHBjd7fx_Q!xaYqDWuEVVsG52llzvZuBA-8Z z&*zQUeZLqKdNnBHUJ6S83HSU~_kJg6_zfbG>JTXHDxmNq0;PWnO1s-Yng4^J$lu+d z(DCb_$lI4dnfI)#e;Abhi=fc?El|e)TTsUP0VwnQ*x^q=S@*xW_rGxXe1t>hc@Zdl ze1&^{GbrP2arIkW{eDo!KLOtT9Hrg`Ud{85E>Y@#z>S-%-oNq9w*H;qd#OJK9tVF4 zo&@(^YUS*ALAt7oMy-Bc3tq|d9pDwDL_I2MRxb3oL_Q0lVOZDDf}APl2BjWD)NHUyBj- z!7lhd@G(&K>D@5pC14#CyEPA92;K$C`};tl|Fpxef?}V)21@&Hf-eFe1BK2XJA5uo zm*-c3_kcxE+W(2Ge-xB;{t#pf)&GLRhfOe5N)1b!D3yL2Uk{T%!QFb01QWBCE_HE(4d z$io*v8RvmXWDQpo~A~>OTQW|IdRLfnNbdKE4jh{(ch_`S}}H z|M#Hq>qqYS-$7~j92P12{xa}l@U@_fw;2>VuLos+4!Y;#?)g2Sj9&$1-VikF21Orl z17+O%UHz9qS=R%g^!rm#*869m(D5iJ^gRyBy8j6jzWp~S^qjN9&htv}H9T*0&)XbM zgVO#8D0JND>fZ$l{Z&^Vx%w0oy}TV1dw(w|?Y;uO4txldbv+6SUEc!{3v;pc>SL4x z6vWM3dmYN!P;qmKyo&DJMUgQ-N|~jIo_>fT*KW$Cl($jjlGsPC4&@l-jTG5uxqg+> zpj=5o&CPmm2Ct{cg^H-a+}WQ9c&~fD*P+1cDJ;jV|Kn0IbYaen|IMooaT8K*%qu|I z$Nc&vHz`GQu6+&#M%{he;WYSZcQ5jqU(e;{)s%}U2PyBQR4JNr2c=Fy zbEO$ECSiUd`8=Mg>kr z?PkeO#!?+usmkKa3s1_6bSyRPrPsFB_QR3R>OpF|cH*`!dy#Ip!q}_mrWbW|s~%@@ zs=Z9dQQ05YUaG@5stHQ-x;N)DQmdUYj^ET?80sL>p6&)M?Iq=UFy|NbOx@21lJQHv z_5+$HliMa*+l7#JC~)4kFxbAcQt>M~i!}}XTZ1$Un61XRe$pv!o1jJB@~{jsAEZK+ zj{Nz&m1aHV#P>4BnP(oMOsDNuD-2}hAPfEeK-(tF)M}?5NyBz+MEZKV9R;_veSQ4s zfkHJ2{HPLkY(HI%6Co@v&HCl6NVkfgmXn~B1u?Z%%gjBFT75X8W8&Y^4iaXTz5_A? zKb8Jfubfd&*UiPvx(2(1fKup{8%)Fk>Otn~pvl(BG6&7K^qb4_;v}dAkq7gos( zEDqOBWNFXZfN2~C6NNdTM&27MZ0Dmz* zqGw{ItavoNijUFj>#wc7ocAfZ%jO3tmNlrwZKY)Uj9AQS;D-o)I?(T+YR!%qtR)6% zT$iwqG>wg&V6geROkb%;)74F#E@;M!Vg%1wu5lxdW+9gD6gjucG1gATGE5bzU2Zvb zwg^UJ#C0-XPyyA9+g6oJOQ7el>{vN>S~Kvn+0^-D3E}qLq`l zm2(s#OEETfKB(|37OU?%p&$I!T$P~%iW$~K#qO-`|>L8!)_IgVZ5K{ z(d+%H*ABBWwY%=22u<#TR_L<^8Y$|1Vm13C=4|zx%V5?xsrZR?WP@393S@oW9K7^Op+BiNVPSU1 zZKOlCua(52m@>GpM{e7EJ3dC7uCI&3K2lwezp^$@&$A1e*YKmQMrcYI>&`VsIvQ)M zr*7Iett(#U71i|vC#0qgTXdWBi$z3vprSY(1Vo$>`XXRbQE@)_N)P_TP2XUM5w0!Z( zRuEwuP(%|8iP5pqo&yT4tSd9vZ z*D+&QWAF^O(b^BjsYOIJV$`hW2#6I!ftVNOGCrDwk#3jJN%V884L?Pfk)XO!L5#gq zH<4-E&hpfk7?o*QL%S3PWp%@msXb1&ZfSdAkaddc09u)%#D-yg&%2~LRR>TYbs(Ns z2mMOWZaOF!(Y93ud3(seHB*P;fw$N5K9-}(j#bvGFUkwY@}iix$#R&D$w!Pu01EIL!I@jmT0Nc_1VZl~&q z*~?)bJ0IDX@?0KpZ{k<9s0|j|b!-V|Yl+vY57cs9T~ic79W}wtaBRtL^vzLUeg=Me zNp$IYKjZd>b~Z#JD=~db2RGLJD2X6`X3Mpk$y^At{ZzTCxAtpvIgHBglS0bgQPV}|@@D>Dskwzf2A8Z4u4;BD&G zpK4`(IF6szHf+daJCm>trCsRs46G@UU)2)PJcKT^37D`f@vD*uNH&KMRLK3ZqCO_h zNMb&WX4A{cHlti^2vXw25&oVlMhrC2mShlBIeo{tSB#v|~BqtxF3l{Qf+#S_OWg9x__Lg{)ui0CU)GL9Eg>?nf@MYc>FjZz z>CP~%!SR0d-_HhR$DVAuwfAV9Q?5P03R3&j~EG^`bg% zx;Q{4hZ2lcD@7jcg4GF**R+XP%$>w5Cvc3$l?_(0vWk@_+U6E(yfleM|6M*^KDK>c zZIq!mW{8r>PaOt3VW)&qYQO}yAIfTr3=r5UGLH8R08 z>mY%~rP^O@-n$gUdF&l(PBzLib{-BUO)qJv{+(?$cutiG{ne2qmIKnlzDfacl2d?5 zeMBOwFs`-z4M+V}oMeTAX)UM}cC~A1VJ4o`8;%?<93_mC<^@TIC-oJZw_H=$az$bD zm3qrnlUH4H`DU&S2iWYwOyWgp=y7;DsgDL_7F^N0yo6f4EwRsU^AdbSflb8_7t3+6 z-Plg&sMf|x7iN5~IjQ%yBT}t^UZeFaYfVl}%+JpkktfbBs{XC?YEHP}N@nzl$}A(q z1+!shITN89a-!az7~61g-@&QDsyU|Jup0rzH56t#E!LEg227A}1*G>vHi_MJ$7iMs z*ACjr>{WuSsi+*w8PTM^wiIN2(kFGjz2QjMPQ0)%9Vbl!_^4$b)9bF-s_pG{qmkZt zo!&CGb;IBb!LpA76U)8~6g7Di?nO@6&vRc0rn+)e)wOR3i~L$A?Gl`0qO-w;lCOy=n(S#*UX3|;P>X*T^(_a2_L zoh5f?m}Ywm5gU$db$bh5MTA1nvds}0f2r<=ox0y$W1Oec z$7;({Ow;?ECCpH-@+Z?(Ej|4=EtV~W)0LosaHY_mlQ!pRZ?rqsKfE7a)G8ycV9v8J z=95tAhgol7E)IKVvb6|J7Egt%t^G+UUGKO%y945+4|Wk9&zzkUOT_7XsRRj5(9G@S zVp+)b5`=o8S?Zk)=}^PIgrOKWK05TiklU`l;WBcSTN1yEFkS<#Ka(BMZH z2Mpq{3GG`UKdfUhjUD8>LmLS$l>+nD7;tBnjam>xtr&*Xw0GJpLueK)gop}st3!lE zWT5gPAz&?R$jZ+TMijA8iF_g08P0lYKO;0m%W7f_%VIlW%V{|d?VW}xr&H4Kn#a>Z z%^G>b3FuyktW%J7@_kiC^1|MNwagemA#PBi`4Un=vc)eLG7?X0FRQ^|;vxLBD`Py= z^;^Ck-5Gi4gn1Y#Ns!JBk6}1BIc>lTDfPvxe-D zOiXR!P3p(*xbN7_iw_)KyyxW9o_7?s=MVd*W@Z-e89eXpeemevgOA_w8{#M3l-MM@ zez8Od520O!9UEUZwX7q;*9r-z2_7+8mP+e%hw17MY$OlHlY7FV5UOFjY?6H6P?A_U zM-IoWS7sr6-GD&*M&f`<9M)n48uMq&h`73_sHRQG04-v{adeC;rgV;sslPpggz=S3VMuLVzhj*GKFWxaQH)q2S7H=gc2Qmdhhz8o17 zNz^dTu$0ZgIcL2`8VS444C+MhOgHT^{!_FY{yJivgBM_H%qJ6f47$A9o`LpjP4J)& zih!&AezyX3UQ6x8=nkZwBc#m*5mxL2ES&X-3e4sX3&cQ2JVp?o#FsdJJ8??5E2?U> zP6X0uD{~Oj%<cUkj}xAxTiIL=NMVG1y7DOS|18LE)AK2Z^-%ou++uQPxMnP|YUIHL(> zp=bH<6m~E_dOwmkusnU!ni1Dxt_gx$<)C*K`-piK$??hJquwK-GbFO?7WQOSat1s! zED#fw8{nr{ztIQOi-n8bk)DBA#DylNE$p2Yoim1i7BkHBP9eos$)cT+gNr5xu`1`R z5}N|+BC$*jA0ZI2cnWIrFaWg{$?(I)Q!p~$(3&6lY`mCy{#(T;x=9ug4zV6Y+-7(T z!oZ>v#QzecS?p2&o6*25kq1C=7kQNo1fR&i0)z;CNXjC*&qv?hLJ1u}4+bfTgmc(Q zy5&3GU>ugX)DlW6f_UTjIzfnRM{#ODE3pTQr)1+WUN!!wC^gb+BCfcxq|WfHp>~mm znPkkvCwgQ_Q789Am<8*SBq%dVK3u^<`mJ+!!>1>{2#DXq(IdUq)~vJE5QOVA=+wQz zi8>rKt{F{4ceBL@$yH1&zR-+G;f$M>DeJw5#RZ7$(E>6OD6uZGsE>rjXZZDLiJ>*L zt+2C8Yn_>Om1sJLfa7}Bn?oURP>nzoTnLufr;gKEARbvyGZtG^QzBH0r-nA(GMSi? zAv42vWGJ_sW~!y(1X?KS?Ke>2VF9v?e}==DuUZYGk830xt0gW(j0r}B4>wD)785tG zp8gC)$Hv`1RX?)}q``w=eT{B6#8`Q!2=djc8aMcNL=GKm#80W}eKzr$ZN6zC)Oa|_ zzlr|Q9ju+$Hi@+Y0w7*OCR}lyM{XsN;UJ=@dml6*3L3^laoEAKnpZ?_@*j=O0MFa6>i5Q@Shlc0 zaeo_4>^_K}ksnM@Q@1&PiM%@0(az-R5-`JD z8N`G_&O1iI^3Q53XXc1%os;7>)-$_!m)t$CMu6BQIZ=9gx%f`k4UvDE9hXfuq@_=q zQm<|r26L}>oE2i$k7SXpq0=rK@eaKdJ|bKTUCj7tte&`W`!?$ry-hGjTgG%amP*@-snt}sFyy2!y^r2e;p(oOYSt53p1>}cE&X?Gj3PT!2 zgs(R3whJfTlCOYt$FUhNffKPO<7(QCq;Af$_QBxzc$6oU41YMH_+%P#Y4z8g09R%!DsK3q14BkiM& z*oW`)Hx1=-w>)QKwL8=xQ;{Ic#7Q<>z(^*N0lJLU(*w2i{z?r<=WfU^3&!X2zaTQT|m!L97@$YB||BcWk{@}m3WWf9-#IRHO Hd7=70!ifo< literal 0 HcmV?d00001 diff --git a/photologue/locale/hu/LC_MESSAGES/django.po b/photologue/locale/hu/LC_MESSAGES/django.po new file mode 100644 index 0000000..7134f35 --- /dev/null +++ b/photologue/locale/hu/LC_MESSAGES/django.po @@ -0,0 +1,765 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Translators: +# David Smith, 2015 +# David Smith, 2015-2016 +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-09-03 21:22+0000\n" +"PO-Revision-Date: 2017-12-03 14:47+0000\n" +"Last-Translator: Richard Barran \n" +"Language-Team: Hungarian (http://www.transifex.com/richardbarran/django-photologue/language/hu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: admin.py:61 +#, python-format +msgid "" +"The following photo does not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgid_plural "" +"The following photos do not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgstr[0] "A következő fot nem ugyanahhoz a webhely(ek)hez tartozik, mint az album, ezért soha nem fog megjelenni: %(photo_list)s" +msgstr[1] "A következő fotók nem ugyanahhoz a webhely(ek)hez tartoznak, mint az album, ezért soha nem fognak megjelenni: %(photo_list)s" + +#: admin.py:73 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "Az album sikeresen hozzáadva a(z) %(site)s webhelyhez" +msgstr[1] "Az albumok sikeresen hozzáadva a(z) %(site)s webhelyhez" + +#: admin.py:80 +msgid "Add selected galleries to the current site" +msgstr "Kiválasztott albumok hozzáadása jelen webhelyhez" + +#: admin.py:86 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "Album sikeresen eltávolítva a(z) %(site)s webhelyről" +msgstr[1] "Kiválasztott albumok sikeresen eltávolítva a(z) %(site)s webhelyről" + +#: admin.py:93 +msgid "Remove selected galleries from the current site" +msgstr "Kiválasztott albumok eltávolítása jelen webhelyről" + +#: admin.py:100 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "%(galleries)s album összes fotója sikeresen hozzáadva a(z) %(site)s webhelyhez" +msgstr[1] "%(galleries)s albumok összes fotója sikeresen hozzáadva a(z) %(site)s webhelyhez" + +#: admin.py:108 +msgid "Add all photos of selected galleries to the current site" +msgstr "Kiválasztott albumok összes fotójának hozzáadása jelen webhelyhez" + +#: admin.py:115 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "%(galleries)s album összes fotója sikeresen eltávolítva a(z) %(site)s webhelyről" +msgstr[1] "%(galleries)s albumok összes fotója sikeresen eltávolítva a(z) %(site)s webhelyről" + +#: admin.py:123 +msgid "Remove all photos in selected galleries from the current site" +msgstr "Kiválasztott albumok összes fotójának törlése jelen webhelyről" + +#: admin.py:164 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "Fotó sikeresen hozzáadva a(z) %(site)s webhelyhez" +msgstr[1] "Kiválasztott fotók sikeresen hozzáadva a(z) %(site)s webhelyhez" + +#: admin.py:171 +msgid "Add selected photos to the current site" +msgstr "Kiválasztott fotók hozzáadása jelen webhelyhez" + +#: admin.py:177 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "" +"The selected photos have been successfully removed from %(site)s" +msgstr[0] "Fotó sikeresen eltávolítva a(z) %(site)s webhelyről" +msgstr[1] "Kiválasztott fotók sikeresen eltávolítva a(z) %(site)s webhelyről" + +#: admin.py:184 +msgid "Remove selected photos from the current site" +msgstr "Kiválasztott fotók eltávolítása jelen webhelyről" + +#: admin.py:198 templates/admin/photologue/photo/upload_zip.html:27 +msgid "Upload a zip archive of photos" +msgstr "Fotókat tartalmazó zip fájl feltöltése" + +#: forms.py:27 +#| msgid "title" +msgid "Title" +msgstr "Cím" + +#: forms.py:30 +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number.
This field is required if creating a new gallery, but " +"is optional when adding to an existing gallery - if not supplied, the photo " +"titles will be creating from the existing gallery name." +msgstr "Az összes feltöltött fotó címe ebből a címből + egy sorszámból fog állni.
Új album létrehozása esetén ezt a mezőt kötelező kitölteni, meglévő album esetén elhagyható - utóbbi esetben a fotók címe a meglévő album nevéből fog képződni." + +#: forms.py:36 +#| msgid "gallery" +msgid "Gallery" +msgstr "Album" + +#: forms.py:38 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "Válasszon ki egy albumot, amelyhez a fotók hozzáadásra kerüljenek! Hagyja üresen, ha új albumot akar létrehozni a megadott címmel!" + +#: forms.py:40 +#| msgid "caption" +msgid "Caption" +msgstr "Képaláírás" + +#: forms.py:42 +msgid "Caption will be added to all photos." +msgstr "A képaláírás minden új fotóra érvényes lesz." + +#: forms.py:43 +#| msgid "description" +msgid "Description" +msgstr "Leírás" + +#: forms.py:45 +#| msgid "A description of this Gallery." +msgid "A description of this Gallery. Only required for new galleries." +msgstr "Album leírása. Csak új albumok esetén kötelező." + +#: forms.py:46 +#| msgid "is public" +msgid "Is public" +msgstr "Nyilvános" + +#: forms.py:49 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "Vegye ki a pipát, ha a feltöltött albumot és a benne lévő fotókat priváttá akarja tenni." + +#: forms.py:72 +msgid "A gallery with that title already exists." +msgstr "Ezzel a címmel már létezik album." + +#: forms.py:82 +#| msgid "Select a .zip file of images to upload into a new Gallery." +msgid "Select an existing gallery, or enter a title for a new gallery." +msgstr "Válasszon egy meglévő albumot, vagy írjon be egy címet új album létrehozásához." + +#: forms.py:115 +#, python-brace-format +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "„{filename}” fájl mellőzve lett, mivel valamely mappában van. A fotóknak közvetlenül kell a zip fájlban lenniük." + +#: forms.py:156 +#, python-brace-format +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "zip fájlban lévő „{0}” fájl feldolgozása sikertelen." + +#: forms.py:172 +#, python-brace-format +msgid "The photos have been added to gallery \"{0}\"." +msgstr "Fotók hozzáadva a(z) „{0}” albumhoz." + +#: models.py:98 +msgid "Very Low" +msgstr "Nagyon alacsony" + +#: models.py:99 +msgid "Low" +msgstr "Alacsony" + +#: models.py:100 +msgid "Medium-Low" +msgstr "Közepesen alacsony" + +#: models.py:101 +msgid "Medium" +msgstr "Közepes" + +#: models.py:102 +msgid "Medium-High" +msgstr "Közepesen magas" + +#: models.py:103 +msgid "High" +msgstr "Magas" + +#: models.py:104 +msgid "Very High" +msgstr "Nagyon magas" + +#: models.py:109 +msgid "Top" +msgstr "Teteje" + +#: models.py:110 +msgid "Right" +msgstr "Jobb oldala" + +#: models.py:111 +msgid "Bottom" +msgstr "Alja" + +#: models.py:112 +msgid "Left" +msgstr "Bal oldala" + +#: models.py:113 +msgid "Center (Default)" +msgstr "Közepe (Alapértelmezett)" + +#: models.py:117 +msgid "Flip left to right" +msgstr "Függőleges tengely mentén tükrözés" + +#: models.py:118 +msgid "Flip top to bottom" +msgstr "Vízszintes tengely mentén tükrözés" + +#: models.py:119 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Óramutató járásával ellenkező irányba 90 fok forgatása" + +#: models.py:120 +msgid "Rotate 90 degrees clockwise" +msgstr "Óramutató járásával megegyező irányba 90 fok forgatás" + +#: models.py:121 +msgid "Rotate 180 degrees" +msgstr "180 fokos forgtás" + +#: models.py:125 +msgid "Tile" +msgstr "Cím" + +#: models.py:126 +msgid "Scale" +msgstr "Méretezés" + +#: models.py:136 +#, python-format +msgid "" +"Chain multiple filters using the following pattern " +"\"FILTER_ONE->FILTER_TWO->FILTER_THREE\". Image filters will be applied in " +"order. The following filters are available: %s." +msgstr "Több szűrőt is alkalmazhat egymás után a következő mintára: „SZŰRŐ_EGY->SZŰRŐ_KETTŐ->SZŰRŐ_HÁROM”. A szűrők a megadott sorrendben, egymás után lesznek a képre alkalmazva. A következő szűrők állnak rendelkezésére: %s" + +#: models.py:158 +msgid "date published" +msgstr "publikálás dátuma" + +#: models.py:160 models.py:513 +msgid "title" +msgstr "cím" + +#: models.py:163 +msgid "title slug" +msgstr "cím slug" + +#: models.py:166 models.py:519 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "A \"slug\" egy objektum egyedi, URL-be ágyazható leírása." + +#: models.py:167 models.py:596 +msgid "description" +msgstr "leírás" + +#: models.py:169 models.py:524 +msgid "is public" +msgstr "nyilvános" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Nyilvános albumok láthatóak lesznek az alapértelmezett nézetekben." + +#: models.py:175 models.py:536 +msgid "photos" +msgstr "fotók" + +#: models.py:177 models.py:527 +msgid "sites" +msgstr "webhelyek" + +#: models.py:185 +msgid "gallery" +msgstr "album" + +#: models.py:186 +msgid "galleries" +msgstr "albumok" + +#: models.py:224 +msgid "count" +msgstr "számláló" + +#: models.py:240 models.py:741 +msgid "image" +msgstr "kép" + +#: models.py:243 +msgid "date taken" +msgstr "készítés dátuma" + +#: models.py:246 +msgid "Date image was taken; is obtained from the image EXIF data." +msgstr "Fotó készítésének dátuma (kép EXIF adataiból kinyerve)." + +#: models.py:247 +msgid "view count" +msgstr "nézettségi számláló" + +#: models.py:250 +msgid "crop from" +msgstr "kivágás" + +#: models.py:259 +msgid "effect" +msgstr "szűrő" + +#: models.py:279 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "Nincs definiálva \"admin_thumbnail\" fotóméret." + +#: models.py:286 +msgid "Thumbnail" +msgstr "Kicsinyített kép" + +#: models.py:516 +msgid "slug" +msgstr "slug" + +#: models.py:520 +msgid "caption" +msgstr "képaláírás" + +#: models.py:522 +msgid "date added" +msgstr "hozzáadva" + +#: models.py:526 +msgid "Public photographs will be displayed in the default views." +msgstr "Nyilvános fotók láthatóak lesznek az alapértelmezett nézetekben." + +#: models.py:535 +msgid "photo" +msgstr "fotó" + +#: models.py:593 models.py:771 +msgid "name" +msgstr "név" + +#: models.py:672 +msgid "rotate or flip" +msgstr "forgatás vagy türközés" + +#: models.py:676 models.py:704 +msgid "color" +msgstr "szín" + +#: models.py:678 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "A 0.0-ás érték fekete-fehér képet, az 1.0-ás pedig az eredeti, színes képet eredményezi" + +#: models.py:680 +msgid "brightness" +msgstr "fényerő" + +#: models.py:682 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "A 0.0-ás érték egy fekete képet, az 1.0-ás pedig az eredeti képet eredményezi." + +#: models.py:684 +msgid "contrast" +msgstr "kontraszt" + +#: models.py:686 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original" +" image." +msgstr "A 0.0-ás érték egy egyszínű, szürke képet, az 1.0-ás érték pedig az eredeti képet eredményezi." + +#: models.py:688 +msgid "sharpness" +msgstr "élesség" + +#: models.py:690 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "A 0.0-ás érték egy elmosott képet, az 1.0-ás érték pedig az eredeti képet eredményezi." + +#: models.py:692 +msgid "filters" +msgstr "szűrők" + +#: models.py:696 +msgid "size" +msgstr "méret" + +#: models.py:698 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "A tükröződés magasságát az eredeti kép magasságának százalékában kell megadni. A 0.0-ás érték egy tükröződés nélküli képet, az 1.0-ás érték pedig egy, Az eredeti kép magasságával megegyező magasságú tükröződést tartalmazó képet eremdényez." + +#: models.py:701 +msgid "strength" +msgstr "erősség" + +#: models.py:703 +msgid "The initial opacity of the reflection gradient." +msgstr "A tükröződés elhalványodásának kezdő átlátszósága." + +#: models.py:707 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "A tükröződés színátmenetének háttérszíne. Állítsa be olyan színűre, amilyen színű háttérre kerül a kép!" + +#: models.py:711 models.py:815 +msgid "photo effect" +msgstr "fotó effekt" + +#: models.py:712 +msgid "photo effects" +msgstr "fotó effektek" + +#: models.py:743 +msgid "style" +msgstr "stílus" + +#: models.py:747 +msgid "opacity" +msgstr "átlátszóság" + +#: models.py:749 +msgid "The opacity of the overlay." +msgstr "A felső réteg átlátszósága." + +#: models.py:752 +msgid "watermark" +msgstr "vízjel" + +#: models.py:753 +msgid "watermarks" +msgstr "vízjelek" + +#: models.py:775 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "A fotóméretek neve csak kis betűket, számokat és aláhúzásjeleket tartalmazhat. Pl.: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." + +#: models.py:782 +msgid "width" +msgstr "szélesség" + +#: models.py:785 +msgid "If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "Ha a szélességet 0-ra állítja, a kép a megadott magasság alapján arányosan fog méreteződni." + +#: models.py:786 +msgid "height" +msgstr "magasság" + +#: models.py:789 +msgid "If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "Ha a magasságot 0-ra állítja, a kép a megadott magasság alapján arányosan fog méreteződni." + +#: models.py:790 +msgid "quality" +msgstr "minőség" + +#: models.py:793 +msgid "JPEG image quality." +msgstr "JPEG minőség" + +#: models.py:794 +msgid "upscale images?" +msgstr "képek felméretezése?" + +#: models.py:796 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "Ha be van állítva, akkor a megadott méretnél kisebb képek fel lesznek nagyítva, hogy kitöltsék a rendelkezésre álló helyet. Képkivágás esetén ettől az opciótól függetlenül mindenképpen fel lesznek nagyítva a képek szükség esetén." + +#: models.py:800 +msgid "crop to fit?" +msgstr "képkivágás?" + +#: models.py:802 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "Ha be van állítva, akkor a képek úgy lesznek átméretezve a megadott képarárnyra, hogy egy részük le lesz vágva." + +#: models.py:804 +msgid "pre-cache?" +msgstr "előre generálás?" + +#: models.py:806 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "Ha be van állítva, akkor a hozzáadáskor előre le lesz generálva a fotó erre a méretre." + +#: models.py:807 +msgid "increment view count?" +msgstr "nézettségi számláló növelése?" + +#: models.py:809 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "Ha be van állítva, akkor a kép „nézettségi számláló” mezőjében lévő érték minden megjelenítés után egyel növekedni fog." + +#: models.py:821 +msgid "watermark image" +msgstr "vízjelhez felhasznált kép" + +#: models.py:826 +msgid "photo size" +msgstr "fotóméret" + +#: models.py:827 +msgid "photo sizes" +msgstr "fotóméretek" + +#: models.py:844 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "Képkivágás csak szélesség és magasság megadása után lehetséges." + +#: templates/admin/photologue/photo/change_list.html:9 +msgid "Upload a zip archive" +msgstr "Zip fájl feltöltése" + +#: templates/admin/photologue/photo/upload_zip.html:15 +msgid "Home" +msgstr "Kezdőlap" + +#: templates/admin/photologue/photo/upload_zip.html:19 +#: templates/admin/photologue/photo/upload_zip.html:53 +msgid "Upload" +msgstr "Feltölt" + +#: templates/admin/photologue/photo/upload_zip.html:28 +msgid "" +"\n" +"\t\t

On this page you can upload many photos at once, as long as you have\n" +"\t\tput them all in a zip archive. The photos can be either:

\n" +"\t\t
    \n" +"\t\t\t
  • Added to an existing gallery.
  • \n" +"\t\t\t
  • Otherwise, a new gallery is created with the supplied title.
  • \n" +"\t\t
\n" +"\t" +msgstr "\n\t\t

Ezen az oldalon egyszerre több fotó tölthető fel, amennyiben azok\n\t\tegy zip fájlba lettek csomagolva. A fotókat:

\n\t\t
    \n\t\t\t
  • Meglévő albumba lehet tenni.
  • \n\t\t\t
  • Vagy a megadott címmel új album is létrehozható.
  • \n\t\t
\n\t" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the error below." +msgstr "Kérem, javítsa ki az alábbi hibát." + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the errors below." +msgstr "Kérem, javítsa ki az alábbi hibákat." + +#: templates/photologue/gallery_archive.html:4 +#: templates/photologue/gallery_archive.html:9 +msgid "Latest photo galleries" +msgstr "Legfrissebb albumok" + +#: templates/photologue/gallery_archive.html:16 +#: templates/photologue/photo_archive.html:16 +msgid "Filter by year" +msgstr "Szűrés év szerint" + +#: templates/photologue/gallery_archive.html:32 +#: templates/photologue/gallery_list.html:26 +msgid "No galleries were found" +msgstr "Nem található album" + +#: templates/photologue/gallery_archive_day.html:4 +#: templates/photologue/gallery_archive_day.html:9 +#, python-format +msgid "Galleries for %(show_day)s" +msgstr "%(show_day)s albumai" + +#: templates/photologue/gallery_archive_day.html:18 +#: templates/photologue/gallery_archive_month.html:32 +#: templates/photologue/gallery_archive_year.html:32 +msgid "No galleries were found." +msgstr "Nem található album" + +#: templates/photologue/gallery_archive_day.html:22 +msgid "View all galleries for month" +msgstr "Hónap összes albuma" + +#: templates/photologue/gallery_archive_month.html:4 +#: templates/photologue/gallery_archive_month.html:9 +#, python-format +msgid "Galleries for %(show_month)s" +msgstr "%(show_month)s albumai" + +#: templates/photologue/gallery_archive_month.html:16 +#: templates/photologue/photo_archive_month.html:16 +msgid "Filter by day" +msgstr "Szűrés nap szerint" + +#: templates/photologue/gallery_archive_month.html:35 +msgid "View all galleries for year" +msgstr "Év összes albuma" + +#: templates/photologue/gallery_archive_year.html:4 +#: templates/photologue/gallery_archive_year.html:9 +#, python-format +msgid "Galleries for %(show_year)s" +msgstr "%(show_year)s albumai" + +#: templates/photologue/gallery_archive_year.html:16 +#: templates/photologue/photo_archive_year.html:17 +msgid "Filter by month" +msgstr "Szűrés hónap szerint" + +#: templates/photologue/gallery_archive_year.html:35 +#: templates/photologue/gallery_detail.html:17 +msgid "View all galleries" +msgstr "Összes album" + +#: templates/photologue/gallery_detail.html:10 +#: templates/photologue/gallery_list.html:16 +#: templates/photologue/includes/gallery_sample.html:8 +#: templates/photologue/photo_detail.html:10 +msgid "Published" +msgstr "Publikálva" + +#: templates/photologue/gallery_list.html:4 +#: templates/photologue/gallery_list.html:9 +msgid "All galleries" +msgstr "Összes album" + +#: templates/photologue/includes/paginator.html:6 +#: templates/photologue/includes/paginator.html:8 +msgid "Previous" +msgstr "Előző" + +#: templates/photologue/includes/paginator.html:11 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "\n\t\t\t\t %(page_number)s/%(total_pages)s. oldal \n\t\t\t\t" + +#: templates/photologue/includes/paginator.html:16 +#: templates/photologue/includes/paginator.html:18 +msgid "Next" +msgstr "Következő" + +#: templates/photologue/photo_archive.html:4 +#: templates/photologue/photo_archive.html:9 +msgid "Latest photos" +msgstr "Legfrissebb fotók" + +#: templates/photologue/photo_archive.html:34 +#: templates/photologue/photo_archive_day.html:21 +#: templates/photologue/photo_archive_month.html:36 +#: templates/photologue/photo_archive_year.html:37 +#: templates/photologue/photo_list.html:21 +msgid "No photos were found" +msgstr "Nem található fotó" + +#: templates/photologue/photo_archive_day.html:4 +#: templates/photologue/photo_archive_day.html:9 +#, python-format +msgid "Photos for %(show_day)s" +msgstr "%(show_day)s fotói" + +#: templates/photologue/photo_archive_day.html:24 +msgid "View all photos for month" +msgstr "Hónap összes fotója" + +#: templates/photologue/photo_archive_month.html:4 +#: templates/photologue/photo_archive_month.html:9 +#, python-format +msgid "Photos for %(show_month)s" +msgstr "%(show_month)s fotói" + +#: templates/photologue/photo_archive_month.html:39 +msgid "View all photos for year" +msgstr "Év összes fotója" + +#: templates/photologue/photo_archive_year.html:4 +#: templates/photologue/photo_archive_year.html:10 +#, python-format +msgid "Photos for %(show_year)s" +msgstr "%(show_year)s fotói" + +#: templates/photologue/photo_archive_year.html:40 +msgid "View all photos" +msgstr "Összes fotó" + +#: templates/photologue/photo_detail.html:22 +msgid "This photo is found in the following galleries" +msgstr "A fotó a következő albumokban található meg" + +#: templates/photologue/photo_list.html:4 +#: templates/photologue/photo_list.html:9 +msgid "All photos" +msgstr "Összes fotó" + +#~ msgid "" +#~ "All uploaded photos will be given a title made up of this title + a " +#~ "sequential number." +#~ msgstr "" +#~ "All photos in the gallery will be given a title made up of the gallery title" +#~ " + a sequential number." + +#~ msgid "Separate tags with spaces, put quotes around multiple-word tags." +#~ msgstr "Separate tags with spaces, put quotes around multiple-word tags." + +#~ msgid "Django-tagging was not found, tags will be treated as plain text." +#~ msgstr "Django-tagging was not found, tags will be treated as plain text." + +#~ msgid "tags" +#~ msgstr "tags" + +#~ msgid "images file (.zip)" +#~ msgstr "images file (.zip)" + +#~ msgid "gallery upload" +#~ msgstr "gallery upload" + +#~ msgid "gallery uploads" +#~ msgstr "gallery uploads" diff --git a/photologue/locale/it/LC_MESSAGES/django.mo b/photologue/locale/it/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..85faf16a655e379c557e73b554d0de0285371dfd GIT binary patch literal 7965 zcmcJTTa08y8OIAjghk}0pomyBw_Ta;nc=$3vMhUgMdGIFiKj4|*4QDHL6*vQ)4=#g005kAH@Ul%6PJ(Cfy$jq6-U$lbuY=zJ{{ns< z^yetG8$1r)37+>+r7i;R2W9~=r@`-oSAxHc<9`D!-+u>x0xo<^sY&qk^Q!qbfE-O70EM3iLE-0%;630<9De~s zMCwIQ`1%!yNYyK#@bUXN{-^l;Iw*AC0AXFd3CcPVDlDjTK>5BDl=EH<%K4{3p}Q57 z^>@VYyW{vGDEmDKega$uWnLc?{vQKn{S%MIWbMUadO|6uvJ2W#7vp zPJy!jo`?^DvMvKK8$X<}Q#=an>hM0U5+Fgvw{HbIkTYXw2a@ioAm{EB_c zvzI0^xLZErb5}%>agByq27j80{Q{&Obv5mJ`8eT`7_x1w@0R#J2a11)4P8akG(;VI z01>Nc+TamA;qF1dp9628i4EOB6W_RoHcyjhk|uT`&uz4Y@K)tWvEQ5G_W)*iS)v^p zbVQUGA?tm{j!3wO-wt|@ft zOTA)ks#~`0Qrl{%UA`=RPwh5Y>3phJU6L?En^uc+vDEM#h!hRA+oq+>_2xacZTd;M zMeXhym+BtxE)(s#gz-Z63zv4Z=%wwG#IMR%W=h6jaqryx((K~$f&H`f+vEGv{Rc+x zcP-A&)*5Mu_Su%}_afAT{Zw6b8C@9pUut@oNZ0ohH15+9$i z6cakdZN-1YCi*GnT{L}ei-w*(YI-qnn9u9$s~Y-DpgV$maFYoP*+WY6)gnND`f#2_ny=$|7=z+_uH*B%Hx? ziv(0Q^g(fBv0nV4XUb+boOdGujn4Hm>&707dSQTeTDjH=X zePW6uuu2#nWAg2JEzB`vQ?wPk6V~N?>p5D#Utrm#u5`@znQ3CI1I{**OPGJcJb%RI zc%d9W<`K2zMCLwIhf>^)+&mKHVH=q0XNfnGGb$@v3r393Cw=K0x1cO{M=*+py3Z1x zg2RM2ahH`4m{X#SYE~IZ1=aGKmbocPUN8tH5mUEw5?6SuV%!eZ5@QRgt9s4E@C)KY z^;w$3HdQTKG;WOwF;qI4MSM)4~!00b|{HW!NHVxxQfD5 z;mFmmj@yK;_))|m3A|Wvb|!JPV=rM0ijHg5clA3(eaX-0O$!I=i}r|<>GeHqHlwefn!cqzb!&b4Ry}>=%+&OC zQ#_mI(QSPxH))X=3c?w^=$f3brFWT}UVU3$ecxen>X$k?#LF5@-{>E{oyBRVj|B`A1 zoA%A^n;o5*!gJGZtP!uTFRf*qsI*7RN%EFUw`pOTiedYqrM>m7qj|D>n=m$;HhqiS zIit6(xN^w&jOJq@>E|Y?@AY|)K%Zvev)F$9HeJ1L-<;|zw(IFF+cx2bUe^wWiu*G7tH=!Pw*^2G+Fav?AUi*#HL279^TV$Vt` zXMF0gbXV2ZMwFc1cg9RO7~;LLE_tcAV#U-C@at!l*OIpA`Rd8 zYidOr!>yej?S!Mf`%c6kB;A6%-dqT|>Z;)Umaq}#lm|glfJVumWG}sEV4rTptqoQd zG`UVbB7hWe5;%pfBy`c3=AQy=SH9b>Lj)8NZEy_it0rqCJA{x$QjuC54ao{uL&?dQ zim)aueVDOXMqxleOdZL4d?m!j7rtG9k-?!1!tUZO19y^CU6_QT#%Q_Vz+ZGIU5Ht_ zw4m&kibw2fomc-qwly@!k-9OgsyN`N>rSEN%EI3(Lu=nfG%(?kQvLdRFm$=8_pxq2xl|lB!@t u$f|H7a}rW36;ggzcQ(9yFi7|yQ}aL2xW$a$+Xe#DM4%0Bb81+RsQ&>h0QPeL literal 0 HcmV?d00001 diff --git a/photologue/locale/it/LC_MESSAGES/django.po b/photologue/locale/it/LC_MESSAGES/django.po new file mode 100644 index 0000000..3b437f0 --- /dev/null +++ b/photologue/locale/it/LC_MESSAGES/django.po @@ -0,0 +1,763 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-09-03 21:22+0000\n" +"PO-Revision-Date: 2017-09-19 14:01+0000\n" +"Last-Translator: Richard Barran \n" +"Language-Team: Italian (http://www.transifex.com/richardbarran/django-photologue/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" + +#: admin.py:61 +#, python-format +msgid "" +"The following photo does not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgid_plural "" +"The following photos do not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgstr[0] "" +msgstr[1] "" + +#: admin.py:73 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:80 +msgid "Add selected galleries to the current site" +msgstr "" + +#: admin.py:86 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:93 +msgid "Remove selected galleries from the current site" +msgstr "" + +#: admin.py:100 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:108 +msgid "Add all photos of selected galleries to the current site" +msgstr "" + +#: admin.py:115 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:123 +msgid "Remove all photos in selected galleries from the current site" +msgstr "" + +#: admin.py:164 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:171 +msgid "Add selected photos to the current site" +msgstr "" + +#: admin.py:177 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "" +"The selected photos have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:184 +msgid "Remove selected photos from the current site" +msgstr "" + +#: admin.py:198 templates/admin/photologue/photo/upload_zip.html:27 +msgid "Upload a zip archive of photos" +msgstr "" + +#: forms.py:27 +#| msgid "title" +msgid "Title" +msgstr "" + +#: forms.py:30 +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number.
This field is required if creating a new gallery, but " +"is optional when adding to an existing gallery - if not supplied, the photo " +"titles will be creating from the existing gallery name." +msgstr "" + +#: forms.py:36 +#| msgid "gallery" +msgid "Gallery" +msgstr "" + +#: forms.py:38 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "" + +#: forms.py:40 +#| msgid "caption" +msgid "Caption" +msgstr "" + +#: forms.py:42 +msgid "Caption will be added to all photos." +msgstr "La didascalia verrà aggiunta a tutte le foto" + +#: forms.py:43 +#| msgid "description" +msgid "Description" +msgstr "" + +#: forms.py:45 +#| msgid "A description of this Gallery." +msgid "A description of this Gallery. Only required for new galleries." +msgstr "" + +#: forms.py:46 +#| msgid "is public" +msgid "Is public" +msgstr "" + +#: forms.py:49 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "Deseleziona l'opzione per rendere private le immagini e la galleria una volta caricata." + +#: forms.py:72 +msgid "A gallery with that title already exists." +msgstr "" + +#: forms.py:82 +#| msgid "Select a .zip file of images to upload into a new Gallery." +msgid "Select an existing gallery, or enter a title for a new gallery." +msgstr "" + +#: forms.py:115 +#, python-brace-format +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "" + +#: forms.py:156 +#, python-brace-format +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "" + +#: forms.py:172 +#, python-brace-format +msgid "The photos have been added to gallery \"{0}\"." +msgstr "" + +#: models.py:98 +msgid "Very Low" +msgstr "Molto Bassa" + +#: models.py:99 +msgid "Low" +msgstr "Bassa" + +#: models.py:100 +msgid "Medium-Low" +msgstr "Medio-Bassa" + +#: models.py:101 +msgid "Medium" +msgstr "Media" + +#: models.py:102 +msgid "Medium-High" +msgstr "Medio-Alta" + +#: models.py:103 +msgid "High" +msgstr "Alta" + +#: models.py:104 +msgid "Very High" +msgstr "Molto Alta" + +#: models.py:109 +msgid "Top" +msgstr "In alto" + +#: models.py:110 +msgid "Right" +msgstr "A destra" + +#: models.py:111 +msgid "Bottom" +msgstr "In basso" + +#: models.py:112 +msgid "Left" +msgstr "A sinistra" + +#: models.py:113 +msgid "Center (Default)" +msgstr "Al centro (Default)" + +#: models.py:117 +msgid "Flip left to right" +msgstr "Inverti destra con sinistra" + +#: models.py:118 +msgid "Flip top to bottom" +msgstr "Inverti alto con basso" + +#: models.py:119 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Ruota di 90 gradi in senso anti-orario" + +#: models.py:120 +msgid "Rotate 90 degrees clockwise" +msgstr "Ruota di 90 gradi in senso orario" + +#: models.py:121 +msgid "Rotate 180 degrees" +msgstr "Ruota di 180 gradi" + +#: models.py:125 +msgid "Tile" +msgstr "Affianca" + +#: models.py:126 +msgid "Scale" +msgstr "Ridimensiona" + +#: models.py:136 +#, python-format +msgid "" +"Chain multiple filters using the following pattern " +"\"FILTER_ONE->FILTER_TWO->FILTER_THREE\". Image filters will be applied in " +"order. The following filters are available: %s." +msgstr "Collega filtri multipli in cascata con il seguente schema \"FILTRO_UNO->FILTRO_DUE->FILTER_TRE\". I filtri saranno applicati in ordine alle immagini. I seguenti filtri sono disponibili: %s." + +#: models.py:158 +msgid "date published" +msgstr "data di pubblicazione" + +#: models.py:160 models.py:513 +msgid "title" +msgstr "titolo" + +#: models.py:163 +msgid "title slug" +msgstr "slug" + +#: models.py:166 models.py:519 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "Uno \"Slug\" è un titolo univoco per un oggetto, usabile come URL." + +#: models.py:167 models.py:596 +msgid "description" +msgstr "descrizione" + +#: models.py:169 models.py:524 +msgid "is public" +msgstr "è pubblica" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Le gallerie pubbliche verranno visualizzate nelle viste di default." + +#: models.py:175 models.py:536 +msgid "photos" +msgstr "foto" + +#: models.py:177 models.py:527 +msgid "sites" +msgstr "" + +#: models.py:185 +msgid "gallery" +msgstr "galleria" + +#: models.py:186 +msgid "galleries" +msgstr "gallerie" + +#: models.py:224 +msgid "count" +msgstr "numero" + +#: models.py:240 models.py:741 +msgid "image" +msgstr "immagine" + +#: models.py:243 +msgid "date taken" +msgstr "data dello scatto" + +#: models.py:246 +msgid "Date image was taken; is obtained from the image EXIF data." +msgstr "" + +#: models.py:247 +msgid "view count" +msgstr "" + +#: models.py:250 +msgid "crop from" +msgstr "ritagliata da" + +#: models.py:259 +msgid "effect" +msgstr "effetto" + +#: models.py:279 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "La dimensione \"admin_thumbnail\" non è ancora stata creata." + +#: models.py:286 +msgid "Thumbnail" +msgstr "Miniatura" + +#: models.py:516 +msgid "slug" +msgstr "slug" + +#: models.py:520 +msgid "caption" +msgstr "didascalia" + +#: models.py:522 +msgid "date added" +msgstr "data di inserimento" + +#: models.py:526 +msgid "Public photographs will be displayed in the default views." +msgstr "Le fotografie pubbliche verranno visualizzate nelle viste di default." + +#: models.py:535 +msgid "photo" +msgstr "fotografia" + +#: models.py:593 models.py:771 +msgid "name" +msgstr "nome" + +#: models.py:672 +msgid "rotate or flip" +msgstr "ruota o inverti" + +#: models.py:676 models.py:704 +msgid "color" +msgstr "colore" + +#: models.py:678 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "Un fattore di 0.0 restituisce un'immagine in bianco e nero, un fattore di 1.0 restituisce l'immagine originale." + +#: models.py:680 +msgid "brightness" +msgstr "luminosità" + +#: models.py:682 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "Un fattore di 0.0 restituisce un'immagine nera, un fattore di 1.0 restituisce l'immagine originale." + +#: models.py:684 +msgid "contrast" +msgstr "contrasto" + +#: models.py:686 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original" +" image." +msgstr "Un fattore di 0.0 restituisce un'immagine grigia, un fattore di 1.0 restituisce l'immagine originale." + +#: models.py:688 +msgid "sharpness" +msgstr "nitidezza" + +#: models.py:690 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "Un fattore di 0.0 restituisce un'immagine sfuocata, un fattore di 1.0 restituisce l'immagine originale." + +#: models.py:692 +msgid "filters" +msgstr "filtri" + +#: models.py:696 +msgid "size" +msgstr "dimensione" + +#: models.py:698 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "L'altezza del riflesso come percentuale dell'immagine originale. Un fattore di 0.0 non aggiunge nessun riflesso, un fattore di 1.0 aggiunge un riflesso della stessa altezza dell'immagine originale." + +#: models.py:701 +msgid "strength" +msgstr "intensità" + +#: models.py:703 +msgid "The initial opacity of the reflection gradient." +msgstr "Opacità iniziale del gradiente del riflesso." + +#: models.py:707 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "Il colore di sfondo del gradiente di riflesso. Sceglilo in modo che corrisponda al colore dello sfondo della tua immagine." + +#: models.py:711 models.py:815 +msgid "photo effect" +msgstr "effetto fotografico" + +#: models.py:712 +msgid "photo effects" +msgstr "effetti fotografici" + +#: models.py:743 +msgid "style" +msgstr "stile" + +#: models.py:747 +msgid "opacity" +msgstr "opacità" + +#: models.py:749 +msgid "The opacity of the overlay." +msgstr "Opacità della copertura" + +#: models.py:752 +msgid "watermark" +msgstr "watermark" + +#: models.py:753 +msgid "watermarks" +msgstr "watermark" + +#: models.py:775 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "Le dimensioni fotografiche devono contenere solo lettere, numeri o caratteri di sottolineatura. Per esempio: : \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." + +#: models.py:782 +msgid "width" +msgstr "larghezza" + +#: models.py:785 +msgid "If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "Se la dimensione è \"0\", l'immagine verrà ridimensionata all'altezza specificata." + +#: models.py:786 +msgid "height" +msgstr "altezza" + +#: models.py:789 +msgid "If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "Se l'altezza è \"0\", l'immagine verrà ridimensionata alla larghezza specificata." + +#: models.py:790 +msgid "quality" +msgstr "qualità" + +#: models.py:793 +msgid "JPEG image quality." +msgstr "qualità dell'immagine JPEG" + +#: models.py:794 +msgid "upscale images?" +msgstr "ingrandisco le immagini?" + +#: models.py:796 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "Se selezionato, l'immagine verrà ingrandita (se necessario) per corrispondere alle dimensioni specificate. Dimensioni ritagliate verranno ridimensionate senza tenere conto di questa configurazione." + +#: models.py:800 +msgid "crop to fit?" +msgstr "Ritaglio per stare nelle dimensioni?" + +#: models.py:802 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "Se selezionato, l'immagine verrà ridimensionata e ritagliata per rientrare nelle dimensioni specificate." + +#: models.py:804 +msgid "pre-cache?" +msgstr "pre-cache?" + +#: models.py:806 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "Se selezionato, questa dimensione di foto verrà pre-salvata mentre le foto sono inserite." + +#: models.py:807 +msgid "increment view count?" +msgstr "incrementa il contatore di visualizzazioni?" + +#: models.py:809 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "Se selezionato, il \"contatore di visualizzazioni\" dell'immagine sarà incrementato ad ogni visualizzazione dell'immagine." + +#: models.py:821 +msgid "watermark image" +msgstr "immagine di watermark" + +#: models.py:826 +msgid "photo size" +msgstr "dimensione della foto" + +#: models.py:827 +msgid "photo sizes" +msgstr "dimensioni delle foto" + +#: models.py:844 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "" + +#: templates/admin/photologue/photo/change_list.html:9 +msgid "Upload a zip archive" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:15 +msgid "Home" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:19 +#: templates/admin/photologue/photo/upload_zip.html:53 +msgid "Upload" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:28 +msgid "" +"\n" +"\t\t

On this page you can upload many photos at once, as long as you have\n" +"\t\tput them all in a zip archive. The photos can be either:

\n" +"\t\t
    \n" +"\t\t\t
  • Added to an existing gallery.
  • \n" +"\t\t\t
  • Otherwise, a new gallery is created with the supplied title.
  • \n" +"\t\t
\n" +"\t" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the error below." +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the errors below." +msgstr "" + +#: templates/photologue/gallery_archive.html:4 +#: templates/photologue/gallery_archive.html:9 +msgid "Latest photo galleries" +msgstr "" + +#: templates/photologue/gallery_archive.html:16 +#: templates/photologue/photo_archive.html:16 +msgid "Filter by year" +msgstr "" + +#: templates/photologue/gallery_archive.html:32 +#: templates/photologue/gallery_list.html:26 +msgid "No galleries were found" +msgstr "" + +#: templates/photologue/gallery_archive_day.html:4 +#: templates/photologue/gallery_archive_day.html:9 +#, python-format +msgid "Galleries for %(show_day)s" +msgstr "" + +#: templates/photologue/gallery_archive_day.html:18 +#: templates/photologue/gallery_archive_month.html:32 +#: templates/photologue/gallery_archive_year.html:32 +msgid "No galleries were found." +msgstr "" + +#: templates/photologue/gallery_archive_day.html:22 +msgid "View all galleries for month" +msgstr "" + +#: templates/photologue/gallery_archive_month.html:4 +#: templates/photologue/gallery_archive_month.html:9 +#, python-format +msgid "Galleries for %(show_month)s" +msgstr "" + +#: templates/photologue/gallery_archive_month.html:16 +#: templates/photologue/photo_archive_month.html:16 +msgid "Filter by day" +msgstr "" + +#: templates/photologue/gallery_archive_month.html:35 +msgid "View all galleries for year" +msgstr "" + +#: templates/photologue/gallery_archive_year.html:4 +#: templates/photologue/gallery_archive_year.html:9 +#, python-format +msgid "Galleries for %(show_year)s" +msgstr "" + +#: templates/photologue/gallery_archive_year.html:16 +#: templates/photologue/photo_archive_year.html:17 +msgid "Filter by month" +msgstr "" + +#: templates/photologue/gallery_archive_year.html:35 +#: templates/photologue/gallery_detail.html:17 +msgid "View all galleries" +msgstr "" + +#: templates/photologue/gallery_detail.html:10 +#: templates/photologue/gallery_list.html:16 +#: templates/photologue/includes/gallery_sample.html:8 +#: templates/photologue/photo_detail.html:10 +msgid "Published" +msgstr "" + +#: templates/photologue/gallery_list.html:4 +#: templates/photologue/gallery_list.html:9 +msgid "All galleries" +msgstr "" + +#: templates/photologue/includes/paginator.html:6 +#: templates/photologue/includes/paginator.html:8 +msgid "Previous" +msgstr "" + +#: templates/photologue/includes/paginator.html:11 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "" + +#: templates/photologue/includes/paginator.html:16 +#: templates/photologue/includes/paginator.html:18 +msgid "Next" +msgstr "" + +#: templates/photologue/photo_archive.html:4 +#: templates/photologue/photo_archive.html:9 +msgid "Latest photos" +msgstr "" + +#: templates/photologue/photo_archive.html:34 +#: templates/photologue/photo_archive_day.html:21 +#: templates/photologue/photo_archive_month.html:36 +#: templates/photologue/photo_archive_year.html:37 +#: templates/photologue/photo_list.html:21 +msgid "No photos were found" +msgstr "" + +#: templates/photologue/photo_archive_day.html:4 +#: templates/photologue/photo_archive_day.html:9 +#, python-format +msgid "Photos for %(show_day)s" +msgstr "" + +#: templates/photologue/photo_archive_day.html:24 +msgid "View all photos for month" +msgstr "" + +#: templates/photologue/photo_archive_month.html:4 +#: templates/photologue/photo_archive_month.html:9 +#, python-format +msgid "Photos for %(show_month)s" +msgstr "" + +#: templates/photologue/photo_archive_month.html:39 +msgid "View all photos for year" +msgstr "" + +#: templates/photologue/photo_archive_year.html:4 +#: templates/photologue/photo_archive_year.html:10 +#, python-format +msgid "Photos for %(show_year)s" +msgstr "" + +#: templates/photologue/photo_archive_year.html:40 +msgid "View all photos" +msgstr "" + +#: templates/photologue/photo_detail.html:22 +msgid "This photo is found in the following galleries" +msgstr "" + +#: templates/photologue/photo_list.html:4 +#: templates/photologue/photo_list.html:9 +msgid "All photos" +msgstr "" + +#~ msgid "" +#~ "All uploaded photos will be given a title made up of this title + a " +#~ "sequential number." +#~ msgstr "" +#~ "All photos in the gallery will be given a title made up of the gallery title" +#~ " + a sequential number." + +#~ msgid "Separate tags with spaces, put quotes around multiple-word tags." +#~ msgstr "Separate tags with spaces, put quotes around multiple-word tags." + +#~ msgid "Django-tagging was not found, tags will be treated as plain text." +#~ msgstr "Django-tagging was not found, tags will be treated as plain text." + +#~ msgid "tags" +#~ msgstr "tags" + +#~ msgid "images file (.zip)" +#~ msgstr "images file (.zip)" + +#~ msgid "gallery upload" +#~ msgstr "gallery upload" + +#~ msgid "gallery uploads" +#~ msgstr "gallery uploads" diff --git a/photologue/locale/nl/LC_MESSAGES/django.mo b/photologue/locale/nl/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..38367ff36187e168d06b448631ba105da9eb3632 GIT binary patch literal 15956 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 QMr7p=!QB3a3E7tUKd*_LX#fBK literal 0 HcmV?d00001 diff --git a/photologue/locale/nl/LC_MESSAGES/django.po b/photologue/locale/nl/LC_MESSAGES/django.po new file mode 100644 index 0000000..d9ac33b --- /dev/null +++ b/photologue/locale/nl/LC_MESSAGES/django.po @@ -0,0 +1,765 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Translators: +# Peter-Paul van Gemerden , 2009 +# Reint T. Kamp , 2015 +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-09-03 21:22+0000\n" +"PO-Revision-Date: 2020-07-30 19:09+0000\n" +"Last-Translator: Richard Barran \n" +"Language-Team: Dutch (http://www.transifex.com/richardbarran/django-photologue/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" + +#: admin.py:61 +#, python-format +msgid "" +"The following photo does not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgid_plural "" +"The following photos do not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgstr[0] "De volgende foto hoort niet tot dezelfde site(s) als de galerij, dus zal nooit getoond worden: %(photo_list)s." +msgstr[1] "De volgende foto's horen niet tot dezelfde site(s) als de galerij, dus zullen nooit getoond worden: %(photo_list)s." + +#: admin.py:73 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "De galerij is met succes toegevoegd aan %(site)s" +msgstr[1] "De galerijen zijn met succes toegevoegd aan %(site)s" + +#: admin.py:80 +msgid "Add selected galleries to the current site" +msgstr "Voeg geselecteerde galerij toe aan de huidige pagina" + +#: admin.py:86 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "De geselecteerde galerij is met succes verwijderd van %(site)s" +msgstr[1] "De geselecteerde galerijen zijn met succes verwijderd van %(site)s" + +#: admin.py:93 +msgid "Remove selected galleries from the current site" +msgstr "Verwijder geselecteerde galerijen van de huidige pagina" + +#: admin.py:100 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "Alle foto's in galerij %(galleries)s zijn met succes toegevoegd aan %(site)s" +msgstr[1] "Alle foto's in galerijen %(galleries)s zijn met succes toegevoegd aan %(site)s" + +#: admin.py:108 +msgid "Add all photos of selected galleries to the current site" +msgstr "Voeg alle foto's van de gelecteerde galerij toe aan de huidige pagina" + +#: admin.py:115 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "Alle foto's in galerij %(galleries)s zijn met succes verwijderd van %(site)s" +msgstr[1] "Alle foto's in galerijen %(galleries)s zijn met succes verwijderd van %(site)s" + +#: admin.py:123 +msgid "Remove all photos in selected galleries from the current site" +msgstr "Verwijder alle foto's in de geselecteerde galerijen van de huidige pagina" + +#: admin.py:164 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "De foto is met succes toegevoegd aan %(site)s" +msgstr[1] "De geselecteerde foto's zijn met succes toegevoegd aan %(site)s" + +#: admin.py:171 +msgid "Add selected photos to the current site" +msgstr "Voeg geselecteerde foto's toe aan de huidige pagina" + +#: admin.py:177 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "" +"The selected photos have been successfully removed from %(site)s" +msgstr[0] "De foto is met succes verwijderd van %(site)s" +msgstr[1] "De geselecteerde foto's zijn met succes verwijderd van %(site)s" + +#: admin.py:184 +msgid "Remove selected photos from the current site" +msgstr "Verwijder geselecteerde foto van de huidige pagina" + +#: admin.py:198 templates/admin/photologue/photo/upload_zip.html:27 +msgid "Upload a zip archive of photos" +msgstr "Upload een zip-archief met foto's" + +#: forms.py:27 +#| msgid "title" +msgid "Title" +msgstr "Titel" + +#: forms.py:30 +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number.
This field is required if creating a new gallery, but " +"is optional when adding to an existing gallery - if not supplied, the photo " +"titles will be creating from the existing gallery name." +msgstr "Alle geüploade foto's krijgen een titel gevormd door deze titel + een nummer.
Dit veld is verplicht als je een nieuwe galerij aanmaakt, maar optioneel bij het toevoegen aan een bestaande galerij. Indien niet ingevuld, krijgen alle foto's een titel gebaseerd op de bestaande galerij-naam." + +#: forms.py:36 +#| msgid "gallery" +msgid "Gallery" +msgstr "Galerij" + +#: forms.py:38 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "Selecteer een galerij om deze foto's aan toe te voegen. Laat dit leeg om een nieuwe galerij aan te maken met de gegeven titel. " + +#: forms.py:40 +#| msgid "caption" +msgid "Caption" +msgstr "Onderschrift" + +#: forms.py:42 +msgid "Caption will be added to all photos." +msgstr "Onderschrift wordt toegevoegd aan alle foto's." + +#: forms.py:43 +#| msgid "description" +msgid "Description" +msgstr "Omschrijving" + +#: forms.py:45 +#| msgid "A description of this Gallery." +msgid "A description of this Gallery. Only required for new galleries." +msgstr "Een beschrijving van deze galerij. Enkel verplicht voor nieuwe galerijen." + +#: forms.py:46 +#| msgid "is public" +msgid "Is public" +msgstr "Is publiek toegankelijk" + +#: forms.py:49 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "Haal dit vinkje weg om de geüploade galerij en foto's privé te maken." + +#: forms.py:72 +msgid "A gallery with that title already exists." +msgstr "Een galerij met deze titel bestaat al." + +#: forms.py:82 +#| msgid "Select a .zip file of images to upload into a new Gallery." +msgid "Select an existing gallery, or enter a title for a new gallery." +msgstr "Selecteer een bestaande galerij of vul de titel in van een nieuwe galerij" + +#: forms.py:115 +#, python-brace-format +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "Bestand \"{filename}\" ligt in een onderliggende map. Alleen afbeeldingen in de bovenste folder van de zip worden gebruikt. " + +#: forms.py:156 +#, python-brace-format +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "Kon bestand \"{0}\" in het zip-archief niet verwerken." + +#: forms.py:172 +#, python-brace-format +msgid "The photos have been added to gallery \"{0}\"." +msgstr "De foto's zijn toegevoegd aan galerij \"{0}\"." + +#: models.py:98 +msgid "Very Low" +msgstr "Zeer laag" + +#: models.py:99 +msgid "Low" +msgstr "Laag" + +#: models.py:100 +msgid "Medium-Low" +msgstr "Middel-laag" + +#: models.py:101 +msgid "Medium" +msgstr "Gemiddeld" + +#: models.py:102 +msgid "Medium-High" +msgstr "Middel-hoog" + +#: models.py:103 +msgid "High" +msgstr "Hoog" + +#: models.py:104 +msgid "Very High" +msgstr "Zeer hoog" + +#: models.py:109 +msgid "Top" +msgstr "Boven" + +#: models.py:110 +msgid "Right" +msgstr "Rechts" + +#: models.py:111 +msgid "Bottom" +msgstr "Onder" + +#: models.py:112 +msgid "Left" +msgstr "Links" + +#: models.py:113 +msgid "Center (Default)" +msgstr "Midden (standaard)" + +#: models.py:117 +msgid "Flip left to right" +msgstr "Spiegel horizontaal" + +#: models.py:118 +msgid "Flip top to bottom" +msgstr "Spiegel verticaal" + +#: models.py:119 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Roteer 90 graden tegen de klok in" + +#: models.py:120 +msgid "Rotate 90 degrees clockwise" +msgstr "Roteer 90 graden met de klok mee" + +#: models.py:121 +msgid "Rotate 180 degrees" +msgstr "Roteer 180 graden" + +#: models.py:125 +msgid "Tile" +msgstr "Tegelen" + +#: models.py:126 +msgid "Scale" +msgstr "Schalen" + +#: models.py:136 +#, python-format +msgid "" +"Chain multiple filters using the following pattern " +"\"FILTER_ONE->FILTER_TWO->FILTER_THREE\". Image filters will be applied in " +"order. The following filters are available: %s." +msgstr "Keten meerdere filters aan elkaar met het patroon: \"FILTER_EEN->FILTER_TWEE->FILTER_DRIE\". Afbeeldingsfilters worden in volgorde toegepast. De volgende filters zijn beschikbaar: %s." + +#: models.py:158 +msgid "date published" +msgstr "datum gepubliceerd" + +#: models.py:160 models.py:513 +msgid "title" +msgstr "titel" + +#: models.py:163 +msgid "title slug" +msgstr "titel 'zetsel'" + +#: models.py:166 models.py:519 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "Een \"zetsel\" is een unieke URL-vriendelijke titel voor een object." + +#: models.py:167 models.py:596 +msgid "description" +msgstr "beschrijving" + +#: models.py:169 models.py:524 +msgid "is public" +msgstr "is openbaar" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Openbare galerijen worden weergegeven in de standaardviews." + +#: models.py:175 models.py:536 +msgid "photos" +msgstr "foto's" + +#: models.py:177 models.py:527 +msgid "sites" +msgstr "sites" + +#: models.py:185 +msgid "gallery" +msgstr "galerij" + +#: models.py:186 +msgid "galleries" +msgstr "galerijen" + +#: models.py:224 +msgid "count" +msgstr "aantal" + +#: models.py:240 models.py:741 +msgid "image" +msgstr "afbeelding" + +#: models.py:243 +msgid "date taken" +msgstr "datum genomen" + +#: models.py:246 +msgid "Date image was taken; is obtained from the image EXIF data." +msgstr "Datum afbeelding is ingenomen; is verkregen van de afbeelding zijn EXIF data." + +#: models.py:247 +msgid "view count" +msgstr "weergave teller" + +#: models.py:250 +msgid "crop from" +msgstr "afknippen vanaf" + +#: models.py:259 +msgid "effect" +msgstr "effect" + +#: models.py:279 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "Er is geen \"admin_thumbnail\" foto-maat vastgelegd." + +#: models.py:286 +msgid "Thumbnail" +msgstr "Miniatuur" + +#: models.py:516 +msgid "slug" +msgstr "zetsel" + +#: models.py:520 +msgid "caption" +msgstr "onderschrift" + +#: models.py:522 +msgid "date added" +msgstr "datum toegevoegd" + +#: models.py:526 +msgid "Public photographs will be displayed in the default views." +msgstr "Openbare foto's worden weergegeven in de standaardviews." + +#: models.py:535 +msgid "photo" +msgstr "foto" + +#: models.py:593 models.py:771 +msgid "name" +msgstr "naam" + +#: models.py:672 +msgid "rotate or flip" +msgstr "roteer of spiegel" + +#: models.py:676 models.py:704 +msgid "color" +msgstr "kleur" + +#: models.py:678 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "Een factor van 0.0 geeft een zwart-wit afbeelding, een factor van 1.0 geeft de originele afbeelding." + +#: models.py:680 +msgid "brightness" +msgstr "helderheid" + +#: models.py:682 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "Een factor van 0.0 geeft een zwarte afbeelding, een factor van 1.0 geeft de originele afbeelding." + +#: models.py:684 +msgid "contrast" +msgstr "contrast" + +#: models.py:686 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original" +" image." +msgstr "Een factor van 0.0 geeft een egaal grijze afbeelding, een factor van 1.0 geeft de originele afbeelding." + +#: models.py:688 +msgid "sharpness" +msgstr "scherpte" + +#: models.py:690 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "Een factor van 0.0 geeft een vervaagde afbeelding, een factor van 1.0 geeft de originele afbeelding." + +#: models.py:692 +msgid "filters" +msgstr "filters" + +#: models.py:696 +msgid "size" +msgstr "afmeting" + +#: models.py:698 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "De hoogte van de reflectie als precentage van de originele afbeelding. Een factor van 0.0 voegt geen reflectie toe, een factor van 1.0 voegt een reflectie toe met een gelijke hoogte als de originele afbeelding." + +#: models.py:701 +msgid "strength" +msgstr "sterkte" + +#: models.py:703 +msgid "The initial opacity of the reflection gradient." +msgstr "De initiële doorzichtigheid van de reflectie-gradatie." + +#: models.py:707 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "De achtergrondkleur van de reflectie-gradatie. Stel dit in als hetzelfde als de achtergrondkleur van je pagina." + +#: models.py:711 models.py:815 +msgid "photo effect" +msgstr "foto-effect" + +#: models.py:712 +msgid "photo effects" +msgstr "foto-effecten" + +#: models.py:743 +msgid "style" +msgstr "stijl" + +#: models.py:747 +msgid "opacity" +msgstr "doorzichtigheid" + +#: models.py:749 +msgid "The opacity of the overlay." +msgstr "De doorzichtigheid van overliggende afbeelding." + +#: models.py:752 +msgid "watermark" +msgstr "watermerk" + +#: models.py:753 +msgid "watermarks" +msgstr "watermerken" + +#: models.py:775 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "De naam van de foto-maat mag alleen letters, nummers en underscores bevatten. Voorbeelden: \"miniatuur\", \"weergave\", \"klein\", \"hoofdpagina_zijbalk_miniatuur\"." + +#: models.py:782 +msgid "width" +msgstr "breedte" + +#: models.py:785 +msgid "If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "Als de breedte op \"0\" wordt gezet zal de afbeelding geschaald worden naar de opgegeven hoogte." + +#: models.py:786 +msgid "height" +msgstr "hoogte" + +#: models.py:789 +msgid "If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "Als de hoogte op \"0\" wordt gezet zal de afbeelding geschaald worden naar de opgegeven breedte." + +#: models.py:790 +msgid "quality" +msgstr "kwaliteit" + +#: models.py:793 +msgid "JPEG image quality." +msgstr "JPEG afbeeldingskwaliteit" + +#: models.py:794 +msgid "upscale images?" +msgstr "afbeeldingen opschalen?" + +#: models.py:796 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "Als dit is gekozen, zal de afbeelding, indien nodig, opgeschaald worden naar opgegeven afmetingen. Afgeknipte maten worden altijd opgeschaald, ongeacht deze instelling." + +#: models.py:800 +msgid "crop to fit?" +msgstr "gepast afknippen?" + +#: models.py:802 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "Als dit is gekozen, zal de afbeelding geschaald en afgeknipt worden naar de opgegeven afmetingen." + +#: models.py:804 +msgid "pre-cache?" +msgstr "vooraf cachen?" + +#: models.py:806 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "Als dit is gekozen, zullen foto's met deze foto-maat van te voren worden gecached wanneer ze worden toegevoegd." + +#: models.py:807 +msgid "increment view count?" +msgstr "aantal vertoningen ophogen?" + +#: models.py:809 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "Als dit is gekozen, zal het aantal vertoningen van de afbeelding worden opgehoogd wanneer deze foto-maat wordt weergegeven." + +#: models.py:821 +msgid "watermark image" +msgstr "watermerk-afbeelding" + +#: models.py:826 +msgid "photo size" +msgstr "foto-maat" + +#: models.py:827 +msgid "photo sizes" +msgstr "foto-maten" + +#: models.py:844 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "Kan alleen foto's uitsnijden als zowel de waarde van de breedte en de hoogte zijn ingesteld." + +#: templates/admin/photologue/photo/change_list.html:9 +msgid "Upload a zip archive" +msgstr "Upload een zip-archief" + +#: templates/admin/photologue/photo/upload_zip.html:15 +msgid "Home" +msgstr "Home" + +#: templates/admin/photologue/photo/upload_zip.html:19 +#: templates/admin/photologue/photo/upload_zip.html:53 +msgid "Upload" +msgstr "Upload" + +#: templates/admin/photologue/photo/upload_zip.html:28 +msgid "" +"\n" +"\t\t

On this page you can upload many photos at once, as long as you have\n" +"\t\tput them all in a zip archive. The photos can be either:

\n" +"\t\t
    \n" +"\t\t\t
  • Added to an existing gallery.
  • \n" +"\t\t\t
  • Otherwise, a new gallery is created with the supplied title.
  • \n" +"\t\t
\n" +"\t" +msgstr "\n\t\t

Op deze pagina kun je meerdere foto's tegelijk uploaden indien ze allen\n\t\tin een zip-archief zitten. De foto's kunnen:

\n\t\t
    \n\t\t\t
  • Toegevoegd worden aan een bestaande galerij
  • \n\t\t\t
  • Of er wordt een galerij aangemaakt met de gegeven titel.
  • \n\t\t
\n\t" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the error below." +msgstr "Gelieve de fout hieronder te verbeteren." + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the errors below." +msgstr "Gelieve de fouten hieronder te verbeteren." + +#: templates/photologue/gallery_archive.html:4 +#: templates/photologue/gallery_archive.html:9 +msgid "Latest photo galleries" +msgstr "Meest recente fotogalerijen" + +#: templates/photologue/gallery_archive.html:16 +#: templates/photologue/photo_archive.html:16 +msgid "Filter by year" +msgstr "Filter op jaar" + +#: templates/photologue/gallery_archive.html:32 +#: templates/photologue/gallery_list.html:26 +msgid "No galleries were found" +msgstr "Er zijn geen galerijen gevonden" + +#: templates/photologue/gallery_archive_day.html:4 +#: templates/photologue/gallery_archive_day.html:9 +#, python-format +msgid "Galleries for %(show_day)s" +msgstr "Galerijen van %(show_day)s" + +#: templates/photologue/gallery_archive_day.html:18 +#: templates/photologue/gallery_archive_month.html:32 +#: templates/photologue/gallery_archive_year.html:32 +msgid "No galleries were found." +msgstr "Er zijn geen galerijen gevonden." + +#: templates/photologue/gallery_archive_day.html:22 +msgid "View all galleries for month" +msgstr "Bekijk alle galerijen uit maand" + +#: templates/photologue/gallery_archive_month.html:4 +#: templates/photologue/gallery_archive_month.html:9 +#, python-format +msgid "Galleries for %(show_month)s" +msgstr "Galerijen uit %(show_month)s" + +#: templates/photologue/gallery_archive_month.html:16 +#: templates/photologue/photo_archive_month.html:16 +msgid "Filter by day" +msgstr "Filter op dag" + +#: templates/photologue/gallery_archive_month.html:35 +msgid "View all galleries for year" +msgstr "Bekijk all galerijen uit jaar" + +#: templates/photologue/gallery_archive_year.html:4 +#: templates/photologue/gallery_archive_year.html:9 +#, python-format +msgid "Galleries for %(show_year)s" +msgstr "Galerijen uit %(show_year)s" + +#: templates/photologue/gallery_archive_year.html:16 +#: templates/photologue/photo_archive_year.html:17 +msgid "Filter by month" +msgstr "Filter op maand" + +#: templates/photologue/gallery_archive_year.html:35 +#: templates/photologue/gallery_detail.html:17 +msgid "View all galleries" +msgstr "Bekijk alle galerijen" + +#: templates/photologue/gallery_detail.html:10 +#: templates/photologue/gallery_list.html:16 +#: templates/photologue/includes/gallery_sample.html:8 +#: templates/photologue/photo_detail.html:10 +msgid "Published" +msgstr "Gepubliceerd" + +#: templates/photologue/gallery_list.html:4 +#: templates/photologue/gallery_list.html:9 +msgid "All galleries" +msgstr "Alle galerijen" + +#: templates/photologue/includes/paginator.html:6 +#: templates/photologue/includes/paginator.html:8 +msgid "Previous" +msgstr "Vorige" + +#: templates/photologue/includes/paginator.html:11 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "\n\t\t\t\t pagina %(page_number)s van %(total_pages)s\n\t\t\t\t" + +#: templates/photologue/includes/paginator.html:16 +#: templates/photologue/includes/paginator.html:18 +msgid "Next" +msgstr "Volgende" + +#: templates/photologue/photo_archive.html:4 +#: templates/photologue/photo_archive.html:9 +msgid "Latest photos" +msgstr "Laatste foto's" + +#: templates/photologue/photo_archive.html:34 +#: templates/photologue/photo_archive_day.html:21 +#: templates/photologue/photo_archive_month.html:36 +#: templates/photologue/photo_archive_year.html:37 +#: templates/photologue/photo_list.html:21 +msgid "No photos were found" +msgstr "Er zijn geen foto's gevonden" + +#: templates/photologue/photo_archive_day.html:4 +#: templates/photologue/photo_archive_day.html:9 +#, python-format +msgid "Photos for %(show_day)s" +msgstr "Foto's van %(show_day)s" + +#: templates/photologue/photo_archive_day.html:24 +msgid "View all photos for month" +msgstr "Bekijk alle foto's van maand" + +#: templates/photologue/photo_archive_month.html:4 +#: templates/photologue/photo_archive_month.html:9 +#, python-format +msgid "Photos for %(show_month)s" +msgstr "Foto's van %(show_month)s" + +#: templates/photologue/photo_archive_month.html:39 +msgid "View all photos for year" +msgstr "Bekijk alle foto's uit het jaar" + +#: templates/photologue/photo_archive_year.html:4 +#: templates/photologue/photo_archive_year.html:10 +#, python-format +msgid "Photos for %(show_year)s" +msgstr "Foto's uit %(show_year)s" + +#: templates/photologue/photo_archive_year.html:40 +msgid "View all photos" +msgstr "Bekijk alle foto's" + +#: templates/photologue/photo_detail.html:22 +msgid "This photo is found in the following galleries" +msgstr "Deze foto staat in de volgende galerijen" + +#: templates/photologue/photo_list.html:4 +#: templates/photologue/photo_list.html:9 +msgid "All photos" +msgstr "Alle foto's" + +#~ msgid "" +#~ "All uploaded photos will be given a title made up of this title + a " +#~ "sequential number." +#~ msgstr "" +#~ "All photos in the gallery will be given a title made up of the gallery title" +#~ " + a sequential number." + +#~ msgid "Separate tags with spaces, put quotes around multiple-word tags." +#~ msgstr "Separate tags with spaces, put quotes around multiple-word tags." + +#~ msgid "Django-tagging was not found, tags will be treated as plain text." +#~ msgstr "Django-tagging was not found, tags will be treated as plain text." + +#~ msgid "tags" +#~ msgstr "tags" + +#~ msgid "images file (.zip)" +#~ msgstr "images file (.zip)" + +#~ msgid "gallery upload" +#~ msgstr "gallery upload" + +#~ msgid "gallery uploads" +#~ msgstr "gallery uploads" diff --git a/photologue/locale/no/LC_MESSAGES/django.mo b/photologue/locale/no/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..21479603b15d168f27788ffee3870731ced8f15f GIT binary patch literal 6675 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\n" +"Language-Team: Norwegian (http://www.transifex.com/richardbarran/django-photologue/language/no/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: no\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: admin.py:61 +#, python-format +msgid "" +"The following photo does not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgid_plural "" +"The following photos do not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgstr[0] "" +msgstr[1] "" + +#: admin.py:73 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:80 +msgid "Add selected galleries to the current site" +msgstr "" + +#: admin.py:86 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:93 +msgid "Remove selected galleries from the current site" +msgstr "" + +#: admin.py:100 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:108 +msgid "Add all photos of selected galleries to the current site" +msgstr "" + +#: admin.py:115 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:123 +msgid "Remove all photos in selected galleries from the current site" +msgstr "" + +#: admin.py:164 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:171 +msgid "Add selected photos to the current site" +msgstr "" + +#: admin.py:177 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "" +"The selected photos have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:184 +msgid "Remove selected photos from the current site" +msgstr "" + +#: admin.py:198 templates/admin/photologue/photo/upload_zip.html:27 +msgid "Upload a zip archive of photos" +msgstr "" + +#: forms.py:27 +#| msgid "title" +msgid "Title" +msgstr "" + +#: forms.py:30 +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number.
This field is required if creating a new gallery, but " +"is optional when adding to an existing gallery - if not supplied, the photo " +"titles will be creating from the existing gallery name." +msgstr "" + +#: forms.py:36 +#| msgid "gallery" +msgid "Gallery" +msgstr "" + +#: forms.py:38 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "" + +#: forms.py:40 +#| msgid "caption" +msgid "Caption" +msgstr "" + +#: forms.py:42 +msgid "Caption will be added to all photos." +msgstr "Undertitler blir lagt til på alle bilder." + +#: forms.py:43 +#| msgid "description" +msgid "Description" +msgstr "" + +#: forms.py:45 +#| msgid "A description of this Gallery." +msgid "A description of this Gallery. Only required for new galleries." +msgstr "" + +#: forms.py:46 +#| msgid "is public" +msgid "Is public" +msgstr "" + +#: forms.py:49 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "Avmarker dette for å gjøre galleriet og dets bilder private." + +#: forms.py:72 +msgid "A gallery with that title already exists." +msgstr "" + +#: forms.py:82 +#| msgid "Select a .zip file of images to upload into a new Gallery." +msgid "Select an existing gallery, or enter a title for a new gallery." +msgstr "" + +#: forms.py:115 +#, python-brace-format +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "" + +#: forms.py:156 +#, python-brace-format +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "" + +#: forms.py:172 +#, python-brace-format +msgid "The photos have been added to gallery \"{0}\"." +msgstr "" + +#: models.py:98 +msgid "Very Low" +msgstr "Veldig lav" + +#: models.py:99 +msgid "Low" +msgstr "Lav" + +#: models.py:100 +msgid "Medium-Low" +msgstr "Middels-lav" + +#: models.py:101 +msgid "Medium" +msgstr "Middels" + +#: models.py:102 +msgid "Medium-High" +msgstr "Middels-høy" + +#: models.py:103 +msgid "High" +msgstr "Høy" + +#: models.py:104 +msgid "Very High" +msgstr "Veldig høy" + +#: models.py:109 +msgid "Top" +msgstr "Topp" + +#: models.py:110 +msgid "Right" +msgstr "Høyre" + +#: models.py:111 +msgid "Bottom" +msgstr "Bunn" + +#: models.py:112 +msgid "Left" +msgstr "Venstre" + +#: models.py:113 +msgid "Center (Default)" +msgstr "Senter (forhåndsvalgt)" + +#: models.py:117 +msgid "Flip left to right" +msgstr "Snu venstre mot høyre" + +#: models.py:118 +msgid "Flip top to bottom" +msgstr "Snu topp mot bunn" + +#: models.py:119 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Rotér 90 grader mot klokka" + +#: models.py:120 +msgid "Rotate 90 degrees clockwise" +msgstr "Rotér 90 grader med klokka" + +#: models.py:121 +msgid "Rotate 180 degrees" +msgstr "Rotér 180 grader" + +#: models.py:125 +msgid "Tile" +msgstr "Flislegg" + +#: models.py:126 +msgid "Scale" +msgstr "Skalér" + +#: models.py:136 +#, python-format +msgid "" +"Chain multiple filters using the following pattern " +"\"FILTER_ONE->FILTER_TWO->FILTER_THREE\". Image filters will be applied in " +"order. The following filters are available: %s." +msgstr "" + +#: models.py:158 +msgid "date published" +msgstr "publiseringsdato" + +#: models.py:160 models.py:513 +msgid "title" +msgstr "tittel" + +#: models.py:163 +msgid "title slug" +msgstr "tittel (slug)" + +#: models.py:166 models.py:519 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "En \"slug\" er en unik URL-vennlig tittel for et objekt." + +#: models.py:167 models.py:596 +msgid "description" +msgstr "beskrivelse" + +#: models.py:169 models.py:524 +msgid "is public" +msgstr "publisert" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Publiserte gallerier vil bli vist på vanlig vis." + +#: models.py:175 models.py:536 +msgid "photos" +msgstr "bilder" + +#: models.py:177 models.py:527 +msgid "sites" +msgstr "" + +#: models.py:185 +msgid "gallery" +msgstr "galleri" + +#: models.py:186 +msgid "galleries" +msgstr "gallerier" + +#: models.py:224 +msgid "count" +msgstr "visninger" + +#: models.py:240 models.py:741 +msgid "image" +msgstr "bilde" + +#: models.py:243 +msgid "date taken" +msgstr "dato tatt" + +#: models.py:246 +msgid "Date image was taken; is obtained from the image EXIF data." +msgstr "" + +#: models.py:247 +msgid "view count" +msgstr "" + +#: models.py:250 +msgid "crop from" +msgstr "kutt fra" + +#: models.py:259 +msgid "effect" +msgstr "effekt" + +#: models.py:279 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "En \"admin_thumbnail\"-bildestørrelse har ikke blitt opprettet." + +#: models.py:286 +msgid "Thumbnail" +msgstr "Miniatyrbilde" + +#: models.py:516 +msgid "slug" +msgstr "slug" + +#: models.py:520 +msgid "caption" +msgstr "undertittel" + +#: models.py:522 +msgid "date added" +msgstr "opplastingsdato" + +#: models.py:526 +msgid "Public photographs will be displayed in the default views." +msgstr "Publiserte bilder vil bli vist på vanlig måte." + +#: models.py:535 +msgid "photo" +msgstr "bilde" + +#: models.py:593 models.py:771 +msgid "name" +msgstr "navn" + +#: models.py:672 +msgid "rotate or flip" +msgstr "rotér og snu" + +#: models.py:676 models.py:704 +msgid "color" +msgstr "farge" + +#: models.py:678 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "En verdi på 0.0 gir et sort/hvitt-bilde, en verdi på 1.0 gir originalbildet." + +#: models.py:680 +msgid "brightness" +msgstr "lyshet" + +#: models.py:682 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "En verdi på 0.0 gir et sort bilde, en verdi på 1.0 gir originalbildet." + +#: models.py:684 +msgid "contrast" +msgstr "kontrast" + +#: models.py:686 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original" +" image." +msgstr "En verdi på 0.0 gir et grått bilde, en verdi på 1.0 gir originalbildet." + +#: models.py:688 +msgid "sharpness" +msgstr "skarphet" + +#: models.py:690 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "En verdi på 0.0 gir et utydlig bilde, en verdi på 1.0 gir originalbildet." + +#: models.py:692 +msgid "filters" +msgstr "filter" + +#: models.py:696 +msgid "size" +msgstr "størrelse" + +#: models.py:698 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "Høyden av refleksjonen som prosent av originalbildet. En verdi på 0.0 gir ingen refleksjon, en verdi på 1.0 gir en refleksjon tilsvarende høyden på originalbildet." + +#: models.py:701 +msgid "strength" +msgstr "styrke" + +#: models.py:703 +msgid "The initial opacity of the reflection gradient." +msgstr "" + +#: models.py:707 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "" + +#: models.py:711 models.py:815 +msgid "photo effect" +msgstr "bildeeffekt" + +#: models.py:712 +msgid "photo effects" +msgstr "bildeeffekter" + +#: models.py:743 +msgid "style" +msgstr "stil" + +#: models.py:747 +msgid "opacity" +msgstr "gjennomsiktighet" + +#: models.py:749 +msgid "The opacity of the overlay." +msgstr "Gjennomsiktigheten av overlegget." + +#: models.py:752 +msgid "watermark" +msgstr "vannmerke" + +#: models.py:753 +msgid "watermarks" +msgstr "vannmerker" + +#: models.py:775 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "Navn på bildestørrelse kan kun inneholde bokstaver, tall og understreker. Eksempler: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." + +#: models.py:782 +msgid "width" +msgstr "bredde" + +#: models.py:785 +msgid "If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "Hvis bredden er satt til \"0\" blir bildet skalert til den oppgitte høyden." + +#: models.py:786 +msgid "height" +msgstr "høyde" + +#: models.py:789 +msgid "If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "Hvis høyden er satt til \"0\" blir bildet skalert til den oppgitte bredden." + +#: models.py:790 +msgid "quality" +msgstr "kvalitet" + +#: models.py:793 +msgid "JPEG image quality." +msgstr "JPEG bildekvalitet" + +#: models.py:794 +msgid "upscale images?" +msgstr "oppskalér bilder?" + +#: models.py:796 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "Hvis valgt, blir bildet vil bli skalert opp om det er nødvendig. Kuttede størrelser vil bli oppskalert uansett innstilling." + +#: models.py:800 +msgid "crop to fit?" +msgstr "kutt for tilpasning?" + +#: models.py:802 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "Hvis valgt blir bildet skalert og kuttet for å passe med den oppgitte størrelsen." + +#: models.py:804 +msgid "pre-cache?" +msgstr "mellomlagre på forhånd?" + +#: models.py:806 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "Hvis valgt blir denne bildestørrelsen mellomlagret på forhånd når nye bilder blir lagt til." + +#: models.py:807 +msgid "increment view count?" +msgstr "øke visningstelleren?" + +#: models.py:809 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "Hvis valgt vil \"visningstelleren\" øke hver gang denne bildestørrelsen vises." + +#: models.py:821 +msgid "watermark image" +msgstr "vannmerke på bilde" + +#: models.py:826 +msgid "photo size" +msgstr "bildestørrelse" + +#: models.py:827 +msgid "photo sizes" +msgstr "bildestørrelser" + +#: models.py:844 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "" + +#: templates/admin/photologue/photo/change_list.html:9 +msgid "Upload a zip archive" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:15 +msgid "Home" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:19 +#: templates/admin/photologue/photo/upload_zip.html:53 +msgid "Upload" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:28 +msgid "" +"\n" +"\t\t

On this page you can upload many photos at once, as long as you have\n" +"\t\tput them all in a zip archive. The photos can be either:

\n" +"\t\t
    \n" +"\t\t\t
  • Added to an existing gallery.
  • \n" +"\t\t\t
  • Otherwise, a new gallery is created with the supplied title.
  • \n" +"\t\t
\n" +"\t" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the error below." +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the errors below." +msgstr "" + +#: templates/photologue/gallery_archive.html:4 +#: templates/photologue/gallery_archive.html:9 +msgid "Latest photo galleries" +msgstr "" + +#: templates/photologue/gallery_archive.html:16 +#: templates/photologue/photo_archive.html:16 +msgid "Filter by year" +msgstr "" + +#: templates/photologue/gallery_archive.html:32 +#: templates/photologue/gallery_list.html:26 +msgid "No galleries were found" +msgstr "" + +#: templates/photologue/gallery_archive_day.html:4 +#: templates/photologue/gallery_archive_day.html:9 +#, python-format +msgid "Galleries for %(show_day)s" +msgstr "" + +#: templates/photologue/gallery_archive_day.html:18 +#: templates/photologue/gallery_archive_month.html:32 +#: templates/photologue/gallery_archive_year.html:32 +msgid "No galleries were found." +msgstr "" + +#: templates/photologue/gallery_archive_day.html:22 +msgid "View all galleries for month" +msgstr "" + +#: templates/photologue/gallery_archive_month.html:4 +#: templates/photologue/gallery_archive_month.html:9 +#, python-format +msgid "Galleries for %(show_month)s" +msgstr "" + +#: templates/photologue/gallery_archive_month.html:16 +#: templates/photologue/photo_archive_month.html:16 +msgid "Filter by day" +msgstr "" + +#: templates/photologue/gallery_archive_month.html:35 +msgid "View all galleries for year" +msgstr "" + +#: templates/photologue/gallery_archive_year.html:4 +#: templates/photologue/gallery_archive_year.html:9 +#, python-format +msgid "Galleries for %(show_year)s" +msgstr "" + +#: templates/photologue/gallery_archive_year.html:16 +#: templates/photologue/photo_archive_year.html:17 +msgid "Filter by month" +msgstr "" + +#: templates/photologue/gallery_archive_year.html:35 +#: templates/photologue/gallery_detail.html:17 +msgid "View all galleries" +msgstr "" + +#: templates/photologue/gallery_detail.html:10 +#: templates/photologue/gallery_list.html:16 +#: templates/photologue/includes/gallery_sample.html:8 +#: templates/photologue/photo_detail.html:10 +msgid "Published" +msgstr "" + +#: templates/photologue/gallery_list.html:4 +#: templates/photologue/gallery_list.html:9 +msgid "All galleries" +msgstr "" + +#: templates/photologue/includes/paginator.html:6 +#: templates/photologue/includes/paginator.html:8 +msgid "Previous" +msgstr "" + +#: templates/photologue/includes/paginator.html:11 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "" + +#: templates/photologue/includes/paginator.html:16 +#: templates/photologue/includes/paginator.html:18 +msgid "Next" +msgstr "" + +#: templates/photologue/photo_archive.html:4 +#: templates/photologue/photo_archive.html:9 +msgid "Latest photos" +msgstr "" + +#: templates/photologue/photo_archive.html:34 +#: templates/photologue/photo_archive_day.html:21 +#: templates/photologue/photo_archive_month.html:36 +#: templates/photologue/photo_archive_year.html:37 +#: templates/photologue/photo_list.html:21 +msgid "No photos were found" +msgstr "" + +#: templates/photologue/photo_archive_day.html:4 +#: templates/photologue/photo_archive_day.html:9 +#, python-format +msgid "Photos for %(show_day)s" +msgstr "" + +#: templates/photologue/photo_archive_day.html:24 +msgid "View all photos for month" +msgstr "" + +#: templates/photologue/photo_archive_month.html:4 +#: templates/photologue/photo_archive_month.html:9 +#, python-format +msgid "Photos for %(show_month)s" +msgstr "" + +#: templates/photologue/photo_archive_month.html:39 +msgid "View all photos for year" +msgstr "" + +#: templates/photologue/photo_archive_year.html:4 +#: templates/photologue/photo_archive_year.html:10 +#, python-format +msgid "Photos for %(show_year)s" +msgstr "" + +#: templates/photologue/photo_archive_year.html:40 +msgid "View all photos" +msgstr "" + +#: templates/photologue/photo_detail.html:22 +msgid "This photo is found in the following galleries" +msgstr "" + +#: templates/photologue/photo_list.html:4 +#: templates/photologue/photo_list.html:9 +msgid "All photos" +msgstr "" + +#~ msgid "" +#~ "All uploaded photos will be given a title made up of this title + a " +#~ "sequential number." +#~ msgstr "" +#~ "All photos in the gallery will be given a title made up of the gallery title" +#~ " + a sequential number." + +#~ msgid "Separate tags with spaces, put quotes around multiple-word tags." +#~ msgstr "Separate tags with spaces, put quotes around multiple-word tags." + +#~ msgid "Django-tagging was not found, tags will be treated as plain text." +#~ msgstr "Django-tagging was not found, tags will be treated as plain text." + +#~ msgid "tags" +#~ msgstr "tags" + +#~ msgid "images file (.zip)" +#~ msgstr "images file (.zip)" + +#~ msgid "gallery upload" +#~ msgstr "gallery upload" + +#~ msgid "gallery uploads" +#~ msgstr "gallery uploads" diff --git a/photologue/locale/pl/LC_MESSAGES/django.mo b/photologue/locale/pl/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..acef6f5f371f89562c19b7c702f228ac56f2004f GIT binary patch literal 7056 zcmb`KTZ|k>6^09vKrkfa!aZCnlf>9zXT0k;#NK$lNgUg8V#mwc!3dC?n(3OE+Ue=) zboaP3!{xyOS@6I`5G0eAL;?gTBFY7UQ1U`{pCTcI6eN(ih$oN`LP)>^5AdDp-knWi za|vl}&EIu9b?Th|oId;Ot1f;>@f@eUoA&f;m3ja?atS{?SG-=S4}w>M9|7+I?*$(P zm%u-RviJ5&mAV;x2z(v*Ja|3$Gw=%V@8DJ7rEjS48t`KJE$|?C6DaZ~;1|K?!HFo=iU$Ur+WObROR4jz)yp_!HeFc)I7Kslq;5? z==CY^8t_Ztb>L(5{7=Cr>HoZ*|J-Ftp_=+8DEdDR%K1-&_kcgF=P$mTyVAcL6g}P! zVk*@D<=h+V`PsU^2Nb!BAV;agpzQlF$e%KGKLxpp`UEKVJqwE5FMzWDYjyvTdj8v> zocB2RR`C0vta~05{a*lO|1UvV_d8I||2@c6)L%i-_1!gzYNO!qoC}2415n9eG)uC|EE`C zBk*lF@fbJ+m%(R2;p-KUWiRMJ+5atY27C;B3-}9A`1vPL^#3O)_q&|QkAiOn4VZ$D zfdEW!&-cN&a&a*ZC1pEs9-+&8X{&uDIflq+4 z@6RAdslS2m0^j%!rQQi{1x3Hxz;A$uK>pMp`4Kx^!Xoj<6`;s@2Pkp%UQqn$LGkaW zK(X`ZL6P@WP}V;TioTD6BImoHta}oabDjZZ{|g{4P`?AkZhryg-mgJfk@GrG1>L0hD|E0~CEOA=pLV%Ro8zs=9wID0*+L$D1Hq)Lu~ZJ_$-3wLyu)2W$Kc_!|0K zY3t8>dAXh@`{X%HJ3ZFd-{>?W^bpM$iWG_fI+3^`Qto^aqj zH1XxFG|Uk4AP}DI{O+JhZ0@1mO_QfpLEyB!-a)&Kb~{b%EjgG_Jnu8h=r&q|HdC*d z18<>;PvyCx0(BJpAWgV&C+%L^2WW(ydOvMH?Ep=_0ShBt_FZAM z8=9V-VPd*`Zew}Tx7uf}=MocFEB}+=S5e$3%WU-O>6iQ1MY@;S@hgy-=!S`gE;&{7 zN5ghvT-?xU-xprzZen%cj1>whOy@2?LRyXPAh8>RKtGTSp*6eCQCU-T=B6fWsq zK%e*Lx^dds@>Iu+nrXZo2+I;kP$rbO5IqIpr!6!I&i3V`~xEsyJFl@M_`gV;!AbZMs75$p&9s7 z4K-zUY0Bxu453Khk77LTlfpQXOG3JdZ2?vD8J!Rcyo6*jN+Mo6KC^jCA9&CVQ+zP5 z8`F51(T&<(4PNsh?3b4za!;k?pi|tvXNyKlEsff->*yXUEIDrKoRG+7&FPxs z5_0MU%GNO&XlZq3yAo@X7$Aeusm(gD4MSAKtrG7v@9LK(bkc|F`BZg$>@$9oA~Six z3#M0+n{+oL?S{81n=GnG+!_*Z^_mLBaw4(n7ATvj$mX5Qg=DR4w~KdF*TuqhwZX;u zZLBKWsgPgQMzRP@BwSEsQArjER8|s8sy3zySFV0_eM}gtJ9#}N32xJCJq)a8kwsNU zx5_Ho^0Dvo)lhlgWN9!}kRjEB%8SeGf5sB%9(k+>^j^p(s!7Q zQN1^-`nQ>kuWu6{!s1rPw?>0~Y)*P3LaKSfnju)mZvZ0J3&(|F5LJjzVmJm|9_88t~m zH(%IwE0Z#_uq|0wnA3}TR?q8g$qjR}`xbWUty{Ic?p@fmUEag^?B2PZ`jejw6SMo~ zm|4_wY)Y?RuGqYg z;&ou+WIUYFlb(-w(G#g#hxmV}qu7MH*6CtgjMmODQOMJ8K%-R{!R68@18C|}3v6Qo6ahRr_9fx{0A&>oAv9F@M%uj}9Vv<); zNwhgZ+)ichFkve0P$LdEMV4s58D!?&QaXqAe7b_Ijk zEXe6Nils{Q#7q*?nfQc{)`f*Qoo179hku8-Cm#)M+GCxXoFg#N`VnKUU5>@L&plQC zk0+G6_uNz2>bd_`x<1wp>QGQr{v3z9uYOjqU)^d9IiUzydq(`}Dei60>rt?sO`N%a zh7D@43Bh*CM|td%#)eHNrCU8WfOXiQ7hwmAUT3T!Is(yMzN zW)^A_jm|*VwP!GlUVFG6xYxaOz)VUCvdUMr_7Z%lFI@tQClK0Z2Icuq547 zrG2QqbNS*mrxOI=| z+IZm9A<}}uBq2?Oyfc!op~GlpHW_tHg2O0N@g&*9^C1*2nT)!(lnk&kbx)d&Dew6D zlK!Zoq6rDR%CmJZ39Mc*c@iwBART#L4MM>^STDF;T+RBnEfTW$L{-Ug^|R=-IWdOv z+XOR8kWh=mcPWe^(2A@2=+7FGCCRCPGEqZB6qMN_->qp8giRkPPtXKz@m>W-^E%U+u4)(565*26%R zFU?-7XHlolC8Bzud^~CgYON@~v{_}+`VbXLb0;-rJ}zr#NCB^^3aJL&3^lw~b;_4G pl1gZd=c}*DqT=cUT}sWRd_|!_41uVz!r(A0;0wzNt2X6O^)H{l3Nruz literal 0 HcmV?d00001 diff --git a/photologue/locale/pl/LC_MESSAGES/django.po b/photologue/locale/pl/LC_MESSAGES/django.po new file mode 100644 index 0000000..f456d47 --- /dev/null +++ b/photologue/locale/pl/LC_MESSAGES/django.po @@ -0,0 +1,777 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-09-03 21:22+0000\n" +"PO-Revision-Date: 2017-09-19 14:01+0000\n" +"Last-Translator: Richard Barran \n" +"Language-Team: Polish (http://www.transifex.com/richardbarran/django-photologue/language/pl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pl\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" + +#: admin.py:61 +#, python-format +msgid "" +"The following photo does not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgid_plural "" +"The following photos do not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: admin.py:73 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: admin.py:80 +msgid "Add selected galleries to the current site" +msgstr "" + +#: admin.py:86 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: admin.py:93 +msgid "Remove selected galleries from the current site" +msgstr "" + +#: admin.py:100 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: admin.py:108 +msgid "Add all photos of selected galleries to the current site" +msgstr "" + +#: admin.py:115 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: admin.py:123 +msgid "Remove all photos in selected galleries from the current site" +msgstr "" + +#: admin.py:164 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: admin.py:171 +msgid "Add selected photos to the current site" +msgstr "" + +#: admin.py:177 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "" +"The selected photos have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: admin.py:184 +msgid "Remove selected photos from the current site" +msgstr "" + +#: admin.py:198 templates/admin/photologue/photo/upload_zip.html:27 +msgid "Upload a zip archive of photos" +msgstr "" + +#: forms.py:27 +#| msgid "title" +msgid "Title" +msgstr "" + +#: forms.py:30 +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number.
This field is required if creating a new gallery, but " +"is optional when adding to an existing gallery - if not supplied, the photo " +"titles will be creating from the existing gallery name." +msgstr "" + +#: forms.py:36 +#| msgid "gallery" +msgid "Gallery" +msgstr "" + +#: forms.py:38 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "" + +#: forms.py:40 +#| msgid "caption" +msgid "Caption" +msgstr "" + +#: forms.py:42 +msgid "Caption will be added to all photos." +msgstr "Podpis będzie dodany do wszystkich zdjęć." + +#: forms.py:43 +#| msgid "description" +msgid "Description" +msgstr "" + +#: forms.py:45 +#| msgid "A description of this Gallery." +msgid "A description of this Gallery. Only required for new galleries." +msgstr "" + +#: forms.py:46 +#| msgid "is public" +msgid "Is public" +msgstr "" + +#: forms.py:49 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "Odznacz aby uczynić wrzucaną galerię oraz zawarte w niej zdjęcia prywatnymi." + +#: forms.py:72 +msgid "A gallery with that title already exists." +msgstr "" + +#: forms.py:82 +#| msgid "Select a .zip file of images to upload into a new Gallery." +msgid "Select an existing gallery, or enter a title for a new gallery." +msgstr "" + +#: forms.py:115 +#, python-brace-format +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "" + +#: forms.py:156 +#, python-brace-format +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "" + +#: forms.py:172 +#, python-brace-format +msgid "The photos have been added to gallery \"{0}\"." +msgstr "" + +#: models.py:98 +msgid "Very Low" +msgstr "Bardzo niska" + +#: models.py:99 +msgid "Low" +msgstr "Niska" + +#: models.py:100 +msgid "Medium-Low" +msgstr "Niższa średnia" + +#: models.py:101 +msgid "Medium" +msgstr "Średnia" + +#: models.py:102 +msgid "Medium-High" +msgstr "Wyższa średnia" + +#: models.py:103 +msgid "High" +msgstr "Wysoka" + +#: models.py:104 +msgid "Very High" +msgstr "Bardzo wysoka" + +#: models.py:109 +msgid "Top" +msgstr "Góra" + +#: models.py:110 +msgid "Right" +msgstr "Prawo" + +#: models.py:111 +msgid "Bottom" +msgstr "Dół" + +#: models.py:112 +msgid "Left" +msgstr "Lewo" + +#: models.py:113 +msgid "Center (Default)" +msgstr "Środek (Domyślnie)" + +#: models.py:117 +msgid "Flip left to right" +msgstr "Odbij w poziomie" + +#: models.py:118 +msgid "Flip top to bottom" +msgstr "Odbij w pionie" + +#: models.py:119 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Odwróć 90 stopni w lewo" + +#: models.py:120 +msgid "Rotate 90 degrees clockwise" +msgstr "Odwróć 90 stopni w prawo" + +#: models.py:121 +msgid "Rotate 180 degrees" +msgstr "Obróć o 180 stopni" + +#: models.py:125 +msgid "Tile" +msgstr "Kafelki" + +#: models.py:126 +msgid "Scale" +msgstr "Skaluj" + +#: models.py:136 +#, python-format +msgid "" +"Chain multiple filters using the following pattern " +"\"FILTER_ONE->FILTER_TWO->FILTER_THREE\". Image filters will be applied in " +"order. The following filters are available: %s." +msgstr "" + +#: models.py:158 +msgid "date published" +msgstr "data publikacji" + +#: models.py:160 models.py:513 +msgid "title" +msgstr "tytuł" + +#: models.py:163 +msgid "title slug" +msgstr "tytuł - slug " + +#: models.py:166 models.py:519 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "\"Slug\" jest unikalnym, zgodnym z formatem dla URL-i tytułem obiektu." + +#: models.py:167 models.py:596 +msgid "description" +msgstr "opis" + +#: models.py:169 models.py:524 +msgid "is public" +msgstr "jest publiczna" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Galerie publiczne będą wyświetlana w domyślnych widokach." + +#: models.py:175 models.py:536 +msgid "photos" +msgstr "zdjęcia" + +#: models.py:177 models.py:527 +msgid "sites" +msgstr "" + +#: models.py:185 +msgid "gallery" +msgstr "galeria" + +#: models.py:186 +msgid "galleries" +msgstr "galerie" + +#: models.py:224 +msgid "count" +msgstr "ilość" + +#: models.py:240 models.py:741 +msgid "image" +msgstr "obraz" + +#: models.py:243 +msgid "date taken" +msgstr "data wykonania" + +#: models.py:246 +msgid "Date image was taken; is obtained from the image EXIF data." +msgstr "" + +#: models.py:247 +msgid "view count" +msgstr "" + +#: models.py:250 +msgid "crop from" +msgstr "obetnij z" + +#: models.py:259 +msgid "effect" +msgstr "efekt" + +#: models.py:279 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "Rozmiar zdjęcia \"admin_thumbnail\" nie został zdefiniowany." + +#: models.py:286 +msgid "Thumbnail" +msgstr "Miniaturka" + +#: models.py:516 +msgid "slug" +msgstr "slug" + +#: models.py:520 +msgid "caption" +msgstr "podpis" + +#: models.py:522 +msgid "date added" +msgstr "data dodania" + +#: models.py:526 +msgid "Public photographs will be displayed in the default views." +msgstr "Publiczne zdjęcia będą wyświetlane w domyślnych widokach." + +#: models.py:535 +msgid "photo" +msgstr "zdjęcie" + +#: models.py:593 models.py:771 +msgid "name" +msgstr "nazwa" + +#: models.py:672 +msgid "rotate or flip" +msgstr "obróć lub odbij" + +#: models.py:676 models.py:704 +msgid "color" +msgstr "kolor" + +#: models.py:678 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "Współczynnik 0.0 daje czarno-biały obraz, współczynnik 1.0 daje obraz oryginalny." + +#: models.py:680 +msgid "brightness" +msgstr "jasność" + +#: models.py:682 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "Współczynnik 0.0 daje czarny obraz, współczynnik 1.0 daje obraz oryginalny." + +#: models.py:684 +msgid "contrast" +msgstr "kontrast" + +#: models.py:686 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original" +" image." +msgstr "Współczynnik 0.0 daje jednolity szary obraz, współczynnik 1.0 daje obraz oryginalny." + +#: models.py:688 +msgid "sharpness" +msgstr "ostrość" + +#: models.py:690 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "Współczynnik 0.0 daje rozmazany obraz, współczynnik 1.0 daje obraz oryginalny." + +#: models.py:692 +msgid "filters" +msgstr "filtry" + +#: models.py:696 +msgid "size" +msgstr "rozmiar" + +#: models.py:698 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "Wysokość odbicia jako procent oryginalnego obrazu. Współczynnik 0.0 nie dodaje odbicia, współczynnik 1.0 dodaje odbicie równe wysokości oryginalnego obrazu." + +#: models.py:701 +msgid "strength" +msgstr "intensywność" + +#: models.py:703 +msgid "The initial opacity of the reflection gradient." +msgstr "" + +#: models.py:707 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "" + +#: models.py:711 models.py:815 +msgid "photo effect" +msgstr "efekt zdjęcia" + +#: models.py:712 +msgid "photo effects" +msgstr "efekty zdjęć" + +#: models.py:743 +msgid "style" +msgstr "styl" + +#: models.py:747 +msgid "opacity" +msgstr "przeźroczystość" + +#: models.py:749 +msgid "The opacity of the overlay." +msgstr "Poziom przezroczystości" + +#: models.py:752 +msgid "watermark" +msgstr "znak wodny" + +#: models.py:753 +msgid "watermarks" +msgstr "znaki wodne" + +#: models.py:775 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "Nazwa rozmiaru zdjęcia powinna zawierać tylko litery, cyfry i podkreślenia. Przykłady: \"miniatura\", \"wystawa\", \"male\", \"widget_strony_glownej\"." + +#: models.py:782 +msgid "width" +msgstr "szerokość" + +#: models.py:785 +msgid "If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "Jeśli szerokość jest ustawiona na \"0\" to obraz będzie skalowany do podanej wysokości." + +#: models.py:786 +msgid "height" +msgstr "wysokość" + +#: models.py:789 +msgid "If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "Jeśli wysokość jest ustawiona na \"0\" to obraz będzie skalowany do podanej szerokości." + +#: models.py:790 +msgid "quality" +msgstr "jakość" + +#: models.py:793 +msgid "JPEG image quality." +msgstr "Jakość obrazu JPEG" + +#: models.py:794 +msgid "upscale images?" +msgstr "skalować obrazy w górę?" + +#: models.py:796 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "Jeśli zaznaczone to obraz będzie skalowany w górę tak aby pasował do podanych wymiarów. Obcinane rozmiary będą skalowane niezależnie od tego ustawienia." + +#: models.py:800 +msgid "crop to fit?" +msgstr "przyciąć aby pasował?" + +#: models.py:802 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "Jeśli zaznaczone to obraz będzie skalowany i przycinany tak aby pasował do podanych wymiarów." + +#: models.py:804 +msgid "pre-cache?" +msgstr "wstępnie cachować?" + +#: models.py:806 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "Jesli zaznaczone to ten rozmiar zdjęć będzie wstępnie cachowany przy dodawaniu zdjęć." + +#: models.py:807 +msgid "increment view count?" +msgstr "zwiększyć licznik odsłon?" + +#: models.py:809 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "Jeśli zaznaczone to \"licznik_odslon\" będzie zwiększany gdy ten rozmiar zdjęcia będzie wyświetlany." + +#: models.py:821 +msgid "watermark image" +msgstr "oznacz kluczem wodnym" + +#: models.py:826 +msgid "photo size" +msgstr "rozmiar zdjęcia" + +#: models.py:827 +msgid "photo sizes" +msgstr "rozmiary zdjęć" + +#: models.py:844 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "" + +#: templates/admin/photologue/photo/change_list.html:9 +msgid "Upload a zip archive" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:15 +msgid "Home" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:19 +#: templates/admin/photologue/photo/upload_zip.html:53 +msgid "Upload" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:28 +msgid "" +"\n" +"\t\t

On this page you can upload many photos at once, as long as you have\n" +"\t\tput them all in a zip archive. The photos can be either:

\n" +"\t\t
    \n" +"\t\t\t
  • Added to an existing gallery.
  • \n" +"\t\t\t
  • Otherwise, a new gallery is created with the supplied title.
  • \n" +"\t\t
\n" +"\t" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the error below." +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the errors below." +msgstr "" + +#: templates/photologue/gallery_archive.html:4 +#: templates/photologue/gallery_archive.html:9 +msgid "Latest photo galleries" +msgstr "" + +#: templates/photologue/gallery_archive.html:16 +#: templates/photologue/photo_archive.html:16 +msgid "Filter by year" +msgstr "" + +#: templates/photologue/gallery_archive.html:32 +#: templates/photologue/gallery_list.html:26 +msgid "No galleries were found" +msgstr "" + +#: templates/photologue/gallery_archive_day.html:4 +#: templates/photologue/gallery_archive_day.html:9 +#, python-format +msgid "Galleries for %(show_day)s" +msgstr "" + +#: templates/photologue/gallery_archive_day.html:18 +#: templates/photologue/gallery_archive_month.html:32 +#: templates/photologue/gallery_archive_year.html:32 +msgid "No galleries were found." +msgstr "" + +#: templates/photologue/gallery_archive_day.html:22 +msgid "View all galleries for month" +msgstr "" + +#: templates/photologue/gallery_archive_month.html:4 +#: templates/photologue/gallery_archive_month.html:9 +#, python-format +msgid "Galleries for %(show_month)s" +msgstr "" + +#: templates/photologue/gallery_archive_month.html:16 +#: templates/photologue/photo_archive_month.html:16 +msgid "Filter by day" +msgstr "" + +#: templates/photologue/gallery_archive_month.html:35 +msgid "View all galleries for year" +msgstr "" + +#: templates/photologue/gallery_archive_year.html:4 +#: templates/photologue/gallery_archive_year.html:9 +#, python-format +msgid "Galleries for %(show_year)s" +msgstr "" + +#: templates/photologue/gallery_archive_year.html:16 +#: templates/photologue/photo_archive_year.html:17 +msgid "Filter by month" +msgstr "" + +#: templates/photologue/gallery_archive_year.html:35 +#: templates/photologue/gallery_detail.html:17 +msgid "View all galleries" +msgstr "" + +#: templates/photologue/gallery_detail.html:10 +#: templates/photologue/gallery_list.html:16 +#: templates/photologue/includes/gallery_sample.html:8 +#: templates/photologue/photo_detail.html:10 +msgid "Published" +msgstr "" + +#: templates/photologue/gallery_list.html:4 +#: templates/photologue/gallery_list.html:9 +msgid "All galleries" +msgstr "" + +#: templates/photologue/includes/paginator.html:6 +#: templates/photologue/includes/paginator.html:8 +msgid "Previous" +msgstr "" + +#: templates/photologue/includes/paginator.html:11 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "" + +#: templates/photologue/includes/paginator.html:16 +#: templates/photologue/includes/paginator.html:18 +msgid "Next" +msgstr "" + +#: templates/photologue/photo_archive.html:4 +#: templates/photologue/photo_archive.html:9 +msgid "Latest photos" +msgstr "" + +#: templates/photologue/photo_archive.html:34 +#: templates/photologue/photo_archive_day.html:21 +#: templates/photologue/photo_archive_month.html:36 +#: templates/photologue/photo_archive_year.html:37 +#: templates/photologue/photo_list.html:21 +msgid "No photos were found" +msgstr "" + +#: templates/photologue/photo_archive_day.html:4 +#: templates/photologue/photo_archive_day.html:9 +#, python-format +msgid "Photos for %(show_day)s" +msgstr "" + +#: templates/photologue/photo_archive_day.html:24 +msgid "View all photos for month" +msgstr "" + +#: templates/photologue/photo_archive_month.html:4 +#: templates/photologue/photo_archive_month.html:9 +#, python-format +msgid "Photos for %(show_month)s" +msgstr "" + +#: templates/photologue/photo_archive_month.html:39 +msgid "View all photos for year" +msgstr "" + +#: templates/photologue/photo_archive_year.html:4 +#: templates/photologue/photo_archive_year.html:10 +#, python-format +msgid "Photos for %(show_year)s" +msgstr "" + +#: templates/photologue/photo_archive_year.html:40 +msgid "View all photos" +msgstr "" + +#: templates/photologue/photo_detail.html:22 +msgid "This photo is found in the following galleries" +msgstr "" + +#: templates/photologue/photo_list.html:4 +#: templates/photologue/photo_list.html:9 +msgid "All photos" +msgstr "" + +#~ msgid "" +#~ "All uploaded photos will be given a title made up of this title + a " +#~ "sequential number." +#~ msgstr "" +#~ "All photos in the gallery will be given a title made up of the gallery title" +#~ " + a sequential number." + +#~ msgid "Separate tags with spaces, put quotes around multiple-word tags." +#~ msgstr "Separate tags with spaces, put quotes around multiple-word tags." + +#~ msgid "Django-tagging was not found, tags will be treated as plain text." +#~ msgstr "Django-tagging was not found, tags will be treated as plain text." + +#~ msgid "tags" +#~ msgstr "tags" + +#~ msgid "images file (.zip)" +#~ msgstr "images file (.zip)" + +#~ msgid "gallery upload" +#~ msgstr "gallery upload" + +#~ msgid "gallery uploads" +#~ msgstr "gallery uploads" diff --git a/photologue/locale/pt/LC_MESSAGES/django.mo b/photologue/locale/pt/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..ad0ca50380e57ed20d153689fc533ef0ad5fec5e GIT binary patch literal 7835 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, 2009 +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-09-03 21:22+0000\n" +"PO-Revision-Date: 2017-09-19 14:01+0000\n" +"Last-Translator: Richard Barran \n" +"Language-Team: Portuguese (http://www.transifex.com/richardbarran/django-photologue/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" + +#: admin.py:61 +#, python-format +msgid "" +"The following photo does not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgid_plural "" +"The following photos do not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgstr[0] "" +msgstr[1] "" + +#: admin.py:73 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:80 +msgid "Add selected galleries to the current site" +msgstr "" + +#: admin.py:86 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:93 +msgid "Remove selected galleries from the current site" +msgstr "" + +#: admin.py:100 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:108 +msgid "Add all photos of selected galleries to the current site" +msgstr "" + +#: admin.py:115 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:123 +msgid "Remove all photos in selected galleries from the current site" +msgstr "" + +#: admin.py:164 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:171 +msgid "Add selected photos to the current site" +msgstr "" + +#: admin.py:177 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "" +"The selected photos have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:184 +msgid "Remove selected photos from the current site" +msgstr "" + +#: admin.py:198 templates/admin/photologue/photo/upload_zip.html:27 +msgid "Upload a zip archive of photos" +msgstr "" + +#: forms.py:27 +#| msgid "title" +msgid "Title" +msgstr "" + +#: forms.py:30 +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number.
This field is required if creating a new gallery, but " +"is optional when adding to an existing gallery - if not supplied, the photo " +"titles will be creating from the existing gallery name." +msgstr "" + +#: forms.py:36 +#| msgid "gallery" +msgid "Gallery" +msgstr "" + +#: forms.py:38 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "" + +#: forms.py:40 +#| msgid "caption" +msgid "Caption" +msgstr "" + +#: forms.py:42 +msgid "Caption will be added to all photos." +msgstr "A legenda será adicionada para todas as fotos" + +#: forms.py:43 +#| msgid "description" +msgid "Description" +msgstr "" + +#: forms.py:45 +#| msgid "A description of this Gallery." +msgid "A description of this Gallery. Only required for new galleries." +msgstr "" + +#: forms.py:46 +#| msgid "is public" +msgid "Is public" +msgstr "" + +#: forms.py:49 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "Desmarque esta opção para tornar a galeria, incluindo suas fotos, não pública." + +#: forms.py:72 +msgid "A gallery with that title already exists." +msgstr "" + +#: forms.py:82 +#| msgid "Select a .zip file of images to upload into a new Gallery." +msgid "Select an existing gallery, or enter a title for a new gallery." +msgstr "" + +#: forms.py:115 +#, python-brace-format +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "" + +#: forms.py:156 +#, python-brace-format +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "" + +#: forms.py:172 +#, python-brace-format +msgid "The photos have been added to gallery \"{0}\"." +msgstr "" + +#: models.py:98 +msgid "Very Low" +msgstr "Muito Baixa" + +#: models.py:99 +msgid "Low" +msgstr "Baixa" + +#: models.py:100 +msgid "Medium-Low" +msgstr "Média-Baixa" + +#: models.py:101 +msgid "Medium" +msgstr "Média" + +#: models.py:102 +msgid "Medium-High" +msgstr "Média-Alta" + +#: models.py:103 +msgid "High" +msgstr "Alta" + +#: models.py:104 +msgid "Very High" +msgstr "Muito Alta" + +#: models.py:109 +msgid "Top" +msgstr "Cima" + +#: models.py:110 +msgid "Right" +msgstr "Direita" + +#: models.py:111 +msgid "Bottom" +msgstr "Baixo" + +#: models.py:112 +msgid "Left" +msgstr "Esquerda" + +#: models.py:113 +msgid "Center (Default)" +msgstr "Centro (Padrão)" + +#: models.py:117 +msgid "Flip left to right" +msgstr "Inverter da direita para a esquerda" + +#: models.py:118 +msgid "Flip top to bottom" +msgstr "Inverter de cima para baixo" + +#: models.py:119 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Rotacionar 90 graus no sentido anti-horário" + +#: models.py:120 +msgid "Rotate 90 degrees clockwise" +msgstr "Rotacionar 90 graus no sentido horário" + +#: models.py:121 +msgid "Rotate 180 degrees" +msgstr "Rotacionar 180 graus" + +#: models.py:125 +msgid "Tile" +msgstr "Título" + +#: models.py:126 +msgid "Scale" +msgstr "Escala" + +#: models.py:136 +#, python-format +msgid "" +"Chain multiple filters using the following pattern " +"\"FILTER_ONE->FILTER_TWO->FILTER_THREE\". Image filters will be applied in " +"order. The following filters are available: %s." +msgstr "Encadeie multiplos filtros usando o seguinte padrão \"FILTRO_UM->FILTRO_DOIS->FILTRO_TRÊS\". Os filtors serão aplicados na ordem em que foram encadeados. Os seguintes filtros estão disponíveis: %s." + +#: models.py:158 +msgid "date published" +msgstr "data de publicação" + +#: models.py:160 models.py:513 +msgid "title" +msgstr "título" + +#: models.py:163 +msgid "title slug" +msgstr "slug do título" + +#: models.py:166 models.py:519 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "Um \"slug\" é um título único compatível com uma URL." + +#: models.py:167 models.py:596 +msgid "description" +msgstr "descrição" + +#: models.py:169 models.py:524 +msgid "is public" +msgstr "é publico" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Galerias públicas serão mostradas nas views padrões." + +#: models.py:175 models.py:536 +msgid "photos" +msgstr "fotos" + +#: models.py:177 models.py:527 +msgid "sites" +msgstr "" + +#: models.py:185 +msgid "gallery" +msgstr "Galeria" + +#: models.py:186 +msgid "galleries" +msgstr "Galerias" + +#: models.py:224 +msgid "count" +msgstr "contagem" + +#: models.py:240 models.py:741 +msgid "image" +msgstr "imagem" + +#: models.py:243 +msgid "date taken" +msgstr "data em que a foto foi tirada" + +#: models.py:246 +msgid "Date image was taken; is obtained from the image EXIF data." +msgstr "" + +#: models.py:247 +msgid "view count" +msgstr "" + +#: models.py:250 +msgid "crop from" +msgstr "cortar" + +#: models.py:259 +msgid "effect" +msgstr "efeito" + +#: models.py:279 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "Um tamanho para a foto do \"admin_thumbnail\" ainda não foi definido." + +#: models.py:286 +msgid "Thumbnail" +msgstr "Thumbnail" + +#: models.py:516 +msgid "slug" +msgstr "slug" + +#: models.py:520 +msgid "caption" +msgstr "legenda" + +#: models.py:522 +msgid "date added" +msgstr "data que foi adicionado(a)" + +#: models.py:526 +msgid "Public photographs will be displayed in the default views." +msgstr "Fotos públicas serão mostradas nas views padrões." + +#: models.py:535 +msgid "photo" +msgstr "foto" + +#: models.py:593 models.py:771 +msgid "name" +msgstr "nome" + +#: models.py:672 +msgid "rotate or flip" +msgstr "rotacionar ou inverter" + +#: models.py:676 models.py:704 +msgid "color" +msgstr "cor" + +#: models.py:678 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "O valor 0.0 deixará a imagem em preto e branco, o fator 1.0 não alterará a mesma.A factor of 0.0 gives a black and white image, a factor of 1.0 gives the original image." + +#: models.py:680 +msgid "brightness" +msgstr "brilho" + +#: models.py:682 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "O valor 0.0 deixará a imagem totalmente preta, o valor 1.0 não alterará a mesma." + +#: models.py:684 +msgid "contrast" +msgstr "contraste" + +#: models.py:686 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original" +" image." +msgstr "O valor 0.0 deixará a imagem totalmente cinza, o valor 1.0 não alterará a mesma." + +#: models.py:688 +msgid "sharpness" +msgstr "nitidez" + +#: models.py:690 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "O valor 0.0 deixará a imagem embaçada, o valor 1.0 não alterará a mesma." + +#: models.py:692 +msgid "filters" +msgstr "filtros" + +#: models.py:696 +msgid "size" +msgstr "tamanho" + +#: models.py:698 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "Valor entre 0 e 1. O reflexo será proporcional a altura da imagem. O valor 0.0 não produzirá um reflexo e o valor 1.0 produzirá um reflexo com a mesma altura da imagem original." + +#: models.py:701 +msgid "strength" +msgstr "força" + +#: models.py:703 +msgid "The initial opacity of the reflection gradient." +msgstr "O valor inicial da opacidade do gradiente de reflexão." + +#: models.py:707 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "A cor de fundo do gradiente de reflexão. Ajuste de acordo com a cor de fundo de sua página." + +#: models.py:711 models.py:815 +msgid "photo effect" +msgstr "efeito de foto" + +#: models.py:712 +msgid "photo effects" +msgstr "efeitos de foto" + +#: models.py:743 +msgid "style" +msgstr "estilo" + +#: models.py:747 +msgid "opacity" +msgstr "opacidade" + +#: models.py:749 +msgid "The opacity of the overlay." +msgstr "A opacidade da sobre-imagem (overlay)" + +#: models.py:752 +msgid "watermark" +msgstr "marca d'água" + +#: models.py:753 +msgid "watermarks" +msgstr "marcas d'água" + +#: models.py:775 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "O nome do tamanho da foto somente poderá conter letras, números e underscores. Exemplos: \"thumbnail\", \"tela\", \"pequeno\", \"grande\"." + +#: models.py:782 +msgid "width" +msgstr "largura" + +#: models.py:785 +msgid "If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "Se o valor da largura for \"0\", a imagem será redimensionada de acordo com a altura informada" + +#: models.py:786 +msgid "height" +msgstr "altura" + +#: models.py:789 +msgid "If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "Se o valor da altura for \"0\", a imagem será redimensionada de acordo com a largura informada" + +#: models.py:790 +msgid "quality" +msgstr "qualidade" + +#: models.py:793 +msgid "JPEG image quality." +msgstr "qualidade da imagem JPEG" + +#: models.py:794 +msgid "upscale images?" +msgstr "Aumentar a dimensão das imagens?" + +#: models.py:796 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "Se selecionado, a imagem terá sua dimensão aumentada. Imagens cortadas serão redimensionadas independentemente desta configuração." + +#: models.py:800 +msgid "crop to fit?" +msgstr "cortar para conformar?" + +#: models.py:802 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "Se selecionado, a imagem será redimensionada e cortada para se conformar de acordo com as dimensões fornecidas." + +#: models.py:804 +msgid "pre-cache?" +msgstr "pré-cachear?" + +#: models.py:806 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "Se selecionado, o tamanho da foto será pré-cacheado logo após sua inclusão." + +#: models.py:807 +msgid "increment view count?" +msgstr "Incrementar o contador de visualizações?" + +#: models.py:809 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "Se selecionado, o \"view_count\" desta imagem será incrementado quando o tamanho da mesma for mostrado." + +#: models.py:821 +msgid "watermark image" +msgstr "imagem para marca d'água" + +#: models.py:826 +msgid "photo size" +msgstr "tamanho da foto" + +#: models.py:827 +msgid "photo sizes" +msgstr "tamanhos das fotos" + +#: models.py:844 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "" + +#: templates/admin/photologue/photo/change_list.html:9 +msgid "Upload a zip archive" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:15 +msgid "Home" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:19 +#: templates/admin/photologue/photo/upload_zip.html:53 +msgid "Upload" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:28 +msgid "" +"\n" +"\t\t

On this page you can upload many photos at once, as long as you have\n" +"\t\tput them all in a zip archive. The photos can be either:

\n" +"\t\t
    \n" +"\t\t\t
  • Added to an existing gallery.
  • \n" +"\t\t\t
  • Otherwise, a new gallery is created with the supplied title.
  • \n" +"\t\t
\n" +"\t" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the error below." +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the errors below." +msgstr "" + +#: templates/photologue/gallery_archive.html:4 +#: templates/photologue/gallery_archive.html:9 +msgid "Latest photo galleries" +msgstr "" + +#: templates/photologue/gallery_archive.html:16 +#: templates/photologue/photo_archive.html:16 +msgid "Filter by year" +msgstr "" + +#: templates/photologue/gallery_archive.html:32 +#: templates/photologue/gallery_list.html:26 +msgid "No galleries were found" +msgstr "" + +#: templates/photologue/gallery_archive_day.html:4 +#: templates/photologue/gallery_archive_day.html:9 +#, python-format +msgid "Galleries for %(show_day)s" +msgstr "" + +#: templates/photologue/gallery_archive_day.html:18 +#: templates/photologue/gallery_archive_month.html:32 +#: templates/photologue/gallery_archive_year.html:32 +msgid "No galleries were found." +msgstr "" + +#: templates/photologue/gallery_archive_day.html:22 +msgid "View all galleries for month" +msgstr "" + +#: templates/photologue/gallery_archive_month.html:4 +#: templates/photologue/gallery_archive_month.html:9 +#, python-format +msgid "Galleries for %(show_month)s" +msgstr "" + +#: templates/photologue/gallery_archive_month.html:16 +#: templates/photologue/photo_archive_month.html:16 +msgid "Filter by day" +msgstr "" + +#: templates/photologue/gallery_archive_month.html:35 +msgid "View all galleries for year" +msgstr "" + +#: templates/photologue/gallery_archive_year.html:4 +#: templates/photologue/gallery_archive_year.html:9 +#, python-format +msgid "Galleries for %(show_year)s" +msgstr "" + +#: templates/photologue/gallery_archive_year.html:16 +#: templates/photologue/photo_archive_year.html:17 +msgid "Filter by month" +msgstr "" + +#: templates/photologue/gallery_archive_year.html:35 +#: templates/photologue/gallery_detail.html:17 +msgid "View all galleries" +msgstr "" + +#: templates/photologue/gallery_detail.html:10 +#: templates/photologue/gallery_list.html:16 +#: templates/photologue/includes/gallery_sample.html:8 +#: templates/photologue/photo_detail.html:10 +msgid "Published" +msgstr "" + +#: templates/photologue/gallery_list.html:4 +#: templates/photologue/gallery_list.html:9 +msgid "All galleries" +msgstr "" + +#: templates/photologue/includes/paginator.html:6 +#: templates/photologue/includes/paginator.html:8 +msgid "Previous" +msgstr "" + +#: templates/photologue/includes/paginator.html:11 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "" + +#: templates/photologue/includes/paginator.html:16 +#: templates/photologue/includes/paginator.html:18 +msgid "Next" +msgstr "" + +#: templates/photologue/photo_archive.html:4 +#: templates/photologue/photo_archive.html:9 +msgid "Latest photos" +msgstr "" + +#: templates/photologue/photo_archive.html:34 +#: templates/photologue/photo_archive_day.html:21 +#: templates/photologue/photo_archive_month.html:36 +#: templates/photologue/photo_archive_year.html:37 +#: templates/photologue/photo_list.html:21 +msgid "No photos were found" +msgstr "" + +#: templates/photologue/photo_archive_day.html:4 +#: templates/photologue/photo_archive_day.html:9 +#, python-format +msgid "Photos for %(show_day)s" +msgstr "" + +#: templates/photologue/photo_archive_day.html:24 +msgid "View all photos for month" +msgstr "" + +#: templates/photologue/photo_archive_month.html:4 +#: templates/photologue/photo_archive_month.html:9 +#, python-format +msgid "Photos for %(show_month)s" +msgstr "" + +#: templates/photologue/photo_archive_month.html:39 +msgid "View all photos for year" +msgstr "" + +#: templates/photologue/photo_archive_year.html:4 +#: templates/photologue/photo_archive_year.html:10 +#, python-format +msgid "Photos for %(show_year)s" +msgstr "" + +#: templates/photologue/photo_archive_year.html:40 +msgid "View all photos" +msgstr "" + +#: templates/photologue/photo_detail.html:22 +msgid "This photo is found in the following galleries" +msgstr "" + +#: templates/photologue/photo_list.html:4 +#: templates/photologue/photo_list.html:9 +msgid "All photos" +msgstr "" + +#~ msgid "" +#~ "All uploaded photos will be given a title made up of this title + a " +#~ "sequential number." +#~ msgstr "" +#~ "All photos in the gallery will be given a title made up of the gallery title" +#~ " + a sequential number." + +#~ msgid "Separate tags with spaces, put quotes around multiple-word tags." +#~ msgstr "Separate tags with spaces, put quotes around multiple-word tags." + +#~ msgid "Django-tagging was not found, tags will be treated as plain text." +#~ msgstr "Django-tagging was not found, tags will be treated as plain text." + +#~ msgid "tags" +#~ msgstr "tags" + +#~ msgid "images file (.zip)" +#~ msgstr "images file (.zip)" + +#~ msgid "gallery upload" +#~ msgstr "gallery upload" + +#~ msgid "gallery uploads" +#~ msgstr "gallery uploads" diff --git a/photologue/locale/pt_BR/LC_MESSAGES/django.mo b/photologue/locale/pt_BR/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..2b7d0b7504459360da3da72a2c8c6743a7954875 GIT binary patch literal 7849 zcmb`LS!`X$dB-P97c)(hxUtiuPBLNRnrw70N!xW~Dw3>)l4VOKOHodYF2wMjx%ZBB z?wRAWh@=`IL1Dx|w;(Q(x1cb(7)I-&Xkj4mQwt_Q0p~F&+C10~?Mt_(6fIDsXn)_# z+=aAkr-lzW_kZTh%s1bB^R0aK_V<2W@jOnui}u}jEA=Jti$BH>&)!cc^#HgJegXUo z@G8t~Rq!?NS3v(hrOtt`fEU3J{FG8Z1AZQq_1D4ofF&sVHy~5hZ-9_c&wx*Z&w|In zkGvn=zztB2`rDxJ^)>M4z&`?i9{lSx{!gH#|1aQQf*U`r)Drlf55)QRfgDY(gTl`f zpz!nS;G^J98vk<;5vgy1!q?w`h*W(S6h6L}#=oEX{|E}*e+FS){Q#78B2-vV?*pa( zF;LEXHz?;{0fp{yP}V<``j4dXO;GlG0=xs<24!9g3jbdMW&P8j%=;Zs_J0;c1nLh! z+4n_I_Wc$p`+hrpe+88Fe+LSmuYyAV-$9}OUkQH*iag%+p}5an!ViK%|4xu2t51Ql zekJu!r13{V;qP(qo9|NUSHaKH|8Fky&%k?864B4sz{}u$ACCPmgXigg50v#EMF?H+ zlOQaq$H2b@w?WZ^g*)RtUj~K$A^2X91pX^1be==G?*{(?6nXwHDD-Z__~l$50yn`sL6N@$<$fDb=zbZL`Oko&-(LlV z&hLYAu5W@e?@vHPqFw~qT74T7eqRGW4*mxybZ@64^FIL!-Mc}d(@FgY()g)_Yv3<3 zei;=0c0u9$H$ma!nbiLpD0=q|Q1s`I6TSqBoqq=u`TspA`ur*=>;DZDzW);xe%}9y zho=49iF7E(NOiE z>p<|Wr$FI-ktVt&&+!Q1Z0R+?MSjI^%5#B+TB}E-lb(kY%H7V>L?=Yf%e3)B=n1-c z@A$(EitJ9z^hKBDxkNih6PbRRrfG;a*w81z725cbdlMa$dlDVGk0v_!5UoS|1)BH> zd6sCRU-Ep8wh`W9jKsx+SeHHpSmk$%c5U_}@4uY-XTkevVq4)kqvz|q9n5Q2Yopu3 zJ=I!$ZS!)cUpZT3`Mz#klUv>Ql{SU;J5SnP(^Y45-}D;3`MzH6F6)82VTHg>ZhF_5 znCac2Ypix7GqA@Pm`-1rOmBu(`^pVmVe&Zhtq8w^wEASDp1u<45Y8DI4btz3cLv z8QNqS=VGa$ABfalb@JomfO zD^0@~EMB;Dd24NRd;PJs&Z+di_4)Pb`@@@SYx7-wNv?cCal%$v=1v5T4po`0x_ax- zE@KW%#Sv~G0kf0aRed+iU&vjlbK7s^RH)0aiJux@%9ouehld$Zm->2WWrnD8ZNrNB z<@s=;pgR*W)jg9(Imv13HnF$svL=wJZH}VL42EyHRFu3|`Lc{;`i|XZNo8(ii<+z9 z2=MjR1lv-(zAkLf*0rfHJdYILn5aINHWwYKCkJcGbhOG2OqJyj6C-VgQ6ddj`Ud>m zQ|tK~&hBpad|Nd06N;|rRhF}eGRtDIW$Uh9+cP5!tX|dg zQ`D+njx1oB6KVXm@hg(*tH${PFabC-N4961BrEh-GWJ zKol-543ZsGrX2q0OE-gsZTiOGzgLbgLmIbcYn47dIQgP`x$j-yb+x_Km?)90I@38< z#pKi$%=+ag_=!>sPGb9vEBauED;&80uhG&?3eOwE3%*+&RMel@lIp1N9 z4(}IOc7=&Hvp?kN~dcoTEk368nI+o)cQNGe<{zeQ7-y5R+d zP~tIlzansjx9H_JPvD%4sFODHxa%3s*^)DjYff>ax7-g}JGW^|Up1X8^}uDFv+bbnZ246^x3S*Yv^Shg z@0@3|RekUB%4a*v4|Y}_)GPO|F0XuMnP=`YciY*jOi|~Cgm6`Fx*q4t^jTB!Re!FE z{fA6N{?g$Nv9fN@ciZcySX>NROt7V>nFx#{vny)bN=a&>8GcXzjo zA`wyhc8~R=r9^lq?6Z_T2`%3VHx&-Hlqcd#WwU*Db7^tz%B3r7QxTAd&YeR!aRQyK z{gMMVcCT3?jJe{3mNSq*oV>Pmp>upXPZ;Rq)z*rh&j_Wf`uL7(Cg)hyVXwK3ysb>$ zx!|i2uD>Wlw?29A2_0WgE)@EdURgXbr>>308Ti2qx*h4};KioRy*_xka6ONzj!3`` zUc6y*d1r=^^t`Lq^$jDgQ?l>Ox;;}JJcnBg`aaTjq|rmH3ug<@J%3D-O~?gl$-j$( zKa>O!6-vuSmN3*k>hj*Ptp3fJZ7`2KBp88dBfQ4Ly$P>xDS#bw@Vv?15n?k8_FQrE zN2JNkHfCgsp(iL+Mv5Rw=`(+eY#*J=OuUx9cM{DB1(_$yH*U{UZsm4BIc7*B!#!uN zhhcKONV@Tv1hqQsP=|EC@_J#zWED5Ps8Cm2ytCts-!qexzXIEuq{Sog+74QWIY2S2 ziV6Sb`u4ReF~{fi{Q9MGfBl&u?~BUz3wMEMM9{WDHvoh1B_KT)07Gl(~}KFQBx(36L}GLMwlYELt4x7ucAK`^m+b7gh#LaZ``Ix#^M^Wd*ICISfwPCaIO zMjgf%`Zo0;Y1334LJp8&eWJ4I@KTnjwXwd6i5qq0;DyYMp>sy`G=A#D@pW=f$`DTS zy3_JK*sZ7V;Jzi}!a^uc$h)Xb4qhHvv2=U1G_jN>{&l5EV{;?rNJ;8y3ooxEcRDoeka=n-uHoQ=tThJ+4Ni&WhRno~VvK z^JH7&F^?GPk>&F51)R{qbMlWalIIY%;gkP#EORL<_`pO{_?H_jNs@gPj+f&PqW~!O^_JYqT!Pmwf0|in5CPr^Uj>hBuN_N)~a| zG9nP!n0V_@!x)^H1UW}7lOnWVFpE;egwPSojp#4qM-nwzl5zuC**M&sQFu#=op4}^ z9Ri&X#SVr%vBL3-iub0XSc!k>|26O^VM@Gx)MwIp`7g*#VF0^4tw=c|OJ0e0i6xL+ zsS@d>eS;-TyM!S*BEv@<(YViqvG@ZSDTyYYxJp$~*hK20WW>JZ{$gxbQUquA=9r!e z1rYw2d`_VVE@$hcCNdO!V(OoX(M|MX8uEmlAe(|Cqfk8t@4*~flSCG;^6*ILag;PM Hg$4D0PN&zk literal 0 HcmV?d00001 diff --git a/photologue/locale/pt_BR/LC_MESSAGES/django.po b/photologue/locale/pt_BR/LC_MESSAGES/django.po new file mode 100644 index 0000000..cf9cc55 --- /dev/null +++ b/photologue/locale/pt_BR/LC_MESSAGES/django.po @@ -0,0 +1,764 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Translators: +# David Kwast , 2009 +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-09-03 21:22+0000\n" +"PO-Revision-Date: 2017-09-19 14:01+0000\n" +"Last-Translator: Richard Barran \n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/richardbarran/django-photologue/language/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: admin.py:61 +#, python-format +msgid "" +"The following photo does not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgid_plural "" +"The following photos do not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgstr[0] "" +msgstr[1] "" + +#: admin.py:73 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:80 +msgid "Add selected galleries to the current site" +msgstr "" + +#: admin.py:86 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:93 +msgid "Remove selected galleries from the current site" +msgstr "" + +#: admin.py:100 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:108 +msgid "Add all photos of selected galleries to the current site" +msgstr "" + +#: admin.py:115 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:123 +msgid "Remove all photos in selected galleries from the current site" +msgstr "" + +#: admin.py:164 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:171 +msgid "Add selected photos to the current site" +msgstr "" + +#: admin.py:177 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "" +"The selected photos have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:184 +msgid "Remove selected photos from the current site" +msgstr "" + +#: admin.py:198 templates/admin/photologue/photo/upload_zip.html:27 +msgid "Upload a zip archive of photos" +msgstr "" + +#: forms.py:27 +#| msgid "title" +msgid "Title" +msgstr "" + +#: forms.py:30 +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number.
This field is required if creating a new gallery, but " +"is optional when adding to an existing gallery - if not supplied, the photo " +"titles will be creating from the existing gallery name." +msgstr "" + +#: forms.py:36 +#| msgid "gallery" +msgid "Gallery" +msgstr "" + +#: forms.py:38 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "" + +#: forms.py:40 +#| msgid "caption" +msgid "Caption" +msgstr "" + +#: forms.py:42 +msgid "Caption will be added to all photos." +msgstr "A legenda será adicionada para todas as fotos" + +#: forms.py:43 +#| msgid "description" +msgid "Description" +msgstr "" + +#: forms.py:45 +#| msgid "A description of this Gallery." +msgid "A description of this Gallery. Only required for new galleries." +msgstr "" + +#: forms.py:46 +#| msgid "is public" +msgid "Is public" +msgstr "" + +#: forms.py:49 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "Desmarque esta opção para tornar a galeria, incluindo suas fotos, não pública." + +#: forms.py:72 +msgid "A gallery with that title already exists." +msgstr "" + +#: forms.py:82 +#| msgid "Select a .zip file of images to upload into a new Gallery." +msgid "Select an existing gallery, or enter a title for a new gallery." +msgstr "" + +#: forms.py:115 +#, python-brace-format +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "" + +#: forms.py:156 +#, python-brace-format +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "" + +#: forms.py:172 +#, python-brace-format +msgid "The photos have been added to gallery \"{0}\"." +msgstr "" + +#: models.py:98 +msgid "Very Low" +msgstr "Muito Baixa" + +#: models.py:99 +msgid "Low" +msgstr "Baixa" + +#: models.py:100 +msgid "Medium-Low" +msgstr "Média-Baixa" + +#: models.py:101 +msgid "Medium" +msgstr "Média" + +#: models.py:102 +msgid "Medium-High" +msgstr "Média-Alta" + +#: models.py:103 +msgid "High" +msgstr "Alta" + +#: models.py:104 +msgid "Very High" +msgstr "Muito Alta" + +#: models.py:109 +msgid "Top" +msgstr "Cima" + +#: models.py:110 +msgid "Right" +msgstr "Direita" + +#: models.py:111 +msgid "Bottom" +msgstr "Baixo" + +#: models.py:112 +msgid "Left" +msgstr "Esquerda" + +#: models.py:113 +msgid "Center (Default)" +msgstr "Centro (Padrão)" + +#: models.py:117 +msgid "Flip left to right" +msgstr "Inverter da direita para a esquerda" + +#: models.py:118 +msgid "Flip top to bottom" +msgstr "Inverter de cima para baixo" + +#: models.py:119 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Rotacionar 90 graus no sentido anti-horário" + +#: models.py:120 +msgid "Rotate 90 degrees clockwise" +msgstr "Rotacionar 90 graus no sentido horário" + +#: models.py:121 +msgid "Rotate 180 degrees" +msgstr "Rotacionar 180 graus" + +#: models.py:125 +msgid "Tile" +msgstr "Título" + +#: models.py:126 +msgid "Scale" +msgstr "Escala" + +#: models.py:136 +#, python-format +msgid "" +"Chain multiple filters using the following pattern " +"\"FILTER_ONE->FILTER_TWO->FILTER_THREE\". Image filters will be applied in " +"order. The following filters are available: %s." +msgstr "Encadeie multiplos filtros usando o seguinte padrão \"FILTRO_UM->FILTRO_DOIS->FILTRO_TRÊS\". Os filtors serão aplicados na ordem em que foram encadeados. Os seguintes filtros estão disponíveis: %s." + +#: models.py:158 +msgid "date published" +msgstr "data de publicação" + +#: models.py:160 models.py:513 +msgid "title" +msgstr "título" + +#: models.py:163 +msgid "title slug" +msgstr "slug do título" + +#: models.py:166 models.py:519 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "Um \"slug\" é um título único compatível com uma URL." + +#: models.py:167 models.py:596 +msgid "description" +msgstr "descrição" + +#: models.py:169 models.py:524 +msgid "is public" +msgstr "é publico" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Galerias públicas serão mostradas nas views padrões." + +#: models.py:175 models.py:536 +msgid "photos" +msgstr "fotos" + +#: models.py:177 models.py:527 +msgid "sites" +msgstr "" + +#: models.py:185 +msgid "gallery" +msgstr "Galeria" + +#: models.py:186 +msgid "galleries" +msgstr "Galerias" + +#: models.py:224 +msgid "count" +msgstr "contagem" + +#: models.py:240 models.py:741 +msgid "image" +msgstr "imagem" + +#: models.py:243 +msgid "date taken" +msgstr "data em que a foto foi tirada" + +#: models.py:246 +msgid "Date image was taken; is obtained from the image EXIF data." +msgstr "" + +#: models.py:247 +msgid "view count" +msgstr "" + +#: models.py:250 +msgid "crop from" +msgstr "cortar" + +#: models.py:259 +msgid "effect" +msgstr "efeito" + +#: models.py:279 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "Um tamanho para a foto do \"admin_thumbnail\" ainda não foi definido." + +#: models.py:286 +msgid "Thumbnail" +msgstr "Thumbnail" + +#: models.py:516 +msgid "slug" +msgstr "slug" + +#: models.py:520 +msgid "caption" +msgstr "legenda" + +#: models.py:522 +msgid "date added" +msgstr "data que foi adicionado(a)" + +#: models.py:526 +msgid "Public photographs will be displayed in the default views." +msgstr "Fotos públicas serão mostradas nas views padrões." + +#: models.py:535 +msgid "photo" +msgstr "foto" + +#: models.py:593 models.py:771 +msgid "name" +msgstr "nome" + +#: models.py:672 +msgid "rotate or flip" +msgstr "rotacionar ou inverter" + +#: models.py:676 models.py:704 +msgid "color" +msgstr "cor" + +#: models.py:678 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "O valor 0.0 deixará a imagem em preto e branco, o fator 1.0 não alterará a mesma.A factor of 0.0 gives a black and white image, a factor of 1.0 gives the original image." + +#: models.py:680 +msgid "brightness" +msgstr "brilho" + +#: models.py:682 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "O valor 0.0 deixará a imagem totalmente preta, o valor 1.0 não alterará a mesma." + +#: models.py:684 +msgid "contrast" +msgstr "contraste" + +#: models.py:686 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original" +" image." +msgstr "O valor 0.0 deixará a imagem totalmente cinza, o valor 1.0 não alterará a mesma." + +#: models.py:688 +msgid "sharpness" +msgstr "nitidez" + +#: models.py:690 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "O valor 0.0 deixará a imagem embaçada, o valor 1.0 não alterará a mesma." + +#: models.py:692 +msgid "filters" +msgstr "filtros" + +#: models.py:696 +msgid "size" +msgstr "tamanho" + +#: models.py:698 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "Valor entre 0 e 1. O reflexo será proporcional a altura da imagem. O valor 0.0 não produzirá um reflexo e o valor 1.0 produzirá um reflexo com a mesma altura da imagem original." + +#: models.py:701 +msgid "strength" +msgstr "força" + +#: models.py:703 +msgid "The initial opacity of the reflection gradient." +msgstr "O valor inicial da opacidade do gradiente de reflexão." + +#: models.py:707 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "A cor de fundo do gradiente de reflexão. Ajuste de acordo com a cor de fundo de sua página." + +#: models.py:711 models.py:815 +msgid "photo effect" +msgstr "efeito de foto" + +#: models.py:712 +msgid "photo effects" +msgstr "efeitos de foto" + +#: models.py:743 +msgid "style" +msgstr "estilo" + +#: models.py:747 +msgid "opacity" +msgstr "opacidade" + +#: models.py:749 +msgid "The opacity of the overlay." +msgstr "A opacidade da sobre-imagem (overlay)" + +#: models.py:752 +msgid "watermark" +msgstr "marca d'água" + +#: models.py:753 +msgid "watermarks" +msgstr "marcas d'água" + +#: models.py:775 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "O nome do tamanho da foto somente poderá conter letras, números e underscores. Exemplos: \"thumbnail\", \"tela\", \"pequeno\", \"grande\"." + +#: models.py:782 +msgid "width" +msgstr "largura" + +#: models.py:785 +msgid "If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "Se o valor da largura for \"0\", a imagem será redimensionada de acordo com a altura informada" + +#: models.py:786 +msgid "height" +msgstr "altura" + +#: models.py:789 +msgid "If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "Se o valor da altura for \"0\", a imagem será redimensionada de acordo com a largura informada" + +#: models.py:790 +msgid "quality" +msgstr "qualidade" + +#: models.py:793 +msgid "JPEG image quality." +msgstr "qualidade da imagem JPEG" + +#: models.py:794 +msgid "upscale images?" +msgstr "Aumentar a dimensão das imagens?" + +#: models.py:796 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "Se selecionado, a imagem terá sua dimensão aumentada. Imagens cortadas serão redimensionadas independentemente desta configuração." + +#: models.py:800 +msgid "crop to fit?" +msgstr "cortar para conformar?" + +#: models.py:802 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "Se selecionado, a imagem será redimensionada e cortada para se conformar de acordo com as dimensões fornecidas." + +#: models.py:804 +msgid "pre-cache?" +msgstr "pré-cachear?" + +#: models.py:806 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "Se selecionado, o tamanho da foto será pré-cacheado logo após sua inclusão." + +#: models.py:807 +msgid "increment view count?" +msgstr "Incrementar o contador de visualizações?" + +#: models.py:809 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "Se selecionado, o \"view_count\" desta imagem será incrementado quando o tamanho da mesma for mostrado." + +#: models.py:821 +msgid "watermark image" +msgstr "imagem para marca d'água" + +#: models.py:826 +msgid "photo size" +msgstr "tamanho da foto" + +#: models.py:827 +msgid "photo sizes" +msgstr "tamanhos das fotos" + +#: models.py:844 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "" + +#: templates/admin/photologue/photo/change_list.html:9 +msgid "Upload a zip archive" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:15 +msgid "Home" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:19 +#: templates/admin/photologue/photo/upload_zip.html:53 +msgid "Upload" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:28 +msgid "" +"\n" +"\t\t

On this page you can upload many photos at once, as long as you have\n" +"\t\tput them all in a zip archive. The photos can be either:

\n" +"\t\t
    \n" +"\t\t\t
  • Added to an existing gallery.
  • \n" +"\t\t\t
  • Otherwise, a new gallery is created with the supplied title.
  • \n" +"\t\t
\n" +"\t" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the error below." +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the errors below." +msgstr "" + +#: templates/photologue/gallery_archive.html:4 +#: templates/photologue/gallery_archive.html:9 +msgid "Latest photo galleries" +msgstr "" + +#: templates/photologue/gallery_archive.html:16 +#: templates/photologue/photo_archive.html:16 +msgid "Filter by year" +msgstr "" + +#: templates/photologue/gallery_archive.html:32 +#: templates/photologue/gallery_list.html:26 +msgid "No galleries were found" +msgstr "" + +#: templates/photologue/gallery_archive_day.html:4 +#: templates/photologue/gallery_archive_day.html:9 +#, python-format +msgid "Galleries for %(show_day)s" +msgstr "" + +#: templates/photologue/gallery_archive_day.html:18 +#: templates/photologue/gallery_archive_month.html:32 +#: templates/photologue/gallery_archive_year.html:32 +msgid "No galleries were found." +msgstr "" + +#: templates/photologue/gallery_archive_day.html:22 +msgid "View all galleries for month" +msgstr "" + +#: templates/photologue/gallery_archive_month.html:4 +#: templates/photologue/gallery_archive_month.html:9 +#, python-format +msgid "Galleries for %(show_month)s" +msgstr "" + +#: templates/photologue/gallery_archive_month.html:16 +#: templates/photologue/photo_archive_month.html:16 +msgid "Filter by day" +msgstr "" + +#: templates/photologue/gallery_archive_month.html:35 +msgid "View all galleries for year" +msgstr "" + +#: templates/photologue/gallery_archive_year.html:4 +#: templates/photologue/gallery_archive_year.html:9 +#, python-format +msgid "Galleries for %(show_year)s" +msgstr "" + +#: templates/photologue/gallery_archive_year.html:16 +#: templates/photologue/photo_archive_year.html:17 +msgid "Filter by month" +msgstr "" + +#: templates/photologue/gallery_archive_year.html:35 +#: templates/photologue/gallery_detail.html:17 +msgid "View all galleries" +msgstr "" + +#: templates/photologue/gallery_detail.html:10 +#: templates/photologue/gallery_list.html:16 +#: templates/photologue/includes/gallery_sample.html:8 +#: templates/photologue/photo_detail.html:10 +msgid "Published" +msgstr "" + +#: templates/photologue/gallery_list.html:4 +#: templates/photologue/gallery_list.html:9 +msgid "All galleries" +msgstr "" + +#: templates/photologue/includes/paginator.html:6 +#: templates/photologue/includes/paginator.html:8 +msgid "Previous" +msgstr "" + +#: templates/photologue/includes/paginator.html:11 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "" + +#: templates/photologue/includes/paginator.html:16 +#: templates/photologue/includes/paginator.html:18 +msgid "Next" +msgstr "" + +#: templates/photologue/photo_archive.html:4 +#: templates/photologue/photo_archive.html:9 +msgid "Latest photos" +msgstr "" + +#: templates/photologue/photo_archive.html:34 +#: templates/photologue/photo_archive_day.html:21 +#: templates/photologue/photo_archive_month.html:36 +#: templates/photologue/photo_archive_year.html:37 +#: templates/photologue/photo_list.html:21 +msgid "No photos were found" +msgstr "" + +#: templates/photologue/photo_archive_day.html:4 +#: templates/photologue/photo_archive_day.html:9 +#, python-format +msgid "Photos for %(show_day)s" +msgstr "" + +#: templates/photologue/photo_archive_day.html:24 +msgid "View all photos for month" +msgstr "" + +#: templates/photologue/photo_archive_month.html:4 +#: templates/photologue/photo_archive_month.html:9 +#, python-format +msgid "Photos for %(show_month)s" +msgstr "" + +#: templates/photologue/photo_archive_month.html:39 +msgid "View all photos for year" +msgstr "" + +#: templates/photologue/photo_archive_year.html:4 +#: templates/photologue/photo_archive_year.html:10 +#, python-format +msgid "Photos for %(show_year)s" +msgstr "" + +#: templates/photologue/photo_archive_year.html:40 +msgid "View all photos" +msgstr "" + +#: templates/photologue/photo_detail.html:22 +msgid "This photo is found in the following galleries" +msgstr "" + +#: templates/photologue/photo_list.html:4 +#: templates/photologue/photo_list.html:9 +msgid "All photos" +msgstr "" + +#~ msgid "" +#~ "All uploaded photos will be given a title made up of this title + a " +#~ "sequential number." +#~ msgstr "" +#~ "All photos in the gallery will be given a title made up of the gallery title" +#~ " + a sequential number." + +#~ msgid "Separate tags with spaces, put quotes around multiple-word tags." +#~ msgstr "Separate tags with spaces, put quotes around multiple-word tags." + +#~ msgid "Django-tagging was not found, tags will be treated as plain text." +#~ msgstr "Django-tagging was not found, tags will be treated as plain text." + +#~ msgid "tags" +#~ msgstr "tags" + +#~ msgid "images file (.zip)" +#~ msgstr "images file (.zip)" + +#~ msgid "gallery upload" +#~ msgstr "gallery upload" + +#~ msgid "gallery uploads" +#~ msgstr "gallery uploads" diff --git a/photologue/locale/ru/LC_MESSAGES/django.mo b/photologue/locale/ru/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..b1a5fa7ea65829690c347d0362a470334820aa1e GIT binary patch literal 16852 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 BJ1GDF literal 0 HcmV?d00001 diff --git a/photologue/locale/ru/LC_MESSAGES/django.po b/photologue/locale/ru/LC_MESSAGES/django.po new file mode 100644 index 0000000..7ea66cb --- /dev/null +++ b/photologue/locale/ru/LC_MESSAGES/django.po @@ -0,0 +1,778 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Translators: +# AduchiMergen , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-09-03 21:22+0000\n" +"PO-Revision-Date: 2017-09-19 14:01+0000\n" +"Last-Translator: AduchiMergen \n" +"Language-Team: Russian (http://www.transifex.com/richardbarran/django-photologue/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=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: admin.py:61 +#, python-format +msgid "" +"The following photo does not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgid_plural "" +"The following photos do not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: admin.py:73 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: admin.py:80 +msgid "Add selected galleries to the current site" +msgstr "" + +#: admin.py:86 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: admin.py:93 +msgid "Remove selected galleries from the current site" +msgstr "" + +#: admin.py:100 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: admin.py:108 +msgid "Add all photos of selected galleries to the current site" +msgstr "" + +#: admin.py:115 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: admin.py:123 +msgid "Remove all photos in selected galleries from the current site" +msgstr "" + +#: admin.py:164 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: admin.py:171 +msgid "Add selected photos to the current site" +msgstr "" + +#: admin.py:177 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "" +"The selected photos have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: admin.py:184 +msgid "Remove selected photos from the current site" +msgstr "" + +#: admin.py:198 templates/admin/photologue/photo/upload_zip.html:27 +msgid "Upload a zip archive of photos" +msgstr "Загрузка Zip архива с фотографиями" + +#: forms.py:27 +#| msgid "title" +msgid "Title" +msgstr "Название" + +#: forms.py:30 +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number.
This field is required if creating a new gallery, but " +"is optional when adding to an existing gallery - if not supplied, the photo " +"titles will be creating from the existing gallery name." +msgstr "Всем загруженным фотографиям будет присвоено название составленное из этого названия и порядкового номера изображения.
Это поле является обязательным, для создания новой галереи, но не является обязательным при добавлении к существующей галерее - если не указано, названия фото будут созданы из имени галереи." + +#: forms.py:36 +#| msgid "gallery" +msgid "Gallery" +msgstr "Галерея" + +#: forms.py:38 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "Выберете галерею для загрузки фотографий. Оставьте поле пустым для создания новой галереи с соответствующим названием." + +#: forms.py:40 +#| msgid "caption" +msgid "Caption" +msgstr "Описание" + +#: forms.py:42 +msgid "Caption will be added to all photos." +msgstr "Описание будет добавлено ко всем фотографиям." + +#: forms.py:43 +#| msgid "description" +msgid "Description" +msgstr "Описание галереи" + +#: forms.py:45 +#| msgid "A description of this Gallery." +msgid "A description of this Gallery. Only required for new galleries." +msgstr "Описание для этой галереи. Необходимо только для новой галереи." + +#: forms.py:46 +#| msgid "is public" +msgid "Is public" +msgstr "Опубликовать" + +#: forms.py:49 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "Снимите эту галку, чтобы сделать загруженную галерею и включенные в нее фотографии приватными." + +#: forms.py:72 +msgid "A gallery with that title already exists." +msgstr "Уже существует галерея с таким названием" + +#: forms.py:82 +#| msgid "Select a .zip file of images to upload into a new Gallery." +msgid "Select an existing gallery, or enter a title for a new gallery." +msgstr "Выберете существующую галерею, или введите название новой галереи" + +#: forms.py:115 +#, python-brace-format +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "Файл \"{filename}\" пропущен, так как находится в поддиректории; все изображения должны находиться в корневой директории архива." + +#: forms.py:156 +#, python-brace-format +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "Не удалось обработать файл \"{0}\" в .zip архиве." + +#: forms.py:172 +#, python-brace-format +msgid "The photos have been added to gallery \"{0}\"." +msgstr "Фотографии были добавлены в галерею \"{0}\"." + +#: models.py:98 +msgid "Very Low" +msgstr "Очень низкое" + +#: models.py:99 +msgid "Low" +msgstr "Низкое" + +#: models.py:100 +msgid "Medium-Low" +msgstr "Чуть хуже среднего" + +#: models.py:101 +msgid "Medium" +msgstr "Среднее" + +#: models.py:102 +msgid "Medium-High" +msgstr "Чуть лучше среднего" + +#: models.py:103 +msgid "High" +msgstr "Высокое" + +#: models.py:104 +msgid "Very High" +msgstr "Очень высокое" + +#: models.py:109 +msgid "Top" +msgstr "Верхняя сторона" + +#: models.py:110 +msgid "Right" +msgstr "Правая сторона" + +#: models.py:111 +msgid "Bottom" +msgstr "Нижняя сторона" + +#: models.py:112 +msgid "Left" +msgstr "Левая сторона" + +#: models.py:113 +msgid "Center (Default)" +msgstr "Центр (По-умолчанию)" + +#: models.py:117 +msgid "Flip left to right" +msgstr "Зеркально отобразить слева направо" + +#: models.py:118 +msgid "Flip top to bottom" +msgstr "Зеркально отобразить сверху вниз" + +#: models.py:119 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Повернуть на 90 градусов против часовой стрелке" + +#: models.py:120 +msgid "Rotate 90 degrees clockwise" +msgstr "Повернуть на 90 градусов по часовой стрелке" + +#: models.py:121 +msgid "Rotate 180 degrees" +msgstr "Повернуть на 180 градусов" + +#: models.py:125 +msgid "Tile" +msgstr "Разместить мозайкой" + +#: models.py:126 +msgid "Scale" +msgstr "Масштабировать" + +#: models.py:136 +#, python-format +msgid "" +"Chain multiple filters using the following pattern " +"\"FILTER_ONE->FILTER_TWO->FILTER_THREE\". Image filters will be applied in " +"order. The following filters are available: %s." +msgstr "Цепочка фильтров для изображений (\"ФИЛЬТР_1->ФИЛЬТР_2->ФИЛЬТР_3\"). Фильтры будут применены по порядку. Доступны следующие фильтры: %s." + +#: models.py:158 +msgid "date published" +msgstr "дата публикации" + +#: models.py:160 models.py:513 +msgid "title" +msgstr "название" + +#: models.py:163 +msgid "title slug" +msgstr "слаг название" + +#: models.py:166 models.py:519 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "\"слаг\" - это уникальное читаемое название для объекта в адресной строке." + +#: models.py:167 models.py:596 +msgid "description" +msgstr "описание" + +#: models.py:169 models.py:524 +msgid "is public" +msgstr "публично" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Публичные галереи будут отображены в представлениях по-умолчанию." + +#: models.py:175 models.py:536 +msgid "photos" +msgstr "фотографии" + +#: models.py:177 models.py:527 +msgid "sites" +msgstr "" + +#: models.py:185 +msgid "gallery" +msgstr "галерея" + +#: models.py:186 +msgid "galleries" +msgstr "галереи" + +#: models.py:224 +msgid "count" +msgstr "количество" + +#: models.py:240 models.py:741 +msgid "image" +msgstr "изображение" + +#: models.py:243 +msgid "date taken" +msgstr "дата наложения" + +#: models.py:246 +msgid "Date image was taken; is obtained from the image EXIF data." +msgstr "" + +#: models.py:247 +msgid "view count" +msgstr "кол-во просмотров" + +#: models.py:250 +msgid "crop from" +msgstr "обрезанный из" + +#: models.py:259 +msgid "effect" +msgstr "эффект" + +#: models.py:279 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "Размер миниатюры \"admin_thumbnail\" не определен." + +#: models.py:286 +msgid "Thumbnail" +msgstr "Миниатюра" + +#: models.py:516 +msgid "slug" +msgstr "слаг" + +#: models.py:520 +msgid "caption" +msgstr "Описание" + +#: models.py:522 +msgid "date added" +msgstr "дата добавления" + +#: models.py:526 +msgid "Public photographs will be displayed in the default views." +msgstr "Публичные фотографии будут отображены в используемых представлениях по умолчанию." + +#: models.py:535 +msgid "photo" +msgstr "фотография" + +#: models.py:593 models.py:771 +msgid "name" +msgstr "имя" + +#: models.py:672 +msgid "rotate or flip" +msgstr "повернуть или зеркально отобразить" + +#: models.py:676 models.py:704 +msgid "color" +msgstr "цвет" + +#: models.py:678 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "Значение коэффициента 0.0 дает черно-белое изображение, а значение коэффициента 1.0 дает оригинальное изображение." + +#: models.py:680 +msgid "brightness" +msgstr "яркость" + +#: models.py:682 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "Значение коэффициента 0.0 дает черное изображение, а значение коэффициента 1.0 дает оригинальное изображение." + +#: models.py:684 +msgid "contrast" +msgstr "контраст" + +#: models.py:686 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original" +" image." +msgstr "Значение коэффициента 0.0 дает сплошное серое изображение, а значение коэффициента 1.0 дает оригинальное изображение." + +#: models.py:688 +msgid "sharpness" +msgstr "резкость" + +#: models.py:690 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "Значение коэффициента 0.0 дает расплывчатое изображение, а значение коэффициента 1.0 дает оригинальное изображение." + +#: models.py:692 +msgid "filters" +msgstr "фильтры" + +#: models.py:696 +msgid "size" +msgstr "размер" + +#: models.py:698 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "Высота отражения как процент от оригинального изображения. Значение коэффициента 0.0 не добавляет отображения, а значение коэффициента 1.0 добавляет отражение равное высоте оригинального изображения." + +#: models.py:701 +msgid "strength" +msgstr "сила" + +#: models.py:703 +msgid "The initial opacity of the reflection gradient." +msgstr "Начальная непрозрачность градиента отражения." + +#: models.py:707 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "Цвет фона градиента отражения. Отметьте это для соответствия цвету фона Вашей страницы." + +#: models.py:711 models.py:815 +msgid "photo effect" +msgstr "фотоэффект" + +#: models.py:712 +msgid "photo effects" +msgstr "фотоэффекты" + +#: models.py:743 +msgid "style" +msgstr "стиль" + +#: models.py:747 +msgid "opacity" +msgstr "непрозрачность" + +#: models.py:749 +msgid "The opacity of the overlay." +msgstr "Непрозрачность подложки." + +#: models.py:752 +msgid "watermark" +msgstr "водяной знак" + +#: models.py:753 +msgid "watermarks" +msgstr "водяные знаки" + +#: models.py:775 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "Название размера фотографии должно содержать только буквы, числа и символы подчеркивания. Примеры: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." + +#: models.py:782 +msgid "width" +msgstr "ширина" + +#: models.py:785 +msgid "If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "Если ширина выставлена в \"0\", то изображение будет мастштабировано по высоте." + +#: models.py:786 +msgid "height" +msgstr "высота" + +#: models.py:789 +msgid "If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "Если высота выставлена в \"0\", то изображение будет мастштабировано по ширине" + +#: models.py:790 +msgid "quality" +msgstr "качество" + +#: models.py:793 +msgid "JPEG image quality." +msgstr "качество JPEG изображения." + +#: models.py:794 +msgid "upscale images?" +msgstr "увеличивать изображения?" + +#: models.py:796 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "Если выбранно, то изображение будет масштабировано в случае необходимости, чтобы соответствовать габаритам. Обрезанные размеры будут увеличены в масштабе независимо от этой настройки." + +#: models.py:800 +msgid "crop to fit?" +msgstr "обрезать?" + +#: models.py:802 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "Если выбранно, то изображение будет масштабировано и обрезано, чтобы подходить по габаритам." + +#: models.py:804 +msgid "pre-cache?" +msgstr "кэшировать?" + +#: models.py:806 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "Если выбранно, то размер фотографии будет закэширован при добавлении фотографий" + +#: models.py:807 +msgid "increment view count?" +msgstr "увеличивать счетчик просмотров?" + +#: models.py:809 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "Если выбрано, то \"view_count\" изображения будет увеличено когда показывается этот размер фотографии." + +#: models.py:821 +msgid "watermark image" +msgstr "изображение водяного знака" + +#: models.py:826 +msgid "photo size" +msgstr "размер фотографии" + +#: models.py:827 +msgid "photo sizes" +msgstr "размеры фотографий" + +#: models.py:844 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "Можно обрезать фото только если установленны длинна и ширина." + +#: templates/admin/photologue/photo/change_list.html:9 +msgid "Upload a zip archive" +msgstr "Загрузить zip архив" + +#: templates/admin/photologue/photo/upload_zip.html:15 +msgid "Home" +msgstr "Главная" + +#: templates/admin/photologue/photo/upload_zip.html:19 +#: templates/admin/photologue/photo/upload_zip.html:53 +msgid "Upload" +msgstr "Загрузить" + +#: templates/admin/photologue/photo/upload_zip.html:28 +msgid "" +"\n" +"\t\t

On this page you can upload many photos at once, as long as you have\n" +"\t\tput them all in a zip archive. The photos can be either:

\n" +"\t\t
    \n" +"\t\t\t
  • Added to an existing gallery.
  • \n" +"\t\t\t
  • Otherwise, a new gallery is created with the supplied title.
  • \n" +"\t\t
\n" +"\t" +msgstr "\n

На этой странице вы можете загрузить несколько изображений за один раз, положив их все в zip архив. Вы можете:

\n
    \n
  • Добавить фото в новую галерею.
  • \n
  • Или, создать новую галерею с указанным названием.
  • \n
" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the error below." +msgstr "Пожалуйста исправьте ошибку ниже." + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the errors below." +msgstr "Пожалуйста исправьте ошибки ниже." + +#: templates/photologue/gallery_archive.html:4 +#: templates/photologue/gallery_archive.html:9 +msgid "Latest photo galleries" +msgstr "Последнии фото-галереи" + +#: templates/photologue/gallery_archive.html:16 +#: templates/photologue/photo_archive.html:16 +msgid "Filter by year" +msgstr "Фильтр по годам" + +#: templates/photologue/gallery_archive.html:32 +#: templates/photologue/gallery_list.html:26 +msgid "No galleries were found" +msgstr "Галереи не найдены" + +#: templates/photologue/gallery_archive_day.html:4 +#: templates/photologue/gallery_archive_day.html:9 +#, python-format +msgid "Galleries for %(show_day)s" +msgstr "Галереи за %(show_day)s" + +#: templates/photologue/gallery_archive_day.html:18 +#: templates/photologue/gallery_archive_month.html:32 +#: templates/photologue/gallery_archive_year.html:32 +msgid "No galleries were found." +msgstr "Галереи не найдены" + +#: templates/photologue/gallery_archive_day.html:22 +msgid "View all galleries for month" +msgstr "Посмотреть все галереи за месяц" + +#: templates/photologue/gallery_archive_month.html:4 +#: templates/photologue/gallery_archive_month.html:9 +#, python-format +msgid "Galleries for %(show_month)s" +msgstr "Галереи за %(show_month)s" + +#: templates/photologue/gallery_archive_month.html:16 +#: templates/photologue/photo_archive_month.html:16 +msgid "Filter by day" +msgstr "Фильтр по дням" + +#: templates/photologue/gallery_archive_month.html:35 +msgid "View all galleries for year" +msgstr "Посмотреть все галереи за год" + +#: templates/photologue/gallery_archive_year.html:4 +#: templates/photologue/gallery_archive_year.html:9 +#, python-format +msgid "Galleries for %(show_year)s" +msgstr "Галереи за %(show_year)s" + +#: templates/photologue/gallery_archive_year.html:16 +#: templates/photologue/photo_archive_year.html:17 +msgid "Filter by month" +msgstr "Фильтр по месяцам" + +#: templates/photologue/gallery_archive_year.html:35 +#: templates/photologue/gallery_detail.html:17 +msgid "View all galleries" +msgstr "Посмотреть все галереи" + +#: templates/photologue/gallery_detail.html:10 +#: templates/photologue/gallery_list.html:16 +#: templates/photologue/includes/gallery_sample.html:8 +#: templates/photologue/photo_detail.html:10 +msgid "Published" +msgstr "Опубликованно" + +#: templates/photologue/gallery_list.html:4 +#: templates/photologue/gallery_list.html:9 +msgid "All galleries" +msgstr "Все галереи" + +#: templates/photologue/includes/paginator.html:6 +#: templates/photologue/includes/paginator.html:8 +msgid "Previous" +msgstr "Предыдущая" + +#: templates/photologue/includes/paginator.html:11 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "\nстраница %(page_number)s из %(total_pages)s" + +#: templates/photologue/includes/paginator.html:16 +#: templates/photologue/includes/paginator.html:18 +msgid "Next" +msgstr "Следующая" + +#: templates/photologue/photo_archive.html:4 +#: templates/photologue/photo_archive.html:9 +msgid "Latest photos" +msgstr "Последнии фотографии" + +#: templates/photologue/photo_archive.html:34 +#: templates/photologue/photo_archive_day.html:21 +#: templates/photologue/photo_archive_month.html:36 +#: templates/photologue/photo_archive_year.html:37 +#: templates/photologue/photo_list.html:21 +msgid "No photos were found" +msgstr "Фотографии не найдены" + +#: templates/photologue/photo_archive_day.html:4 +#: templates/photologue/photo_archive_day.html:9 +#, python-format +msgid "Photos for %(show_day)s" +msgstr "Фотографии за %(show_day)s" + +#: templates/photologue/photo_archive_day.html:24 +msgid "View all photos for month" +msgstr "Все фотографии за месяц" + +#: templates/photologue/photo_archive_month.html:4 +#: templates/photologue/photo_archive_month.html:9 +#, python-format +msgid "Photos for %(show_month)s" +msgstr "Фотографии за %(show_month)s" + +#: templates/photologue/photo_archive_month.html:39 +msgid "View all photos for year" +msgstr "Все фотографии за год" + +#: templates/photologue/photo_archive_year.html:4 +#: templates/photologue/photo_archive_year.html:10 +#, python-format +msgid "Photos for %(show_year)s" +msgstr "Фотографии за %(show_year)s" + +#: templates/photologue/photo_archive_year.html:40 +msgid "View all photos" +msgstr "Посмотреть все фотографии" + +#: templates/photologue/photo_detail.html:22 +msgid "This photo is found in the following galleries" +msgstr "Эта фотография найдена в следующих галереях" + +#: templates/photologue/photo_list.html:4 +#: templates/photologue/photo_list.html:9 +msgid "All photos" +msgstr "Все фотографии" + +#~ msgid "" +#~ "All uploaded photos will be given a title made up of this title + a " +#~ "sequential number." +#~ msgstr "" +#~ "All photos in the gallery will be given a title made up of the gallery title" +#~ " + a sequential number." + +#~ msgid "Separate tags with spaces, put quotes around multiple-word tags." +#~ msgstr "Separate tags with spaces, put quotes around multiple-word tags." + +#~ msgid "Django-tagging was not found, tags will be treated as plain text." +#~ msgstr "Django-tagging was not found, tags will be treated as plain text." + +#~ msgid "tags" +#~ msgstr "tags" + +#~ msgid "images file (.zip)" +#~ msgstr "images file (.zip)" + +#~ msgid "gallery upload" +#~ msgstr "gallery upload" + +#~ msgid "gallery uploads" +#~ msgstr "gallery uploads" diff --git a/photologue/locale/sk/LC_MESSAGES/django.mo b/photologue/locale/sk/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..8da3af7f73e3c60079f9f1fd9e13cdcf0aacc9a4 GIT binary patch literal 15443 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 literal 0 HcmV?d00001 diff --git a/photologue/locale/sk/LC_MESSAGES/django.po b/photologue/locale/sk/LC_MESSAGES/django.po new file mode 100644 index 0000000..d38bdaa --- /dev/null +++ b/photologue/locale/sk/LC_MESSAGES/django.po @@ -0,0 +1,781 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Translators: +# 18f25ad6fa9930fc67cb11aca9d16a27, 2012-2013 +# saboter , 2014 +# saboter , 2014 +# saboter , 2014 +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-09-03 21:22+0000\n" +"PO-Revision-Date: 2017-12-03 14:47+0000\n" +"Last-Translator: Richard Barran \n" +"Language-Team: Slovak (http://www.transifex.com/richardbarran/django-photologue/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=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" + +#: admin.py:61 +#, python-format +msgid "" +"The following photo does not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgid_plural "" +"The following photos do not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: admin.py:73 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "Galéria bola úspešne pridaná na %(site)s" +msgstr[1] "Galérie boli úspešne pridané na %(site)s" +msgstr[2] "Galérie boli úspešne pridané na %(site)s" +msgstr[3] "Galérie boli úspešne pridané na %(site)s" + +#: admin.py:80 +msgid "Add selected galleries to the current site" +msgstr "Pridať vybrané galérie na aktuálnu stránku" + +#: admin.py:86 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "Galéria bola úspešne odobratá zo %(site)s" +msgstr[1] "Označené galérie boli úspešne odobrané zo %(site)s" +msgstr[2] "Označené galérie boli úspešne odobrané zo %(site)s" +msgstr[3] "Označené galérie boli úspešne odobrané zo %(site)s" + +#: admin.py:93 +msgid "Remove selected galleries from the current site" +msgstr "Odobrať označené galérie z aktuálnej stránky" + +#: admin.py:100 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "Všetky fotografie z galérie %(galleries)s boli úspešne pridané na stránku %(site)s" +msgstr[1] "Všetky fotografie z galérií %(galleries)s boli úspešne pridané na stránku %(site)s" +msgstr[2] "Všetky fotografie z galérií %(galleries)s boli úspešne pridané na stránku %(site)s" +msgstr[3] "Všetky fotografie z galérií %(galleries)s boli úspešne pridané na stránku %(site)s" + +#: admin.py:108 +msgid "Add all photos of selected galleries to the current site" +msgstr "Pridať všetky fotografie z označených galérií do aktuálnej stránky" + +#: admin.py:115 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "Všetky fotografie z galérie %(galleries)s boli úspešne odobraté zo stránky %(site)s" +msgstr[1] "Všetky fotografie z galérií %(galleries)s boli úspešne odobraté zo stránky %(site)s" +msgstr[2] "Všetky fotografie z galérií %(galleries)s boli úspešne odobraté zo stránky %(site)s" +msgstr[3] "Všetky fotografie z galérií %(galleries)s boli úspešne odobraté zo stránky %(site)s" + +#: admin.py:123 +msgid "Remove all photos in selected galleries from the current site" +msgstr "Odobrať všetky fotografie z vybraných galérií z aktuálnej stránky" + +#: admin.py:164 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "Fotografia bola úspešne pridaná na %(site)s" +msgstr[1] "Označené fotografie boli úspešne pridané na %(site)s" +msgstr[2] "Označené fotografie boli úspešne pridané na %(site)s" +msgstr[3] "Označené fotografie boli úspešne pridané na %(site)s" + +#: admin.py:171 +msgid "Add selected photos to the current site" +msgstr "Pridať označené fotografie na aktuálnu stránku" + +#: admin.py:177 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "" +"The selected photos have been successfully removed from %(site)s" +msgstr[0] "Fotografia bola úspešne odobratá zo %(site)s" +msgstr[1] "Označené fotografie boli úspešne odobraté zo %(site)s" +msgstr[2] "Označené fotografie boli úspešne odobraté zo %(site)s" +msgstr[3] "Označené fotografie boli úspešne odobraté zo %(site)s" + +#: admin.py:184 +msgid "Remove selected photos from the current site" +msgstr " Odobrať označené fotografie z aktuálnej stránky" + +#: admin.py:198 templates/admin/photologue/photo/upload_zip.html:27 +msgid "Upload a zip archive of photos" +msgstr "Nahrať ZIP archív s fotkami" + +#: forms.py:27 +#| msgid "title" +msgid "Title" +msgstr "Titulok" + +#: forms.py:30 +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number.
This field is required if creating a new gallery, but " +"is optional when adding to an existing gallery - if not supplied, the photo " +"titles will be creating from the existing gallery name." +msgstr "" + +#: forms.py:36 +#| msgid "gallery" +msgid "Gallery" +msgstr "Galéria" + +#: forms.py:38 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "Vyberte galériu do ktorej chcete pridať tieto obrázky. Pre vytvorenie novej galérie so zadaným názvom ponechajte toto pole prázdne." + +#: forms.py:40 +#| msgid "caption" +msgid "Caption" +msgstr "Titulok" + +#: forms.py:42 +msgid "Caption will be added to all photos." +msgstr "Titulok bude pridaný do všetkých fotografií." + +#: forms.py:43 +#| msgid "description" +msgid "Description" +msgstr "Popis" + +#: forms.py:45 +#| msgid "A description of this Gallery." +msgid "A description of this Gallery. Only required for new galleries." +msgstr "" + +#: forms.py:46 +#| msgid "is public" +msgid "Is public" +msgstr "Je verejná" + +#: forms.py:49 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "Odškrtnite, aby odovzdané galérie a zahrnuté fotografie boli súkromné." + +#: forms.py:72 +msgid "A gallery with that title already exists." +msgstr "Galéria s týmto názvom už existuje." + +#: forms.py:82 +#| msgid "Select a .zip file of images to upload into a new Gallery." +msgid "Select an existing gallery, or enter a title for a new gallery." +msgstr "Vyberte existujúcu galériu, alebo vyplnte názov pre novú." + +#: forms.py:115 +#, python-brace-format +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "Ignorujem súbor \"{filename}\" nakoľko je v podadresári, všetky obrázky by mali byť priamo v zip archíve bez vnorenej adresárovej štruktúry." + +#: forms.py:156 +#, python-brace-format +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "Nepodarilo sa spracovať súbor \"{0}\" v .zip archíve." + +#: forms.py:172 +#, python-brace-format +msgid "The photos have been added to gallery \"{0}\"." +msgstr "Fotografie boli pridané do galérie \"{0}\". " + +#: models.py:98 +msgid "Very Low" +msgstr "Veľmi Nízka" + +#: models.py:99 +msgid "Low" +msgstr "Nízka" + +#: models.py:100 +msgid "Medium-Low" +msgstr "Stredne-Nízka" + +#: models.py:101 +msgid "Medium" +msgstr "Stredná" + +#: models.py:102 +msgid "Medium-High" +msgstr "Stredne-Vysoká" + +#: models.py:103 +msgid "High" +msgstr "Vysoká" + +#: models.py:104 +msgid "Very High" +msgstr "Veľmi Vysoká" + +#: models.py:109 +msgid "Top" +msgstr "Hore" + +#: models.py:110 +msgid "Right" +msgstr "Vpravo" + +#: models.py:111 +msgid "Bottom" +msgstr "Dole" + +#: models.py:112 +msgid "Left" +msgstr "Vľavo" + +#: models.py:113 +msgid "Center (Default)" +msgstr "Stred (Štandardne)" + +#: models.py:117 +msgid "Flip left to right" +msgstr "Prevrátiť zľava doprava" + +#: models.py:118 +msgid "Flip top to bottom" +msgstr "Prevrátiť zhora nadol" + +#: models.py:119 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Otočiť o 90 stupňov proti smeru hodinových ručičiek" + +#: models.py:120 +msgid "Rotate 90 degrees clockwise" +msgstr "Otočiť o 90 stupňov v smere hodinových ručičiek" + +#: models.py:121 +msgid "Rotate 180 degrees" +msgstr "Otočiť o 180 stupňov" + +#: models.py:125 +msgid "Tile" +msgstr "Dláždiť" + +#: models.py:126 +msgid "Scale" +msgstr "Dodržať mierku" + +#: models.py:136 +#, python-format +msgid "" +"Chain multiple filters using the following pattern " +"\"FILTER_ONE->FILTER_TWO->FILTER_THREE\". Image filters will be applied in " +"order. The following filters are available: %s." +msgstr "Zreťazte viac filtrov pomocou nasledovného vzoru \"FILTER_JEDNA->FILTER_DVA->FILTER_TRI\". Obrázkové filtre budú použité v poradí. Nasledujúce filtre sú k dispozícii: %s." + +#: models.py:158 +msgid "date published" +msgstr "dátum zverejnenia" + +#: models.py:160 models.py:513 +msgid "title" +msgstr "názov" + +#: models.py:163 +msgid "title slug" +msgstr "identifikátor názvu" + +#: models.py:166 models.py:519 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "\"Identifikátor\" je unikátny názov objektu vhodný pre použitie v URL." + +#: models.py:167 models.py:596 +msgid "description" +msgstr "popis" + +#: models.py:169 models.py:524 +msgid "is public" +msgstr "je verejný" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Verejné galérie budú zobrazené v štandardných zobrazeniach." + +#: models.py:175 models.py:536 +msgid "photos" +msgstr "fotografie" + +#: models.py:177 models.py:527 +msgid "sites" +msgstr "stránky" + +#: models.py:185 +msgid "gallery" +msgstr "galéria" + +#: models.py:186 +msgid "galleries" +msgstr "galérie" + +#: models.py:224 +msgid "count" +msgstr "počet" + +#: models.py:240 models.py:741 +msgid "image" +msgstr "obrázok" + +#: models.py:243 +msgid "date taken" +msgstr "dátum odfotenia" + +#: models.py:246 +msgid "Date image was taken; is obtained from the image EXIF data." +msgstr "" + +#: models.py:247 +msgid "view count" +msgstr "počet zobrazení" + +#: models.py:250 +msgid "crop from" +msgstr "orezať od" + +#: models.py:259 +msgid "effect" +msgstr "efekt" + +#: models.py:279 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "Veľkosť fotografie \"admin_thumbnail\" nebola definovaná." + +#: models.py:286 +msgid "Thumbnail" +msgstr "Náhľad" + +#: models.py:516 +msgid "slug" +msgstr "identifikátor" + +#: models.py:520 +msgid "caption" +msgstr "titulok" + +#: models.py:522 +msgid "date added" +msgstr "dátum pridania" + +#: models.py:526 +msgid "Public photographs will be displayed in the default views." +msgstr "Verejné fotografie budú zobrazené v štandardných zobrazeniach." + +#: models.py:535 +msgid "photo" +msgstr "fotografia" + +#: models.py:593 models.py:771 +msgid "name" +msgstr "meno" + +#: models.py:672 +msgid "rotate or flip" +msgstr "otočiť alebo prevrátiť" + +#: models.py:676 models.py:704 +msgid "color" +msgstr "farba" + +#: models.py:678 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "Faktor 0.0 dáva čiernobiely obrázok, faktor 1.0 dáva pôvodný obrázok." + +#: models.py:680 +msgid "brightness" +msgstr "jas" + +#: models.py:682 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "Faktor 0.0 dáva čierny obrázok, faktor 1.0 dáva pôvodný obrázok." + +#: models.py:684 +msgid "contrast" +msgstr "kontrast" + +#: models.py:686 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original" +" image." +msgstr "Faktor 0.0 dáva šedý obrázok, faktor 1.0 dáva pôvodný obrázok." + +#: models.py:688 +msgid "sharpness" +msgstr "ostrosť" + +#: models.py:690 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "Faktor 0.0 dáva rozmazaný obrázok, faktor 1.0 dáva pôvodný obrázok." + +#: models.py:692 +msgid "filters" +msgstr "filtre" + +#: models.py:696 +msgid "size" +msgstr "veľkosť" + +#: models.py:698 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "Výška odrazu v percentách pôvodného obrázku. Faktor 0.0 nepridáva žiadny odraz, faktor 1.0 pridáva odraz rovný výśke pôvodného obrázku." + +#: models.py:701 +msgid "strength" +msgstr "intenzita" + +#: models.py:703 +msgid "The initial opacity of the reflection gradient." +msgstr "Počiatočná presvitnosť odrazového gradientu." + +#: models.py:707 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "Farba pozadia odrazového gradientu. Túto položku nastavte tak, aby sa zhodovala s farbou pozadia vašej stránky." + +#: models.py:711 models.py:815 +msgid "photo effect" +msgstr "efekt fotografie" + +#: models.py:712 +msgid "photo effects" +msgstr "efekty fotografie" + +#: models.py:743 +msgid "style" +msgstr "štýl" + +#: models.py:747 +msgid "opacity" +msgstr "priesvitnosť" + +#: models.py:749 +msgid "The opacity of the overlay." +msgstr "Priesvitnosť prekrytia." + +#: models.py:752 +msgid "watermark" +msgstr "vodoznak" + +#: models.py:753 +msgid "watermarks" +msgstr "vodoznaky" + +#: models.py:775 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "Názov veľkosti fotografie by mal obsahovať len písmená, čísla a podčiarky. Príklady: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." + +#: models.py:782 +msgid "width" +msgstr "šírka" + +#: models.py:785 +msgid "If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "Ak je šírka nastavená na \"0\" obrázok bude podľa mierky upravený na zadanú výšku." + +#: models.py:786 +msgid "height" +msgstr "výška" + +#: models.py:789 +msgid "If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "Ak je výška nastavená na \"0\" obrázok bude podľa mierky upravený na zadanú šírku" + +#: models.py:790 +msgid "quality" +msgstr "kvalita" + +#: models.py:793 +msgid "JPEG image quality." +msgstr "JPEG kvalita obrázku." + +#: models.py:794 +msgid "upscale images?" +msgstr "prispôsobiť obzázky?" + +#: models.py:796 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "Ak je táto položka vybratá a je to potrebné, obrázok bude prispôsobený tak, aby sa zmestil do zadaných rozmerov." + +#: models.py:800 +msgid "crop to fit?" +msgstr "orezať ak je to potrebné ?" + +#: models.py:802 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "Ak je táto položka vybratá, obrázok bude upravený a orezaný, aby sa zmestil do zadaných rozmerov." + +#: models.py:804 +msgid "pre-cache?" +msgstr "pred-generovať ?" + +#: models.py:806 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "Ak je táto položka vybratá, veľkosť fotografie bude pred-generovaná počas pridávania fotografií." + +#: models.py:807 +msgid "increment view count?" +msgstr "zvýšiť počet zobrazení?" + +#: models.py:809 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "Ak je táto položka vybratá, \"view_count\" obrázku bude zvýšený, keď sa zobrazí veľkosť tohto obrázku." + +#: models.py:821 +msgid "watermark image" +msgstr "použiť vodoznak na obrázok" + +#: models.py:826 +msgid "photo size" +msgstr "veľkosť fotografie" + +#: models.py:827 +msgid "photo sizes" +msgstr "veľkosti fotografie" + +#: models.py:844 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "Fotky môžete orezať len vtedy, ak je nastavená šírka a výška." + +#: templates/admin/photologue/photo/change_list.html:9 +msgid "Upload a zip archive" +msgstr "Nahrať ZIP archív" + +#: templates/admin/photologue/photo/upload_zip.html:15 +msgid "Home" +msgstr "Domov" + +#: templates/admin/photologue/photo/upload_zip.html:19 +#: templates/admin/photologue/photo/upload_zip.html:53 +msgid "Upload" +msgstr "Nahrať" + +#: templates/admin/photologue/photo/upload_zip.html:28 +msgid "" +"\n" +"\t\t

On this page you can upload many photos at once, as long as you have\n" +"\t\tput them all in a zip archive. The photos can be either:

\n" +"\t\t
    \n" +"\t\t\t
  • Added to an existing gallery.
  • \n" +"\t\t\t
  • Otherwise, a new gallery is created with the supplied title.
  • \n" +"\t\t
\n" +"\t" +msgstr "\n\t\t

Na tejto stránke môžete nahrať viacero fotiek naraz, pokiaľ ich\n\t\tumiestnite do jedného ZIP archívu. Fotografie môžu byť:

\n\t\t
    \n\t\t\t
  • Pridané do existujúcej galérie.
  • \n\t\t\t
  • Alebo bude vytvorená nová galérie so zadaným názvom.
  • \n\t\t
\n\t" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the error below." +msgstr "Prosím opravte chybu uvedenú nižšie." + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the errors below." +msgstr "Prosím opravte chyby uvedené nižšie." + +#: templates/photologue/gallery_archive.html:4 +#: templates/photologue/gallery_archive.html:9 +msgid "Latest photo galleries" +msgstr "Nedávno pridané galérie" + +#: templates/photologue/gallery_archive.html:16 +#: templates/photologue/photo_archive.html:16 +msgid "Filter by year" +msgstr "Filtrovať podľa roku" + +#: templates/photologue/gallery_archive.html:32 +#: templates/photologue/gallery_list.html:26 +msgid "No galleries were found" +msgstr "Neboli nájdené žiadne galérie" + +#: templates/photologue/gallery_archive_day.html:4 +#: templates/photologue/gallery_archive_day.html:9 +#, python-format +msgid "Galleries for %(show_day)s" +msgstr "Galérie pre %(show_day)s" + +#: templates/photologue/gallery_archive_day.html:18 +#: templates/photologue/gallery_archive_month.html:32 +#: templates/photologue/gallery_archive_year.html:32 +msgid "No galleries were found." +msgstr "Nenašli sa žiadne galérie." + +#: templates/photologue/gallery_archive_day.html:22 +msgid "View all galleries for month" +msgstr "Zobraziť všetky galérie pre daný mesiac" + +#: templates/photologue/gallery_archive_month.html:4 +#: templates/photologue/gallery_archive_month.html:9 +#, python-format +msgid "Galleries for %(show_month)s" +msgstr "Galérie pre %(show_month)s" + +#: templates/photologue/gallery_archive_month.html:16 +#: templates/photologue/photo_archive_month.html:16 +msgid "Filter by day" +msgstr "Filtrovať podľa dní" + +#: templates/photologue/gallery_archive_month.html:35 +msgid "View all galleries for year" +msgstr "Zobraziť všetky galérie pre rok" + +#: templates/photologue/gallery_archive_year.html:4 +#: templates/photologue/gallery_archive_year.html:9 +#, python-format +msgid "Galleries for %(show_year)s" +msgstr "Galérie pre %(show_year)s" + +#: templates/photologue/gallery_archive_year.html:16 +#: templates/photologue/photo_archive_year.html:17 +msgid "Filter by month" +msgstr "Filtrovať po mesiacoch" + +#: templates/photologue/gallery_archive_year.html:35 +#: templates/photologue/gallery_detail.html:17 +msgid "View all galleries" +msgstr "Zobraziť všetky galérie" + +#: templates/photologue/gallery_detail.html:10 +#: templates/photologue/gallery_list.html:16 +#: templates/photologue/includes/gallery_sample.html:8 +#: templates/photologue/photo_detail.html:10 +msgid "Published" +msgstr "Zverejnené" + +#: templates/photologue/gallery_list.html:4 +#: templates/photologue/gallery_list.html:9 +msgid "All galleries" +msgstr "Všetky galérie" + +#: templates/photologue/includes/paginator.html:6 +#: templates/photologue/includes/paginator.html:8 +msgid "Previous" +msgstr "Predchádzajúci" + +#: templates/photologue/includes/paginator.html:11 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "\n\t\t\t\t stránka %(page_number)s z %(total_pages)s\n\t\t\t\t" + +#: templates/photologue/includes/paginator.html:16 +#: templates/photologue/includes/paginator.html:18 +msgid "Next" +msgstr "Nasledujúci" + +#: templates/photologue/photo_archive.html:4 +#: templates/photologue/photo_archive.html:9 +msgid "Latest photos" +msgstr "Nedávno pridané fotografie" + +#: templates/photologue/photo_archive.html:34 +#: templates/photologue/photo_archive_day.html:21 +#: templates/photologue/photo_archive_month.html:36 +#: templates/photologue/photo_archive_year.html:37 +#: templates/photologue/photo_list.html:21 +msgid "No photos were found" +msgstr "Nenašli sa žiadne fotografie" + +#: templates/photologue/photo_archive_day.html:4 +#: templates/photologue/photo_archive_day.html:9 +#, python-format +msgid "Photos for %(show_day)s" +msgstr "Fotografie pre %(show_day)s" + +#: templates/photologue/photo_archive_day.html:24 +msgid "View all photos for month" +msgstr "Zobraziť všetky fotografie pre mesiac" + +#: templates/photologue/photo_archive_month.html:4 +#: templates/photologue/photo_archive_month.html:9 +#, python-format +msgid "Photos for %(show_month)s" +msgstr "Fotografie pre %(show_month)s" + +#: templates/photologue/photo_archive_month.html:39 +msgid "View all photos for year" +msgstr "Zobraziť všetky fotografie pre rok" + +#: templates/photologue/photo_archive_year.html:4 +#: templates/photologue/photo_archive_year.html:10 +#, python-format +msgid "Photos for %(show_year)s" +msgstr "Fotografie pre %(show_year)s" + +#: templates/photologue/photo_archive_year.html:40 +msgid "View all photos" +msgstr "Zobraziť všetky fotografie" + +#: templates/photologue/photo_detail.html:22 +msgid "This photo is found in the following galleries" +msgstr "Táto fotka sa nachádza v nasledujúcich galériách" + +#: templates/photologue/photo_list.html:4 +#: templates/photologue/photo_list.html:9 +msgid "All photos" +msgstr "Všetky fotografie" + +#~ msgid "" +#~ "All uploaded photos will be given a title made up of this title + a " +#~ "sequential number." +#~ msgstr "" +#~ "All photos in the gallery will be given a title made up of the gallery title" +#~ " + a sequential number." + +#~ msgid "Separate tags with spaces, put quotes around multiple-word tags." +#~ msgstr "Separate tags with spaces, put quotes around multiple-word tags." + +#~ msgid "Django-tagging was not found, tags will be treated as plain text." +#~ msgstr "Django-tagging was not found, tags will be treated as plain text." + +#~ msgid "tags" +#~ msgstr "tags" + +#~ msgid "images file (.zip)" +#~ msgstr "images file (.zip)" + +#~ msgid "gallery upload" +#~ msgstr "gallery upload" + +#~ msgid "gallery uploads" +#~ msgstr "gallery uploads" diff --git a/photologue/locale/tr/LC_MESSAGES/django.mo b/photologue/locale/tr/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..ca2c20e961da5bfa77a5fab4f25bf1b709d86138 GIT binary patch literal 11816 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 literal 0 HcmV?d00001 diff --git a/photologue/locale/tr/LC_MESSAGES/django.po b/photologue/locale/tr/LC_MESSAGES/django.po new file mode 100644 index 0000000..beb15c5 --- /dev/null +++ b/photologue/locale/tr/LC_MESSAGES/django.po @@ -0,0 +1,767 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Translators: +# abc Def , 2020 +# ali rıza keleş , 2009 +# ali rıza keleş , 2009,2014 +# ali rıza keleş , 2009 +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-09-03 21:22+0000\n" +"PO-Revision-Date: 2020-04-15 19:14+0000\n" +"Last-Translator: abc Def \n" +"Language-Team: Turkish (http://www.transifex.com/richardbarran/django-photologue/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" + +#: admin.py:61 +#, python-format +msgid "" +"The following photo does not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgid_plural "" +"The following photos do not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgstr[0] "" +msgstr[1] "" + +#: admin.py:73 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "Galeri başarıyla şu siteye yüklendi: %(site)s" +msgstr[1] "Galeriler başarıyla şu siteye yüklendi: %(site)s" + +#: admin.py:80 +msgid "Add selected galleries to the current site" +msgstr "Seçili galerileri mevcut siteye ekle" + +#: admin.py:86 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "Galeri şu sitelerden başarıyla silindi: %(site)s" +msgstr[1] "Seçili galeriler şu sitelerden başarıyla silindi: %(site)s" + +#: admin.py:93 +msgid "Remove selected galleries from the current site" +msgstr "Seçili galerileri mevcut siteden çıkar" + +#: admin.py:100 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:108 +msgid "Add all photos of selected galleries to the current site" +msgstr "Seçili galerilerin tüm fotolarını mevcut siteye ekle" + +#: admin.py:115 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:123 +msgid "Remove all photos in selected galleries from the current site" +msgstr "Seçili galerilerin tüm fotolarını mevcut siteden çıkar" + +#: admin.py:164 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:171 +msgid "Add selected photos to the current site" +msgstr "Seçili fotoları mevcut siteye ekle" + +#: admin.py:177 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "" +"The selected photos have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:184 +msgid "Remove selected photos from the current site" +msgstr "Seçili fotoları siteden kaldır" + +#: admin.py:198 templates/admin/photologue/photo/upload_zip.html:27 +msgid "Upload a zip archive of photos" +msgstr "" + +#: forms.py:27 +#| msgid "title" +msgid "Title" +msgstr "Başlık" + +#: forms.py:30 +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number.
This field is required if creating a new gallery, but " +"is optional when adding to an existing gallery - if not supplied, the photo " +"titles will be creating from the existing gallery name." +msgstr "" + +#: forms.py:36 +#| msgid "gallery" +msgid "Gallery" +msgstr "Galeri" + +#: forms.py:38 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "Bu resimleri eklemek için bir galeri seçin. Verilen başlıktan yeni bir galeri oluşturmak için boş bırakın." + +#: forms.py:40 +#| msgid "caption" +msgid "Caption" +msgstr "Altbaşlık" + +#: forms.py:42 +msgid "Caption will be added to all photos." +msgstr "Altyazı tüm fotolara eklenecektir." + +#: forms.py:43 +#| msgid "description" +msgid "Description" +msgstr "Tanım" + +#: forms.py:45 +#| msgid "A description of this Gallery." +msgid "A description of this Gallery. Only required for new galleries." +msgstr "" + +#: forms.py:46 +#| msgid "is public" +msgid "Is public" +msgstr "Halka açık" + +#: forms.py:49 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "Yüklenen bu galeriyi ve içerisindeki tüm fotoları özel yapmak için işaretlemeyin." + +#: forms.py:72 +msgid "A gallery with that title already exists." +msgstr "Bu başlıkta bir galeri zaten var." + +#: forms.py:82 +#| msgid "Select a .zip file of images to upload into a new Gallery." +msgid "Select an existing gallery, or enter a title for a new gallery." +msgstr "Mevcut bir galeriyi seçin veya yeni bir galeri için bir başlık girin." + +#: forms.py:115 +#, python-brace-format +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "\"{filename}\" alt bir klasör içinde olduğu için gözardı edilecek; zip içindeki tüm fotolar en üst klasörde yer almalı. " + +#: forms.py:156 +#, python-brace-format +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "Zip arşivindeki \"{0}\" dosyası işlenemedi." + +#: forms.py:172 +#, python-brace-format +msgid "The photos have been added to gallery \"{0}\"." +msgstr "" + +#: models.py:98 +msgid "Very Low" +msgstr "Çok düşük" + +#: models.py:99 +msgid "Low" +msgstr "Düşük" + +#: models.py:100 +msgid "Medium-Low" +msgstr "Orta-Düşük" + +#: models.py:101 +msgid "Medium" +msgstr "Orta" + +#: models.py:102 +msgid "Medium-High" +msgstr "Orta-Yüksek" + +#: models.py:103 +msgid "High" +msgstr "Yüksek" + +#: models.py:104 +msgid "Very High" +msgstr "Çok Yüksek" + +#: models.py:109 +msgid "Top" +msgstr "Üst" + +#: models.py:110 +msgid "Right" +msgstr "Sağ" + +#: models.py:111 +msgid "Bottom" +msgstr "Alt" + +#: models.py:112 +msgid "Left" +msgstr "Sol" + +#: models.py:113 +msgid "Center (Default)" +msgstr "Merkez (Varsayılan)" + +#: models.py:117 +msgid "Flip left to right" +msgstr "Soldan sağa ayna aksi" + +#: models.py:118 +msgid "Flip top to bottom" +msgstr "Yukardan aşağıya ayna aksi" + +#: models.py:119 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "90 derece saat yönü tersine döndür" + +#: models.py:120 +msgid "Rotate 90 degrees clockwise" +msgstr "90 derece saat yönüne döndür" + +#: models.py:121 +msgid "Rotate 180 degrees" +msgstr "180 derece döndür" + +#: models.py:125 +msgid "Tile" +msgstr "Kutu-kutu, kiremit tarzı" + +#: models.py:126 +msgid "Scale" +msgstr "Ölçekle" + +#: models.py:136 +#, python-format +msgid "" +"Chain multiple filters using the following pattern " +"\"FILTER_ONE->FILTER_TWO->FILTER_THREE\". Image filters will be applied in " +"order. The following filters are available: %s." +msgstr "Birden çok filtreyi şu şekilde uygulayabilirsin: \"ILK_FILTRE->IKINCI_FILTRE->UCUNCU_FILTRE\". Filtreler sırayla uygulanacaktır. Etkin filtreler: %s" + +#: models.py:158 +msgid "date published" +msgstr "yayınlama tarihi" + +#: models.py:160 models.py:513 +msgid "title" +msgstr "başlık" + +#: models.py:163 +msgid "title slug" +msgstr "başlık slug" + +#: models.py:166 models.py:519 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "\"Slug\" bir nesne için url dostu eşsiz bir başlıktır." + +#: models.py:167 models.py:596 +msgid "description" +msgstr "tanım" + +#: models.py:169 models.py:524 +msgid "is public" +msgstr "Görünür mü?" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Görülebilir galeriler varsayılan görünümlerde sergilenirler." + +#: models.py:175 models.py:536 +msgid "photos" +msgstr "fotolar" + +#: models.py:177 models.py:527 +msgid "sites" +msgstr "siteler" + +#: models.py:185 +msgid "gallery" +msgstr "galeri" + +#: models.py:186 +msgid "galleries" +msgstr "galeriler" + +#: models.py:224 +msgid "count" +msgstr "sayaç" + +#: models.py:240 models.py:741 +msgid "image" +msgstr "imaj" + +#: models.py:243 +msgid "date taken" +msgstr "çekilme tarihi" + +#: models.py:246 +msgid "Date image was taken; is obtained from the image EXIF data." +msgstr "" + +#: models.py:247 +msgid "view count" +msgstr "görüntüleme sayısı" + +#: models.py:250 +msgid "crop from" +msgstr "şuradan kes" + +#: models.py:259 +msgid "effect" +msgstr "efekt" + +#: models.py:279 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "Bir \"admin_thumbnail\" foto ölçüleri tanımlanmamış." + +#: models.py:286 +msgid "Thumbnail" +msgstr "Minyatür" + +#: models.py:516 +msgid "slug" +msgstr "slug" + +#: models.py:520 +msgid "caption" +msgstr "alt yazı" + +#: models.py:522 +msgid "date added" +msgstr "eklenme tarihi" + +#: models.py:526 +msgid "Public photographs will be displayed in the default views." +msgstr "Görülebilir fotolar varsayılan görünümlerde sergilenirler." + +#: models.py:535 +msgid "photo" +msgstr "foto" + +#: models.py:593 models.py:771 +msgid "name" +msgstr "isim" + +#: models.py:672 +msgid "rotate or flip" +msgstr "döndür ya da ayna aksi" + +#: models.py:676 models.py:704 +msgid "color" +msgstr "renk" + +#: models.py:678 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "0.0 siyah beyaz bir imaj, 1.0 orjinal imajı verir." + +#: models.py:680 +msgid "brightness" +msgstr "parlaklık" + +#: models.py:682 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "0.0 siyah bir imaj, 1.0 orjinal imajı verir." + +#: models.py:684 +msgid "contrast" +msgstr "kontrast" + +#: models.py:686 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original" +" image." +msgstr "0.0 katı gri bir imaj, 1.0 orjinal imajı verir." + +#: models.py:688 +msgid "sharpness" +msgstr "keskinlik" + +#: models.py:690 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "0.0 blanık bir imaj, 1.0 orjinal imajı verir." + +#: models.py:692 +msgid "filters" +msgstr "filtreler" + +#: models.py:696 +msgid "size" +msgstr "boyutlar" + +#: models.py:698 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "Yansımanın yüksekliği, orjinal imajın yüzdelik oranıdır. 0.0 hiç yansıma vermezken, 1.0 orjinal imaj yüksekliği kadar bir yansıma sağlar." + +#: models.py:701 +msgid "strength" +msgstr "gerilim" + +#: models.py:703 +msgid "The initial opacity of the reflection gradient." +msgstr "Yansıma gradyantının başlangıç opaklığı." + +#: models.py:707 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "Yansıma gradyantının arkaplan rengi. Bu ayarı sayfanızın arka plan rengine eş seçin." + +#: models.py:711 models.py:815 +msgid "photo effect" +msgstr "foto efekti" + +#: models.py:712 +msgid "photo effects" +msgstr "foto efektleri" + +#: models.py:743 +msgid "style" +msgstr "tarz" + +#: models.py:747 +msgid "opacity" +msgstr "opaklık" + +#: models.py:749 +msgid "The opacity of the overlay." +msgstr "Katmanın opaklığı." + +#: models.py:752 +msgid "watermark" +msgstr "su damga" + +#: models.py:753 +msgid "watermarks" +msgstr "su damgaları" + +#: models.py:775 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "Foto ebat isimleri sadece hafler, rakamlar ve alt tireler içerebilir. Örnekler: \"minyaturler\", \"sergi\", \"kucuk\", \"ana_sayfa_vinyeti\"." + +#: models.py:782 +msgid "width" +msgstr "genişlik" + +#: models.py:785 +msgid "If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "Eğer genişlik 0 verilirse, verilen yüksekliğe göre ölçeklenecek." + +#: models.py:786 +msgid "height" +msgstr "yükseklik" + +#: models.py:789 +msgid "If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "Eğer yükseklik 0 verilirse, verilen genişliğe göre ölçeklenecek. " + +#: models.py:790 +msgid "quality" +msgstr "kalite" + +#: models.py:793 +msgid "JPEG image quality." +msgstr "JPEG kalitesi" + +#: models.py:794 +msgid "upscale images?" +msgstr "imajı büyüt?" + +#: models.py:796 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "Eğer seçilirse, imaj verilen ölçülere göre gerekli ise büyütülecek." + +#: models.py:800 +msgid "crop to fit?" +msgstr "sığdırmak için kes?" + +#: models.py:802 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "Eğer seçilirse imaj ölçeklenecek ve verilen ebatlara sığdırmak için ölçeklenecek." + +#: models.py:804 +msgid "pre-cache?" +msgstr "wstępnie cachować?" + +#: models.py:806 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "Eğer seçilirse, fotolar eklenirken, ön belleklenecek." + +#: models.py:807 +msgid "increment view count?" +msgstr "görüntüleme sayısını arttır?" + +#: models.py:809 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "Eğer seçilirse, imajın \"görüntülenme sayısı\", foto görüntülendikçe artacak." + +#: models.py:821 +msgid "watermark image" +msgstr "su damgası imajı" + +#: models.py:826 +msgid "photo size" +msgstr "photo ebadı" + +#: models.py:827 +msgid "photo sizes" +msgstr "photo ebadları" + +#: models.py:844 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "Eğer hem yükseklik hem de genişlik belirtilirse fotoğraf kırpılır." + +#: templates/admin/photologue/photo/change_list.html:9 +msgid "Upload a zip archive" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:15 +msgid "Home" +msgstr "Anasayfa" + +#: templates/admin/photologue/photo/upload_zip.html:19 +#: templates/admin/photologue/photo/upload_zip.html:53 +msgid "Upload" +msgstr "Yükle" + +#: templates/admin/photologue/photo/upload_zip.html:28 +msgid "" +"\n" +"\t\t

On this page you can upload many photos at once, as long as you have\n" +"\t\tput them all in a zip archive. The photos can be either:

\n" +"\t\t
    \n" +"\t\t\t
  • Added to an existing gallery.
  • \n" +"\t\t\t
  • Otherwise, a new gallery is created with the supplied title.
  • \n" +"\t\t
\n" +"\t" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the error below." +msgstr "Lütfen aşağıdaki hatayı düzeltin." + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the errors below." +msgstr "Lütfen aşağıdaki hataları düzeltin." + +#: templates/photologue/gallery_archive.html:4 +#: templates/photologue/gallery_archive.html:9 +msgid "Latest photo galleries" +msgstr "Son foto galeriler" + +#: templates/photologue/gallery_archive.html:16 +#: templates/photologue/photo_archive.html:16 +msgid "Filter by year" +msgstr "Yıla göre filtrele" + +#: templates/photologue/gallery_archive.html:32 +#: templates/photologue/gallery_list.html:26 +msgid "No galleries were found" +msgstr "Hiç galeri bulunamadı" + +#: templates/photologue/gallery_archive_day.html:4 +#: templates/photologue/gallery_archive_day.html:9 +#, python-format +msgid "Galleries for %(show_day)s" +msgstr "%(show_day)s galerileri" + +#: templates/photologue/gallery_archive_day.html:18 +#: templates/photologue/gallery_archive_month.html:32 +#: templates/photologue/gallery_archive_year.html:32 +msgid "No galleries were found." +msgstr "Hiç galeri bulunamadı." + +#: templates/photologue/gallery_archive_day.html:22 +msgid "View all galleries for month" +msgstr "Ayın tüm galerileri" + +#: templates/photologue/gallery_archive_month.html:4 +#: templates/photologue/gallery_archive_month.html:9 +#, python-format +msgid "Galleries for %(show_month)s" +msgstr "%(show_month)s galerileri" + +#: templates/photologue/gallery_archive_month.html:16 +#: templates/photologue/photo_archive_month.html:16 +msgid "Filter by day" +msgstr "Güne göre filtrele" + +#: templates/photologue/gallery_archive_month.html:35 +msgid "View all galleries for year" +msgstr "Yılın tüm galerilerini görüntüle" + +#: templates/photologue/gallery_archive_year.html:4 +#: templates/photologue/gallery_archive_year.html:9 +#, python-format +msgid "Galleries for %(show_year)s" +msgstr "%(show_year)s galerileri" + +#: templates/photologue/gallery_archive_year.html:16 +#: templates/photologue/photo_archive_year.html:17 +msgid "Filter by month" +msgstr "Aya göre filtrele" + +#: templates/photologue/gallery_archive_year.html:35 +#: templates/photologue/gallery_detail.html:17 +msgid "View all galleries" +msgstr "Tüm galerileri görüntüle" + +#: templates/photologue/gallery_detail.html:10 +#: templates/photologue/gallery_list.html:16 +#: templates/photologue/includes/gallery_sample.html:8 +#: templates/photologue/photo_detail.html:10 +msgid "Published" +msgstr "Yayında" + +#: templates/photologue/gallery_list.html:4 +#: templates/photologue/gallery_list.html:9 +msgid "All galleries" +msgstr "Tüm galeriler" + +#: templates/photologue/includes/paginator.html:6 +#: templates/photologue/includes/paginator.html:8 +msgid "Previous" +msgstr "Önceki" + +#: templates/photologue/includes/paginator.html:11 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "\n\t\t\t\t sayfa %(page_number)s / %(total_pages)s\n\t\t\t\t" + +#: templates/photologue/includes/paginator.html:16 +#: templates/photologue/includes/paginator.html:18 +msgid "Next" +msgstr "Sonraki" + +#: templates/photologue/photo_archive.html:4 +#: templates/photologue/photo_archive.html:9 +msgid "Latest photos" +msgstr "Son fotolar" + +#: templates/photologue/photo_archive.html:34 +#: templates/photologue/photo_archive_day.html:21 +#: templates/photologue/photo_archive_month.html:36 +#: templates/photologue/photo_archive_year.html:37 +#: templates/photologue/photo_list.html:21 +msgid "No photos were found" +msgstr "Foto bulunamadı" + +#: templates/photologue/photo_archive_day.html:4 +#: templates/photologue/photo_archive_day.html:9 +#, python-format +msgid "Photos for %(show_day)s" +msgstr "%(show_day)s galerileri" + +#: templates/photologue/photo_archive_day.html:24 +msgid "View all photos for month" +msgstr "Ayın tüm fotoları" + +#: templates/photologue/photo_archive_month.html:4 +#: templates/photologue/photo_archive_month.html:9 +#, python-format +msgid "Photos for %(show_month)s" +msgstr "%(show_month)s fotoları" + +#: templates/photologue/photo_archive_month.html:39 +msgid "View all photos for year" +msgstr "Yılın tüm fotoları" + +#: templates/photologue/photo_archive_year.html:4 +#: templates/photologue/photo_archive_year.html:10 +#, python-format +msgid "Photos for %(show_year)s" +msgstr "%(show_year)s fotoları" + +#: templates/photologue/photo_archive_year.html:40 +msgid "View all photos" +msgstr "Tüm fotoları görüntüle" + +#: templates/photologue/photo_detail.html:22 +msgid "This photo is found in the following galleries" +msgstr "Bu fotonun bulunduğu galeriler" + +#: templates/photologue/photo_list.html:4 +#: templates/photologue/photo_list.html:9 +msgid "All photos" +msgstr "Tüm fotolar" + +#~ msgid "" +#~ "All uploaded photos will be given a title made up of this title + a " +#~ "sequential number." +#~ msgstr "" +#~ "All photos in the gallery will be given a title made up of the gallery title" +#~ " + a sequential number." + +#~ msgid "Separate tags with spaces, put quotes around multiple-word tags." +#~ msgstr "Separate tags with spaces, put quotes around multiple-word tags." + +#~ msgid "Django-tagging was not found, tags will be treated as plain text." +#~ msgstr "Django-tagging was not found, tags will be treated as plain text." + +#~ msgid "tags" +#~ msgstr "tags" + +#~ msgid "images file (.zip)" +#~ msgstr "images file (.zip)" + +#~ msgid "gallery upload" +#~ msgstr "gallery upload" + +#~ msgid "gallery uploads" +#~ msgstr "gallery uploads" diff --git a/photologue/locale/tr_TR/LC_MESSAGES/django.mo b/photologue/locale/tr_TR/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..7a250c799e3f56cf43b47cd0f67a07a0165b815f GIT binary patch literal 467 zcmY*UO-}+b5XI%zR%A-TZj|n1@aPkio8a8#K\n" +"Language-Team: Turkish (Turkey) (http://www.transifex.com/richardbarran/django-photologue/language/tr_TR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tr_TR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: admin.py:61 +#, python-format +msgid "" +"The following photo does not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgid_plural "" +"The following photos do not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgstr[0] "" +msgstr[1] "" + +#: admin.py:73 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:80 +msgid "Add selected galleries to the current site" +msgstr "" + +#: admin.py:86 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:93 +msgid "Remove selected galleries from the current site" +msgstr "" + +#: admin.py:100 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:108 +msgid "Add all photos of selected galleries to the current site" +msgstr "" + +#: admin.py:115 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:123 +msgid "Remove all photos in selected galleries from the current site" +msgstr "" + +#: admin.py:164 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:171 +msgid "Add selected photos to the current site" +msgstr "" + +#: admin.py:177 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "" +"The selected photos have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:184 +msgid "Remove selected photos from the current site" +msgstr "" + +#: admin.py:198 templates/admin/photologue/photo/upload_zip.html:27 +msgid "Upload a zip archive of photos" +msgstr "" + +#: forms.py:27 +#| msgid "title" +msgid "Title" +msgstr "" + +#: forms.py:30 +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number.
This field is required if creating a new gallery, but " +"is optional when adding to an existing gallery - if not supplied, the photo " +"titles will be creating from the existing gallery name." +msgstr "" + +#: forms.py:36 +#| msgid "gallery" +msgid "Gallery" +msgstr "" + +#: forms.py:38 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "" + +#: forms.py:40 +#| msgid "caption" +msgid "Caption" +msgstr "" + +#: forms.py:42 +msgid "Caption will be added to all photos." +msgstr "" + +#: forms.py:43 +#| msgid "description" +msgid "Description" +msgstr "" + +#: forms.py:45 +#| msgid "A description of this Gallery." +msgid "A description of this Gallery. Only required for new galleries." +msgstr "" + +#: forms.py:46 +#| msgid "is public" +msgid "Is public" +msgstr "" + +#: forms.py:49 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "" + +#: forms.py:72 +msgid "A gallery with that title already exists." +msgstr "" + +#: forms.py:82 +#| msgid "Select a .zip file of images to upload into a new Gallery." +msgid "Select an existing gallery, or enter a title for a new gallery." +msgstr "" + +#: forms.py:115 +#, python-brace-format +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "" + +#: forms.py:156 +#, python-brace-format +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "" + +#: forms.py:172 +#, python-brace-format +msgid "The photos have been added to gallery \"{0}\"." +msgstr "" + +#: models.py:98 +msgid "Very Low" +msgstr "" + +#: models.py:99 +msgid "Low" +msgstr "" + +#: models.py:100 +msgid "Medium-Low" +msgstr "" + +#: models.py:101 +msgid "Medium" +msgstr "" + +#: models.py:102 +msgid "Medium-High" +msgstr "" + +#: models.py:103 +msgid "High" +msgstr "" + +#: models.py:104 +msgid "Very High" +msgstr "" + +#: models.py:109 +msgid "Top" +msgstr "" + +#: models.py:110 +msgid "Right" +msgstr "" + +#: models.py:111 +msgid "Bottom" +msgstr "" + +#: models.py:112 +msgid "Left" +msgstr "" + +#: models.py:113 +msgid "Center (Default)" +msgstr "" + +#: models.py:117 +msgid "Flip left to right" +msgstr "" + +#: models.py:118 +msgid "Flip top to bottom" +msgstr "" + +#: models.py:119 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "" + +#: models.py:120 +msgid "Rotate 90 degrees clockwise" +msgstr "" + +#: models.py:121 +msgid "Rotate 180 degrees" +msgstr "" + +#: models.py:125 +msgid "Tile" +msgstr "" + +#: models.py:126 +msgid "Scale" +msgstr "" + +#: models.py:136 +#, python-format +msgid "" +"Chain multiple filters using the following pattern " +"\"FILTER_ONE->FILTER_TWO->FILTER_THREE\". Image filters will be applied in " +"order. The following filters are available: %s." +msgstr "" + +#: models.py:158 +msgid "date published" +msgstr "" + +#: models.py:160 models.py:513 +msgid "title" +msgstr "" + +#: models.py:163 +msgid "title slug" +msgstr "" + +#: models.py:166 models.py:519 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "" + +#: models.py:167 models.py:596 +msgid "description" +msgstr "" + +#: models.py:169 models.py:524 +msgid "is public" +msgstr "" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "" + +#: models.py:175 models.py:536 +msgid "photos" +msgstr "" + +#: models.py:177 models.py:527 +msgid "sites" +msgstr "" + +#: models.py:185 +msgid "gallery" +msgstr "" + +#: models.py:186 +msgid "galleries" +msgstr "" + +#: models.py:224 +msgid "count" +msgstr "" + +#: models.py:240 models.py:741 +msgid "image" +msgstr "" + +#: models.py:243 +msgid "date taken" +msgstr "" + +#: models.py:246 +msgid "Date image was taken; is obtained from the image EXIF data." +msgstr "" + +#: models.py:247 +msgid "view count" +msgstr "" + +#: models.py:250 +msgid "crop from" +msgstr "" + +#: models.py:259 +msgid "effect" +msgstr "" + +#: models.py:279 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "" + +#: models.py:286 +msgid "Thumbnail" +msgstr "" + +#: models.py:516 +msgid "slug" +msgstr "" + +#: models.py:520 +msgid "caption" +msgstr "" + +#: models.py:522 +msgid "date added" +msgstr "" + +#: models.py:526 +msgid "Public photographs will be displayed in the default views." +msgstr "" + +#: models.py:535 +msgid "photo" +msgstr "" + +#: models.py:593 models.py:771 +msgid "name" +msgstr "" + +#: models.py:672 +msgid "rotate or flip" +msgstr "" + +#: models.py:676 models.py:704 +msgid "color" +msgstr "" + +#: models.py:678 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "" + +#: models.py:680 +msgid "brightness" +msgstr "" + +#: models.py:682 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "" + +#: models.py:684 +msgid "contrast" +msgstr "" + +#: models.py:686 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original" +" image." +msgstr "" + +#: models.py:688 +msgid "sharpness" +msgstr "" + +#: models.py:690 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "" + +#: models.py:692 +msgid "filters" +msgstr "" + +#: models.py:696 +msgid "size" +msgstr "" + +#: models.py:698 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "" + +#: models.py:701 +msgid "strength" +msgstr "" + +#: models.py:703 +msgid "The initial opacity of the reflection gradient." +msgstr "" + +#: models.py:707 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "" + +#: models.py:711 models.py:815 +msgid "photo effect" +msgstr "" + +#: models.py:712 +msgid "photo effects" +msgstr "" + +#: models.py:743 +msgid "style" +msgstr "" + +#: models.py:747 +msgid "opacity" +msgstr "" + +#: models.py:749 +msgid "The opacity of the overlay." +msgstr "" + +#: models.py:752 +msgid "watermark" +msgstr "" + +#: models.py:753 +msgid "watermarks" +msgstr "" + +#: models.py:775 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "" + +#: models.py:782 +msgid "width" +msgstr "" + +#: models.py:785 +msgid "If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "" + +#: models.py:786 +msgid "height" +msgstr "" + +#: models.py:789 +msgid "If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "" + +#: models.py:790 +msgid "quality" +msgstr "" + +#: models.py:793 +msgid "JPEG image quality." +msgstr "" + +#: models.py:794 +msgid "upscale images?" +msgstr "" + +#: models.py:796 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "" + +#: models.py:800 +msgid "crop to fit?" +msgstr "" + +#: models.py:802 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "" + +#: models.py:804 +msgid "pre-cache?" +msgstr "" + +#: models.py:806 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "" + +#: models.py:807 +msgid "increment view count?" +msgstr "" + +#: models.py:809 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "" + +#: models.py:821 +msgid "watermark image" +msgstr "" + +#: models.py:826 +msgid "photo size" +msgstr "" + +#: models.py:827 +msgid "photo sizes" +msgstr "" + +#: models.py:844 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "" + +#: templates/admin/photologue/photo/change_list.html:9 +msgid "Upload a zip archive" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:15 +msgid "Home" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:19 +#: templates/admin/photologue/photo/upload_zip.html:53 +msgid "Upload" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:28 +msgid "" +"\n" +"\t\t

On this page you can upload many photos at once, as long as you have\n" +"\t\tput them all in a zip archive. The photos can be either:

\n" +"\t\t
    \n" +"\t\t\t
  • Added to an existing gallery.
  • \n" +"\t\t\t
  • Otherwise, a new gallery is created with the supplied title.
  • \n" +"\t\t
\n" +"\t" +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the error below." +msgstr "" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the errors below." +msgstr "" + +#: templates/photologue/gallery_archive.html:4 +#: templates/photologue/gallery_archive.html:9 +msgid "Latest photo galleries" +msgstr "" + +#: templates/photologue/gallery_archive.html:16 +#: templates/photologue/photo_archive.html:16 +msgid "Filter by year" +msgstr "" + +#: templates/photologue/gallery_archive.html:32 +#: templates/photologue/gallery_list.html:26 +msgid "No galleries were found" +msgstr "" + +#: templates/photologue/gallery_archive_day.html:4 +#: templates/photologue/gallery_archive_day.html:9 +#, python-format +msgid "Galleries for %(show_day)s" +msgstr "" + +#: templates/photologue/gallery_archive_day.html:18 +#: templates/photologue/gallery_archive_month.html:32 +#: templates/photologue/gallery_archive_year.html:32 +msgid "No galleries were found." +msgstr "" + +#: templates/photologue/gallery_archive_day.html:22 +msgid "View all galleries for month" +msgstr "" + +#: templates/photologue/gallery_archive_month.html:4 +#: templates/photologue/gallery_archive_month.html:9 +#, python-format +msgid "Galleries for %(show_month)s" +msgstr "" + +#: templates/photologue/gallery_archive_month.html:16 +#: templates/photologue/photo_archive_month.html:16 +msgid "Filter by day" +msgstr "" + +#: templates/photologue/gallery_archive_month.html:35 +msgid "View all galleries for year" +msgstr "" + +#: templates/photologue/gallery_archive_year.html:4 +#: templates/photologue/gallery_archive_year.html:9 +#, python-format +msgid "Galleries for %(show_year)s" +msgstr "" + +#: templates/photologue/gallery_archive_year.html:16 +#: templates/photologue/photo_archive_year.html:17 +msgid "Filter by month" +msgstr "" + +#: templates/photologue/gallery_archive_year.html:35 +#: templates/photologue/gallery_detail.html:17 +msgid "View all galleries" +msgstr "" + +#: templates/photologue/gallery_detail.html:10 +#: templates/photologue/gallery_list.html:16 +#: templates/photologue/includes/gallery_sample.html:8 +#: templates/photologue/photo_detail.html:10 +msgid "Published" +msgstr "" + +#: templates/photologue/gallery_list.html:4 +#: templates/photologue/gallery_list.html:9 +msgid "All galleries" +msgstr "" + +#: templates/photologue/includes/paginator.html:6 +#: templates/photologue/includes/paginator.html:8 +msgid "Previous" +msgstr "" + +#: templates/photologue/includes/paginator.html:11 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "" + +#: templates/photologue/includes/paginator.html:16 +#: templates/photologue/includes/paginator.html:18 +msgid "Next" +msgstr "" + +#: templates/photologue/photo_archive.html:4 +#: templates/photologue/photo_archive.html:9 +msgid "Latest photos" +msgstr "" + +#: templates/photologue/photo_archive.html:34 +#: templates/photologue/photo_archive_day.html:21 +#: templates/photologue/photo_archive_month.html:36 +#: templates/photologue/photo_archive_year.html:37 +#: templates/photologue/photo_list.html:21 +msgid "No photos were found" +msgstr "" + +#: templates/photologue/photo_archive_day.html:4 +#: templates/photologue/photo_archive_day.html:9 +#, python-format +msgid "Photos for %(show_day)s" +msgstr "" + +#: templates/photologue/photo_archive_day.html:24 +msgid "View all photos for month" +msgstr "" + +#: templates/photologue/photo_archive_month.html:4 +#: templates/photologue/photo_archive_month.html:9 +#, python-format +msgid "Photos for %(show_month)s" +msgstr "" + +#: templates/photologue/photo_archive_month.html:39 +msgid "View all photos for year" +msgstr "" + +#: templates/photologue/photo_archive_year.html:4 +#: templates/photologue/photo_archive_year.html:10 +#, python-format +msgid "Photos for %(show_year)s" +msgstr "" + +#: templates/photologue/photo_archive_year.html:40 +msgid "View all photos" +msgstr "" + +#: templates/photologue/photo_detail.html:22 +msgid "This photo is found in the following galleries" +msgstr "" + +#: templates/photologue/photo_list.html:4 +#: templates/photologue/photo_list.html:9 +msgid "All photos" +msgstr "" + +#~ msgid "" +#~ "All uploaded photos will be given a title made up of this title + a " +#~ "sequential number." +#~ msgstr "" +#~ "All photos in the gallery will be given a title made up of the gallery title" +#~ " + a sequential number." + +#~ msgid "Separate tags with spaces, put quotes around multiple-word tags." +#~ msgstr "Separate tags with spaces, put quotes around multiple-word tags." + +#~ msgid "Django-tagging was not found, tags will be treated as plain text." +#~ msgstr "Django-tagging was not found, tags will be treated as plain text." + +#~ msgid "tags" +#~ msgstr "tags" + +#~ msgid "images file (.zip)" +#~ msgstr "images file (.zip)" + +#~ msgid "gallery upload" +#~ msgstr "gallery upload" + +#~ msgid "gallery uploads" +#~ msgstr "gallery uploads" diff --git a/photologue/locale/uk/LC_MESSAGES/django.mo b/photologue/locale/uk/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..be7b67b2b921e0a3cea3bc4b525c75511e5356d9 GIT binary patch literal 21607 zcmd^`3y|Gaea8<9B0*4|zN$TJ2_%r+Y(mhmc^N{&!;pj!5Gfk(?*4c8lDqdV_ukF2 z0yZH8P-uc7BvTQgBWgRfHRM4yFEUf74{FtWYg-&^Tc=~4w&RSWQ*CWKwV&_rod138 zT?h}`(f%j@{r(^4oZs*K-sk*p{_gCPA9EbLIDdun&rf#l8{pli@rUD2-{joo;Pc=a zCpq^s@IBn0ai()iz^lMp!27^e;NOC4z*%p0?ndw)a3)v<=Y#(VUINa0i*px)>%lX? z2f%6IW8mZ9Q{ZR8g=aZ;4s^c*ijRLi+qpM@mz?9=Qg9AYf6B4}1ok z1AgdS=N5q5!PCL7fTH^X2utoCL0ES`1|i{2J}=-~!FO3Q-%z^6v74RG2cfmWr36%IH@Dh|T@AbqB@C_$n8yL$% z@ce6-FL)zF*3$0o>q0#GI`|=;|2KFIc-zWgx1Yn>#y{wX{GA7i&J6G@a51QH)`0Hh8jIe(M$UQQjDpV5DxZaC%yaN{5> zS#FoT=-A1*f%7uXZq7Gw%I2@))G?1UYgge<9{5PSe=MRvdX^7rz7KLX9<#WSeWk}L zE^?e7NFRW2Zn%D!>k_AQcQ@ywoP?Z7$3mV+Pv>&VUUzZIZ>0N#6Z5uX8-HadTf(jV zy@RqVWg4KGUFt}K9kG& zY~E-5N3$b7Q|uecZcMuTx}hW;NaOb=KFQL&*t2l<$YL=vniHJ1Fqd7tw7);;_vM18 zVRC1-RL(+eka3gZc-O+&v`Aa7)(~UalDP8uWGrpvnNMFa$&?vq3_9Y>mqtfMa#@X> zE$5QjKnrIZX}8pOlyakk9qOC$qxtL|qlv$1?aI!9Vm8V5=f*=nKTs%&u|n_dNng2( zZv9EAub3SvXA3+X2*SKNa_d*;=~zte7|j-;tiE+Nvq?$)2QqzSp3}9vtJ@DEE-}!X z%k*u45EB^6mJ^>HMs=EIz4@G4b4{;M%noMr8HBHvFE#LMINWGaQ+v$@EERIuem_`D z#$U;p(M(dUW3;AitP*qR9}o5YZYdGBai49gvh6@|z4aLGRJzfj`rXDgxGN?rbjAfB8;YWU^C>6|OIMbgH^lJVa zo?goP626P_vp7}=s9g(ti;LGOVh&`J9EM-2`*(IAgdGK}rhqid_YxmzTCh05U}Hlf z-`}sM?L(dK^o*A;V0bZd%`$Vei3Gk&*m;M&L}9YGK#U#B z_VZT}YbePM4wZd>b~wqG2#dtCBJnpNTrSI)08*^+U$a-GkDw|VBlx7~XIzyGWJYu4 znQqxo21gj?Iy;g}P(Y6NB|lm+DKhDSLM~Sr)7?m>%sVE#;@Xw#makpEde!pI#qoOG z2UgdwuUWf%c}JJOR#CGyVk*{5Oc_uu6#J86NMv;?DF>QgW+Sr9^yZQtKb;7(tT2jo zNPQ#4f*ezWC%)sZ?t92FO1g>fYRr-DD)Lo`d43EnlrtNW`~owY-ZJw}Jw_cZ+WO_U zT)V>eXUdr_cU3(JxfLcB-#gB`@rJwMLcToIa6g`8if%=YG@VNZ2$Tg+3K=SgM`aYu z6ErKuUv2qJ;X)}4pB*ZUt!H%NO50aPYO0r_TYER|u7Rk#rZAkiYX?%(!Ba37G0@T7 zVWJ8%PW4ji%jA#;?{M1f5{4PbTKQ5Rs&2epCpI9_L++YL z)tMsILIH(OJ*Zz6iOcKiempu7r&de`GsXU#>?SQLkcdj5Dfqd#Vn53>;7zMB$pYNr#B0acOl$ZY)C~oQcODgGJQjc4m*v3 z)m%VX$HoZ3;1#Md#1F<9%v04Us0GgvD2m}g&_%e6k0%kNM|<%}{BuDlKjq6<(2%(x z!9Kd1Y&x_HGEG#YLWVhv_U5vE?z%P0ua3TT$7m*(EsuA(m3Ub?WV^giyX?}!G`!DVR}-`B-3 zhU#v4LS0KZgj;LHO=E3| zHfrIhWN%$)h%tXwFwlah;%uBbineYry4 z1}&`Gy;FQiike|xv&6}$co8;76Mw$ zVFdlG{mNbbMkOQFd<4zmOt~+tDBBIelDKGV=|H7kDwt|~e}TZHqCjRHN z&nV4QY}2zS##z2p2*Es`Y@`|@oYkz6N@IqNyFSMfOezP@PPw{X#(f+W6EIbf+F87PgjEz zzICmScgPqTOm6Z5-`Zpvns^o@tRG_O)67vbJu`-EK5L7Y!bql%e3o+7&dRNQOFI^7 zMJj_}Siyu}j*e?WkAZ0liPx(C+G*xeYPCdXRR%_g)R&F)CL_$CaOmbmK zJk2b17pz%1&EtB@t)q_N54%uqU17xCl&6$pv!@`L{@%_K%kW%XH1e#Fd+KCCUK zcxelb+PjooI(E2kH%h}B8=}|NCwXdO*B9537P_6Po?@m{=7QYhY;~#}7_LGkzQnOo zVwI*6HC$TJXGz=M*m}z~?B=;-V1P{EC_7a~xw;UdK3woVXSvPQ3T>+=NGhI zM$!hSE0x*J8e}C{Dvx7zSFYV@-wi0D`t}ABprCf&1(;mMz+sB0a{gs&_ zPyNDTxPM=!NRH@4sRZJ#zCzdNhQ)Nw4~`P0JJ%(d;U0g}h9Z@1mR>W4%H@%s*|W#S z#=5X4_AUmJJLxq%I}X=tqtEWYoe>J1rZAh%>|7jj_UMM$GpAjD?e)v+vu2xi+A<83 z)X=$Ze1tibSq98z!IfosFSc3OExKvliq84oB5!xyx}8(M?e-UNKgTbj z4TH4nuy~Q5Tkqf(F7oqq8%FQ$_6z--x&H3EqS^ix*wq zH2xJc8{RVBBKWKE54}Zm=J}bTFt^8FHgmx=eaYbaM|E@c-pX^;P1RkMW0k{|Jt~e+ zbNxd|0?hy`E04?c9EhQ7LqR|jYL%5jD`Tsgws-s*$&sqU_B_0=sFr0Kb-x)lcY zc17Tts=KP2E61u^s@tj$K!3LvKae{B0|%V{+<# zr24S>d6<;w_Q1!1+QZt2do-sb)$JZ`p1HWXvvOE%VZqa5zs*RKO%*1sS09kNx?JTm zNP42W*%VscDM36cx-~&a-3K(T34A{^5#GIwCDsm0nUS=Kf}yrH38Qid8oR|QQ#b$~ zgH3(Aq1&G7PEAbWq;n@E7*!UtmkX4{16c!x6#8Kmd%Qm6#0Fu6pbjidmYhn=%x=;E zC&)_s&Nb?th*=i!T9DktEDz!?QttoV#5dyy^5a zCLp_32x@X7jQL>tYLff7W{2J@h8qJ3jH91mKF8YFq^ysCLyUp=bJ(Dacb_bKGrSza zzPGfJsE?;8w@;Rq`pByttsVhSfU6xg*JcJ>B|J?BYQ0Astt>Zx$wE|Hm=95Q3lcbv z_8*i;Y+`a$1&=Vx+M=U{;6TC>> zN%8((i}**$S=+dNxR%YUTPO>*TlhkdppI7fSasg7Q+DWNjQhYOQS)yu)z34Q?LC z6&DvXn}bY53>~1UuFTxTW0={4n!iF7vwE>2N~H{5E_3~&Bbn5R@ zv8!lA-uEFNq$0=0^cA6NQdTER6M>Iyp_n5!inYp7rqUAjC;*;f8f080xR#H*eA`V~ zo1h6}hmwU(PoSA+t#mO#OU#no9#{D^7rYT4mL;K!IiU<<>j-(@hW&o*xyZm@g%fqLt1mo+t5R#Tga` zVeH$_5bMDmRKV}0M%;p)#35B%<>*XTd0cnY3fn6CB=~wEPcevdKm+b5Bg|j+sIZZy zCuBvMRFEDcZz1n%hI#;z<6O)3nY>EeBa-e3e~qp@-9WQmj~)yPVLR?5%SCsf^~Z`-mRvvy@s z=4E8yOw{+7AQ5nCE|eaXBk`*@>a#E2yp3xeE7y0L0!YR!)02k61kG7nWo{XKfpif( z-h?29?36HIYP&oJg|-{kKAj^E83Oe^HW(KTu2J+RIhmZqs2 zYyOKgNI&7dNR#+2uc^g$DmR&;$>D%FQ1A`8fnf8cG?+F-1oJOh9n9{fvBJNEr5^(j zZQ{auQUxEKLAEIe*j#pNIUY#7>=sDni;^GFkw+UF*3@sA~l(iC^v=A zFa;wolZfHEx&_N?6v4~oV5*7A>*X-V;V^i;<`3b9HLoOG-Nj5vW|e1XkGm)eD@^Jt z`fvlgnyxbVXT+wQOTtpnXlz5cY6?n`MVi($p~_qAsK3;!Y?FFJ!>Txx#uqp4?AMLVCk=Ne`CBSZm34lq{;dUqYvC z`!{i>#p40&G+HipOCQSvRgVN3VRQ+=BKgzkGlctwpK6#j zkhnDkC5bKAn>?E2XkNx#J<;>9qLDPdl~()l&@_lE>9c&}nVzZ`)K(C=SCUrz$Br9U z%4Wcft_+WzVT&|Z&bGqO29WK^#;L*DjOk$_%}?^rFR1X@X~B}DiN)FmmY8fvjSxKQ zG!07#%EtC%l6FQ&u8F}du$WpQD)4Nx_;tj0Pw;8yd0`g-Gy|kTRNDGhkB@p%U`Z;MgW? zEB~z{+QmGy*u&jVs1eeCy4Ag;HH+nDE{y}i2J#NEenOK{FxOU;rlvx!c_<_lUFt|B zL?Fvj@JI7!5sb7bQ!|ZI?gbY;jOjdt3xcr}Jh^`RbrTm7duw~^j%OMiS5ZtUkb;j;AyIJZrkCdr2>HwC3Ola;dswv-ky zJWWTT*~4aMh8q5(k!)7s4LCmRVQl~c>gQ>iBYQm zcC|`0jiy(%Dy7}av_AQy7GA2J;S9bB^u&HkmogOeYde<;Bvkt}Qq|1NSTISYuJW?` zOI8j2pJe3YW@ZP>;i!?Gge6u9sEM6B#jSlXLT)tCqB$vLf9kg(KerY@bi%{Xk!)7s zkz1yw-D{>2;#b>65MI_wzSUQP`Mf9-W=aspXJYX&X@w*=sP2?dwRYP=xJ=7CjOHcy z+yIY3wCcXCCr<2J*H;&mxXD2!y z6lG<~QBC8eNKG;4B_9qH4MWkOkre*YCRiJ28Cw6b@~#{4p@ zwQX=Zr3nNd0*Wn(nS!>qWrSveIFBB@yrHdB2)wo@u)CSSgf=Z2Dt?Samd0d*Y4C+f z%veBga;$AC0PHK1N>R%k^h!6(wEj$WP|v#TFnHE-^3DmX{K;(!6*wyw$XNbId?$K_ z!rC54ELxmK1*pcxOB$UVUQlyu5l)AA@SVsWNs5xc58u`OHhv=2lR2 zsZyA_FbI;JESIJsagJZiA}?C#?-x7VW~($*Y-&ZU4>al zPnO$Bh$^}38w8d)+OqDg9wIHPNQsrK1#w$5X?xJpnN?9NQ*3L=GIvX+)prH4fgmmE z9cbTQOr>9#(j{7~B9v4uQm1((_4~=z+3K|oDY3zOnl1m;jEb;-fyb?_KZCQg?c5Rs zo1ER&XD>P1dJ(Fe|Nms*7C};cOfp1jw8q79{C&24Xs#Pz%XX0kBOJqgEPk%j60~tB z)}*W~RaQ&2(qPbhKhtt;Cq;*TLQ;XiP{8VF7rWG$#GHe<<~0{isfYEiL2;EHHsjctvHgB_H-gJ(ortfCFf8n4+O@f8 z?~a{q9_xo1j+?d#8RperE#pO}>X_Qh!pnwdOwg=1{gFr7t-*aTnx~joY@wPv4qb0k zIaH%pe^{lXeQT=knJj7gj=}U8*S;kaIKmE6*iSg9pho9f!6Vm`k)`5|-?QPJ$NT`N zW>84b*3vEWay-{w@jhK>M{ExlGA*e<(oExN+D;`?c!mW`)?g|ER5Zz`+v-w=LO@|( bGPQCea99Dn{qtITtJXtn&8qf^nK}Fq1fMG8 literal 0 HcmV?d00001 diff --git a/photologue/locale/uk/LC_MESSAGES/django.po b/photologue/locale/uk/LC_MESSAGES/django.po new file mode 100644 index 0000000..c8e3800 --- /dev/null +++ b/photologue/locale/uk/LC_MESSAGES/django.po @@ -0,0 +1,778 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Translators: +# Dmytro Litvinov , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-09-03 21:22+0000\n" +"PO-Revision-Date: 2017-12-03 14:47+0000\n" +"Last-Translator: Richard Barran \n" +"Language-Team: Ukrainian (http://www.transifex.com/richardbarran/django-photologue/language/uk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" + +#: admin.py:61 +#, python-format +msgid "" +"The following photo does not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgid_plural "" +"The following photos do not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgstr[0] "Наступна фотографія не відноситься до того ж сайту(сайтам), що і галерея, то ж вона не буде відображена %(photo_list)s" +msgstr[1] "Наступні фотографії не відносяться до того ж сайту(сайтам), що і галерея, то ж вони не будуть відображені %(photo_list)s." +msgstr[2] "Наступні фотографії не відносяться до того ж сайту(сайтам), що і галерея, то ж вони не будуть відображені %(photo_list)s" +msgstr[3] "Наступні фотографії не відносяться до того ж сайту(сайтам), що і галерея, то ж вони не будуть відображені %(photo_list)s" + +#: admin.py:73 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "Галерея була успішно додана до %(site)s" +msgstr[1] "Галереї були успішно додані до%(site)s" +msgstr[2] "Галереї були успішно додані до %(site)s" +msgstr[3] "Галереї були успішно додані до %(site)s" + +#: admin.py:80 +msgid "Add selected galleries to the current site" +msgstr "Додати вибрані галереї до поточного сайту" + +#: admin.py:86 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "Галерея була успішно видалена з %(site)s" +msgstr[1] "Вибрані галереї були успішно видалені з %(site)s" +msgstr[2] "Вибрані галереї були успішно видалені з %(site)s" +msgstr[3] "Вибрані галереї були успішно видалені з %(site)s" + +#: admin.py:93 +msgid "Remove selected galleries from the current site" +msgstr "Видалити вибрані галереї з поточного сайту" + +#: admin.py:100 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "Всі фото в галереї %(galleries)s були успішно додані до %(site)s" +msgstr[1] "Всі фото в галереях %(galleries)sбули успішно додані до %(site)s" +msgstr[2] "Всі фото в галереях %(galleries)s були успішно додані до %(site)s" +msgstr[3] "Всі фото в галереях %(galleries)s були успішно додані до %(site)s" + +#: admin.py:108 +msgid "Add all photos of selected galleries to the current site" +msgstr "Додати всі фото з вибраних галерей до поточного сайту" + +#: admin.py:115 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "Усі фото з галереї %(galleries)s були упішно видели з%(site)s" +msgstr[1] "Усі фото в галереях %(galleries)s були успішно видалені з %(site)s" +msgstr[2] "Усі фото в галереях %(galleries)s були успішно видалені з %(site)s" +msgstr[3] "Усі фото в галереях %(galleries)s були успішно видалені з %(site)s" + +#: admin.py:123 +msgid "Remove all photos in selected galleries from the current site" +msgstr "Видалити всі фото у вибраних галереях з поточного сайту" + +#: admin.py:164 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "Вибрані фото були успішно додані до сайту %(site)s" +msgstr[1] "Вибрані фото були успішно додані до сайтів %(site)s" +msgstr[2] "Вибрані фото були успішно додані до сайтів %(site)s" +msgstr[3] "Вибрані фото були успішно додані до сайтів %(site)s" + +#: admin.py:171 +msgid "Add selected photos to the current site" +msgstr "Додати вибрані фото до поточного сайту" + +#: admin.py:177 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "" +"The selected photos have been successfully removed from %(site)s" +msgstr[0] "Фото було успішно видалено з %(site)s" +msgstr[1] "Вибрані фотографії було успішно видалено з %(site)s" +msgstr[2] "Вибрані фотографії було успішно видалено з %(site)s" +msgstr[3] "Вибрані фотографії було успішно видалено з %(site)s" + +#: admin.py:184 +msgid "Remove selected photos from the current site" +msgstr "Видатили вибрані фото з поточного сайту" + +#: admin.py:198 templates/admin/photologue/photo/upload_zip.html:27 +msgid "Upload a zip archive of photos" +msgstr "Завантажити Zip архів з фотографіями" + +#: forms.py:27 +#| msgid "title" +msgid "Title" +msgstr "Назва" + +#: forms.py:30 +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number.
This field is required if creating a new gallery, but " +"is optional when adding to an existing gallery - if not supplied, the photo " +"titles will be creating from the existing gallery name." +msgstr "Всім завантаженим фото отримають назву, яка складається з цієї назви + послідовний номер. Це поле необхідне для створення нової галереї, але воно необов'язкове, коли додаєшь до існуючої галереї - якщо назва не вказана, назва фотографій буде складана з існюючого ім'я галереї." + +#: forms.py:36 +#| msgid "gallery" +msgid "Gallery" +msgstr "Галерея" + +#: forms.py:38 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "Виберіть галерею для завантаження фотографій. Залиште поле пустим, щоб створити нову галерею з відповідною назвою." + +#: forms.py:40 +#| msgid "caption" +msgid "Caption" +msgstr "Підпис" + +#: forms.py:42 +msgid "Caption will be added to all photos." +msgstr "Підпис був додав до всіх фотографій." + +#: forms.py:43 +#| msgid "description" +msgid "Description" +msgstr "Опис" + +#: forms.py:45 +#| msgid "A description of this Gallery." +msgid "A description of this Gallery. Only required for new galleries." +msgstr "Опис цієї Галереї. Необхідно тільки для нових галерей." + +#: forms.py:46 +#| msgid "is public" +msgid "Is public" +msgstr "Чи є загальнодоступним" + +#: forms.py:49 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "Зніміть цю галку, щоб зробити завантажену галерею і всі фото в ній приватними." + +#: forms.py:72 +msgid "A gallery with that title already exists." +msgstr "Вже є така галерея з такою назвою." + +#: forms.py:82 +#| msgid "Select a .zip file of images to upload into a new Gallery." +msgid "Select an existing gallery, or enter a title for a new gallery." +msgstr "Виберіть існуюючу галерею чи введіть назву для нової галереї." + +#: forms.py:115 +#, python-brace-format +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "Файл \"{filename}\" був пропущений, так як знаходиться в піддиректорії; всі фото повинні бути в кореневій директорії архіву." + +#: forms.py:156 +#, python-brace-format +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "Не вдалось опрацювати файл \"{0}\" в .zip архіві." + +#: forms.py:172 +#, python-brace-format +msgid "The photos have been added to gallery \"{0}\"." +msgstr "Фото були додані до галереї \"{0}\"." + +#: models.py:98 +msgid "Very Low" +msgstr "Дуже низьке" + +#: models.py:99 +msgid "Low" +msgstr "Низьке" + +#: models.py:100 +msgid "Medium-Low" +msgstr "Чуть гірше за середнє" + +#: models.py:101 +msgid "Medium" +msgstr "Середнє" + +#: models.py:102 +msgid "Medium-High" +msgstr "Чуть краще середнього" + +#: models.py:103 +msgid "High" +msgstr "Високе" + +#: models.py:104 +msgid "Very High" +msgstr "Дуже високе" + +#: models.py:109 +msgid "Top" +msgstr "Верхня сторона" + +#: models.py:110 +msgid "Right" +msgstr "Права сторона" + +#: models.py:111 +msgid "Bottom" +msgstr "Нижня сторона" + +#: models.py:112 +msgid "Left" +msgstr "Ліва сторона" + +#: models.py:113 +msgid "Center (Default)" +msgstr "Центр (за замовчуванням)" + +#: models.py:117 +msgid "Flip left to right" +msgstr "Зеркально відобразити зліва направо" + +#: models.py:118 +msgid "Flip top to bottom" +msgstr "Зеркально відобразити зверху вниз" + +#: models.py:119 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Повернути на 90 градусів проти годинникової стрілки" + +#: models.py:120 +msgid "Rotate 90 degrees clockwise" +msgstr "Повернути на 90 градусів за годинниковою стрілкою" + +#: models.py:121 +msgid "Rotate 180 degrees" +msgstr "Повернути на 180 градусів" + +#: models.py:125 +msgid "Tile" +msgstr "Розмістити мозайкою" + +#: models.py:126 +msgid "Scale" +msgstr "Масштабувати" + +#: models.py:136 +#, python-format +msgid "" +"Chain multiple filters using the following pattern " +"\"FILTER_ONE->FILTER_TWO->FILTER_THREE\". Image filters will be applied in " +"order. The following filters are available: %s." +msgstr "Ланцюг з багатьма фільтрами використовує наступний шаблон \"FILTER_ONE->FILTER_TWO->FILTER_THREE\". Фільтри для зображень будуть прийматись у порядку черги. Наступні фільтри доступні: %s" + +#: models.py:158 +msgid "date published" +msgstr "дата публікації" + +#: models.py:160 models.py:513 +msgid "title" +msgstr "назва" + +#: models.py:163 +msgid "title slug" +msgstr "слаг назви" + +#: models.py:166 models.py:519 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "\"слаг\" - унікальна читабельна назва для об'єкта в адресній стрічці." + +#: models.py:167 models.py:596 +msgid "description" +msgstr "опис" + +#: models.py:169 models.py:524 +msgid "is public" +msgstr "публічно" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Публічні галереї будуть відображенні на сторінках по замовчуванням." + +#: models.py:175 models.py:536 +msgid "photos" +msgstr "фотографії" + +#: models.py:177 models.py:527 +msgid "sites" +msgstr "сайти" + +#: models.py:185 +msgid "gallery" +msgstr "галерея" + +#: models.py:186 +msgid "galleries" +msgstr "галереї" + +#: models.py:224 +msgid "count" +msgstr "кількість" + +#: models.py:240 models.py:741 +msgid "image" +msgstr "зображення" + +#: models.py:243 +msgid "date taken" +msgstr "вибрана дата" + +#: models.py:246 +msgid "Date image was taken; is obtained from the image EXIF data." +msgstr "Дані зображення були використані; воно утриється із зображення EXIF даних." + +#: models.py:247 +msgid "view count" +msgstr "кількість просмотрів" + +#: models.py:250 +msgid "crop from" +msgstr "обрізаний з" + +#: models.py:259 +msgid "effect" +msgstr "ефект" + +#: models.py:279 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "Розмір \"admin_thumbnal\" не визначен." + +#: models.py:286 +msgid "Thumbnail" +msgstr "Мініатюра" + +#: models.py:516 +msgid "slug" +msgstr "слаг" + +#: models.py:520 +msgid "caption" +msgstr "підпис" + +#: models.py:522 +msgid "date added" +msgstr "дата завантаження" + +#: models.py:526 +msgid "Public photographs will be displayed in the default views." +msgstr "Публічні фотографії будуть відображатись у використовуваємих уявленнях по замовчуванню." + +#: models.py:535 +msgid "photo" +msgstr "фото" + +#: models.py:593 models.py:771 +msgid "name" +msgstr "ім'я" + +#: models.py:672 +msgid "rotate or flip" +msgstr "повернути чи зеркально відобразити" + +#: models.py:676 models.py:704 +msgid "color" +msgstr "колір" + +#: models.py:678 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "Значення 0.0 дає чорно-біле відображення, а 1.0 віддає оригінальне зображення." + +#: models.py:680 +msgid "brightness" +msgstr "яскравість" + +#: models.py:682 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "Значення 0.0 дає чорне зображення, а 1.0 - оригінальне зображення." + +#: models.py:684 +msgid "contrast" +msgstr "контраст" + +#: models.py:686 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original" +" image." +msgstr "Значення 0.0 дає суцільно сіре відображення, а 1.0 віддає оригінальне зображення." + +#: models.py:688 +msgid "sharpness" +msgstr "різкість" + +#: models.py:690 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "Значення 0.0 дає розмите відображення, а 1.0 віддає оригінальне зображення." + +#: models.py:692 +msgid "filters" +msgstr "фільтри" + +#: models.py:696 +msgid "size" +msgstr "розмір" + +#: models.py:698 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "Висота відбиття у відсотках від оригінального зображення. Коефіцієнт 0.0 не додає відбиття, коефіціент 1.0 додає відбиття рівний висоті оригінального зображення. " + +#: models.py:701 +msgid "strength" +msgstr "сила" + +#: models.py:703 +msgid "The initial opacity of the reflection gradient." +msgstr "Початкова непрозорість градієнта відблиска." + +#: models.py:707 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "Колір фона градієнта відображення. Відмітьте це для відповідності кольора фона вашої сторінки." + +#: models.py:711 models.py:815 +msgid "photo effect" +msgstr "фото-ефект" + +#: models.py:712 +msgid "photo effects" +msgstr "фото-ефекти" + +#: models.py:743 +msgid "style" +msgstr "стиль" + +#: models.py:747 +msgid "opacity" +msgstr "непрозорість" + +#: models.py:749 +msgid "The opacity of the overlay." +msgstr "Непрозорість накладення." + +#: models.py:752 +msgid "watermark" +msgstr "водяний знак" + +#: models.py:753 +msgid "watermarks" +msgstr "водяні знаки" + +#: models.py:775 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "Название размера фотографии должно содержать только буквы, числа и символы подчеркивания. Примеры: \\\"thumbnail\\\", \\\"display\\\", \\\"small\\\", \\\"main_page_widget\\\n\nНазва розміра фотографії повинно мати тільки букви, числа та символи підкреслення. Наприклад: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." + +#: models.py:782 +msgid "width" +msgstr "ширина" + +#: models.py:785 +msgid "If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "Якщо ширина виставлено в \"0\", то зображення буде масштабоване по висоті." + +#: models.py:786 +msgid "height" +msgstr "висота" + +#: models.py:789 +msgid "If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "Якщо висота виставлено в \"0\", то зображення буде масштабоване по ширині" + +#: models.py:790 +msgid "quality" +msgstr "якість" + +#: models.py:793 +msgid "JPEG image quality." +msgstr "якість JPEG зображення" + +#: models.py:794 +msgid "upscale images?" +msgstr "збільшити фото?" + +#: models.py:796 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "Якщо вибрано, то зображення буде масштабоване у випадку необхідності, щоб відповідати розмірам. Обрізані розміри будуть масшабовані незалежно від цієї настройки." + +#: models.py:800 +msgid "crop to fit?" +msgstr "обрізати?" + +#: models.py:802 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "Якщо вибрано, то зображення буде замаштабоване та обрізано по розміру." + +#: models.py:804 +msgid "pre-cache?" +msgstr "кешувати?" + +#: models.py:806 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "Якщо вибрано, то розмір фото буде закешован при додаванні фото." + +#: models.py:807 +msgid "increment view count?" +msgstr "збільшити лічильник просмотрів?" + +#: models.py:809 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "Якщо вибрано, то \"view_count\" зображення буде збільшено, коли показується цей розмір фотографії" + +#: models.py:821 +msgid "watermark image" +msgstr "Водяний знак" + +#: models.py:826 +msgid "photo size" +msgstr "розмір фотографії" + +#: models.py:827 +msgid "photo sizes" +msgstr "Розміри фотографій" + +#: models.py:844 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "Можна обрізати фотографії, якщо встановлені ширина на висота." + +#: templates/admin/photologue/photo/change_list.html:9 +msgid "Upload a zip archive" +msgstr "Завантажити zip архів" + +#: templates/admin/photologue/photo/upload_zip.html:15 +msgid "Home" +msgstr "Головна" + +#: templates/admin/photologue/photo/upload_zip.html:19 +#: templates/admin/photologue/photo/upload_zip.html:53 +msgid "Upload" +msgstr "Завантажити" + +#: templates/admin/photologue/photo/upload_zip.html:28 +msgid "" +"\n" +"\t\t

On this page you can upload many photos at once, as long as you have\n" +"\t\tput them all in a zip archive. The photos can be either:

\n" +"\t\t
    \n" +"\t\t\t
  • Added to an existing gallery.
  • \n" +"\t\t\t
  • Otherwise, a new gallery is created with the supplied title.
  • \n" +"\t\t
\n" +"\t" +msgstr "\n\t\t

На цій сторінці Ви можете загрузити багато фото за раз, поклавши їх у zip архів. Ви можете:

\n\t\t
    \n\t\t\t
  • Додати до існуючої галереї.
  • \n\t\t\t
  • Або, створити нову галерею з вказаною назвою.
  • \n\t\t
\n\t" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the error below." +msgstr "Будь ласка, виправте помилку нижче" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the errors below." +msgstr "Будь ласка, виправте помилки нижче" + +#: templates/photologue/gallery_archive.html:4 +#: templates/photologue/gallery_archive.html:9 +msgid "Latest photo galleries" +msgstr "Останні фото-галереї" + +#: templates/photologue/gallery_archive.html:16 +#: templates/photologue/photo_archive.html:16 +msgid "Filter by year" +msgstr "Фільтр по рокам" + +#: templates/photologue/gallery_archive.html:32 +#: templates/photologue/gallery_list.html:26 +msgid "No galleries were found" +msgstr "Галерей не знайдено" + +#: templates/photologue/gallery_archive_day.html:4 +#: templates/photologue/gallery_archive_day.html:9 +#, python-format +msgid "Galleries for %(show_day)s" +msgstr "Галереї за %(show_day)s" + +#: templates/photologue/gallery_archive_day.html:18 +#: templates/photologue/gallery_archive_month.html:32 +#: templates/photologue/gallery_archive_year.html:32 +msgid "No galleries were found." +msgstr "Галерей не знайдено." + +#: templates/photologue/gallery_archive_day.html:22 +msgid "View all galleries for month" +msgstr "Продивитись всі галереї за місяць" + +#: templates/photologue/gallery_archive_month.html:4 +#: templates/photologue/gallery_archive_month.html:9 +#, python-format +msgid "Galleries for %(show_month)s" +msgstr "Галереї за %(show_month)s" + +#: templates/photologue/gallery_archive_month.html:16 +#: templates/photologue/photo_archive_month.html:16 +msgid "Filter by day" +msgstr "Фільтр по дням" + +#: templates/photologue/gallery_archive_month.html:35 +msgid "View all galleries for year" +msgstr "Продивитись всі галереї за місяць" + +#: templates/photologue/gallery_archive_year.html:4 +#: templates/photologue/gallery_archive_year.html:9 +#, python-format +msgid "Galleries for %(show_year)s" +msgstr "Галереї за %(show_year)s" + +#: templates/photologue/gallery_archive_year.html:16 +#: templates/photologue/photo_archive_year.html:17 +msgid "Filter by month" +msgstr "Фільтр по місяцям" + +#: templates/photologue/gallery_archive_year.html:35 +#: templates/photologue/gallery_detail.html:17 +msgid "View all galleries" +msgstr "Продивитись всі галереї" + +#: templates/photologue/gallery_detail.html:10 +#: templates/photologue/gallery_list.html:16 +#: templates/photologue/includes/gallery_sample.html:8 +#: templates/photologue/photo_detail.html:10 +msgid "Published" +msgstr "Опубліковано" + +#: templates/photologue/gallery_list.html:4 +#: templates/photologue/gallery_list.html:9 +msgid "All galleries" +msgstr "Всі галереї" + +#: templates/photologue/includes/paginator.html:6 +#: templates/photologue/includes/paginator.html:8 +msgid "Previous" +msgstr "Попередня" + +#: templates/photologue/includes/paginator.html:11 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "\n\t\t\t\t сторінка %(page_number)s з %(total_pages)s" + +#: templates/photologue/includes/paginator.html:16 +#: templates/photologue/includes/paginator.html:18 +msgid "Next" +msgstr "Наступна" + +#: templates/photologue/photo_archive.html:4 +#: templates/photologue/photo_archive.html:9 +msgid "Latest photos" +msgstr "Останні фотографії" + +#: templates/photologue/photo_archive.html:34 +#: templates/photologue/photo_archive_day.html:21 +#: templates/photologue/photo_archive_month.html:36 +#: templates/photologue/photo_archive_year.html:37 +#: templates/photologue/photo_list.html:21 +msgid "No photos were found" +msgstr "Фотографій не знайдено" + +#: templates/photologue/photo_archive_day.html:4 +#: templates/photologue/photo_archive_day.html:9 +#, python-format +msgid "Photos for %(show_day)s" +msgstr "Фото за %(show_day)s" + +#: templates/photologue/photo_archive_day.html:24 +msgid "View all photos for month" +msgstr "Всі фото за місяць" + +#: templates/photologue/photo_archive_month.html:4 +#: templates/photologue/photo_archive_month.html:9 +#, python-format +msgid "Photos for %(show_month)s" +msgstr "Фото за %(show_month)s" + +#: templates/photologue/photo_archive_month.html:39 +msgid "View all photos for year" +msgstr "Всі фото за рік" + +#: templates/photologue/photo_archive_year.html:4 +#: templates/photologue/photo_archive_year.html:10 +#, python-format +msgid "Photos for %(show_year)s" +msgstr "Фото за %(show_year)s" + +#: templates/photologue/photo_archive_year.html:40 +msgid "View all photos" +msgstr "Продивись всі фотографії" + +#: templates/photologue/photo_detail.html:22 +msgid "This photo is found in the following galleries" +msgstr "Це фото знайдено у наступних галереях" + +#: templates/photologue/photo_list.html:4 +#: templates/photologue/photo_list.html:9 +msgid "All photos" +msgstr "Всі фото" + +#~ msgid "" +#~ "All uploaded photos will be given a title made up of this title + a " +#~ "sequential number." +#~ msgstr "" +#~ "All photos in the gallery will be given a title made up of the gallery title" +#~ " + a sequential number." + +#~ msgid "Separate tags with spaces, put quotes around multiple-word tags." +#~ msgstr "Separate tags with spaces, put quotes around multiple-word tags." + +#~ msgid "Django-tagging was not found, tags will be treated as plain text." +#~ msgstr "Django-tagging was not found, tags will be treated as plain text." + +#~ msgid "tags" +#~ msgstr "tags" + +#~ msgid "images file (.zip)" +#~ msgstr "images file (.zip)" + +#~ msgid "gallery upload" +#~ msgstr "gallery upload" + +#~ msgid "gallery uploads" +#~ msgstr "gallery uploads" diff --git a/photologue/locale/zh_Hans/LC_MESSAGES/django.mo b/photologue/locale/zh_Hans/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..2236d8a03c161d665a1749b4bc1eac2b697c7422 GIT binary patch literal 12714 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\n" +"Language-Team: Chinese Simplified (http://www.transifex.com/richardbarran/django-photologue/language/zh-Hans/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh-Hans\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: admin.py:61 +#, python-format +msgid "" +"The following photo does not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgid_plural "" +"The following photos do not belong to the same site(s) as the gallery, so " +"will never be displayed: %(photo_list)s." +msgstr[0] "" + +#: admin.py:73 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "" + +#: admin.py:80 +msgid "Add selected galleries to the current site" +msgstr "添加选中图库到当前站点" + +#: admin.py:86 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "" + +#: admin.py:93 +msgid "Remove selected galleries from the current site" +msgstr "从当前站点中移除选中图库" + +#: admin.py:100 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "" + +#: admin.py:108 +msgid "Add all photos of selected galleries to the current site" +msgstr "添加选中图库中的所有照片至当前站点" + +#: admin.py:115 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "" + +#: admin.py:123 +msgid "Remove all photos in selected galleries from the current site" +msgstr "从当前站点中移除选中图库中的所有照片" + +#: admin.py:164 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "" + +#: admin.py:171 +msgid "Add selected photos to the current site" +msgstr "添加选中照片至当前站点" + +#: admin.py:177 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "" +"The selected photos have been successfully removed from %(site)s" +msgstr[0] "" + +#: admin.py:184 +msgid "Remove selected photos from the current site" +msgstr "从当前站点中移除选中照片" + +#: admin.py:198 templates/admin/photologue/photo/upload_zip.html:27 +msgid "Upload a zip archive of photos" +msgstr "上传照片的 zip 存档" + +#: forms.py:27 +#| msgid "title" +msgid "Title" +msgstr "标题" + +#: forms.py:30 +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number.
This field is required if creating a new gallery, but " +"is optional when adding to an existing gallery - if not supplied, the photo " +"titles will be creating from the existing gallery name." +msgstr "所有已上传的照片将被冠以一个由 此标题 + 有序数字 组成的新标题.
此字段在创建新图库时是必需的, 但是在被添加到某个已经存在的图库时则是可选的 - 如果未填写此字段, 照片标题将由这个已经存在的图库标题按上述规则组合而成." + +#: forms.py:36 +#| msgid "gallery" +msgid "Gallery" +msgstr "图库" + +#: forms.py:38 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "选择一个图库以将这些图片添加进去. 如若留空, 则以所提供的标题来创建一个新图库." + +#: forms.py:40 +#| msgid "caption" +msgid "Caption" +msgstr "副标题" + +#: forms.py:42 +msgid "Caption will be added to all photos." +msgstr "副标题将会被添加到所有照片中." + +#: forms.py:43 +#| msgid "description" +msgid "Description" +msgstr "描述信息" + +#: forms.py:45 +#| msgid "A description of this Gallery." +msgid "A description of this Gallery. Only required for new galleries." +msgstr "此图库的描述信息. 此字段只有对新创建的图库是必需的." + +#: forms.py:46 +#| msgid "is public" +msgid "Is public" +msgstr "是否公开" + +#: forms.py:49 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "反选此处将使得上传的图库及包含的照片设为私有." + +#: forms.py:72 +msgid "A gallery with that title already exists." +msgstr "已经存在一个名称相同的图库" + +#: forms.py:82 +#| msgid "Select a .zip file of images to upload into a new Gallery." +msgid "Select an existing gallery, or enter a title for a new gallery." +msgstr "选择一个现有图库, 或者键入标题以创建一个新图库" + +#: forms.py:115 +#, python-brace-format +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "忽略文件 \"{filename}\" 因为它存在于子目录当中; 所有图像应当存在于 zip 存档的顶层目录中." + +#: forms.py:156 +#, python-brace-format +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "无法处理 .zip 存档当中的文件 \"{0}\"." + +#: forms.py:172 +#, python-brace-format +msgid "The photos have been added to gallery \"{0}\"." +msgstr "照片已被添加至图库 \"{0}\"." + +#: models.py:98 +msgid "Very Low" +msgstr "非常低" + +#: models.py:99 +msgid "Low" +msgstr "低" + +#: models.py:100 +msgid "Medium-Low" +msgstr "较低" + +#: models.py:101 +msgid "Medium" +msgstr "中等" + +#: models.py:102 +msgid "Medium-High" +msgstr "较高" + +#: models.py:103 +msgid "High" +msgstr "高" + +#: models.py:104 +msgid "Very High" +msgstr "非常高" + +#: models.py:109 +msgid "Top" +msgstr "顶部" + +#: models.py:110 +msgid "Right" +msgstr "右侧" + +#: models.py:111 +msgid "Bottom" +msgstr "底部" + +#: models.py:112 +msgid "Left" +msgstr "左侧" + +#: models.py:113 +msgid "Center (Default)" +msgstr "居中 (默认)" + +#: models.py:117 +msgid "Flip left to right" +msgstr "左右翻转" + +#: models.py:118 +msgid "Flip top to bottom" +msgstr "上下翻转" + +#: models.py:119 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "逆时针旋转 90 度" + +#: models.py:120 +msgid "Rotate 90 degrees clockwise" +msgstr "顺时针旋转 90 度" + +#: models.py:121 +msgid "Rotate 180 degrees" +msgstr "旋转 180 度" + +#: models.py:125 +msgid "Tile" +msgstr "平铺" + +#: models.py:126 +msgid "Scale" +msgstr "缩放" + +#: models.py:136 +#, python-format +msgid "" +"Chain multiple filters using the following pattern " +"\"FILTER_ONE->FILTER_TWO->FILTER_THREE\". Image filters will be applied in " +"order. The following filters are available: %s." +msgstr "请按 \"FILTER_ONE->FILTER_TWO->FILTER_THREE\" 的格式来串联多个滤镜. 将按照顺序应用图像滤镜. 可用的滤镜有: %s." + +#: models.py:158 +msgid "date published" +msgstr "发布日期" + +#: models.py:160 models.py:513 +msgid "title" +msgstr "标题" + +#: models.py:163 +msgid "title slug" +msgstr "标题缩写" + +#: models.py:166 models.py:519 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "标题缩写是一个唯一的、易于在 URL 当中使用和解析一个对象的标题" + +#: models.py:167 models.py:596 +msgid "description" +msgstr "描述" + +#: models.py:169 models.py:524 +msgid "is public" +msgstr "是否公开" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "公开图库将被显示在默认视图中." + +#: models.py:175 models.py:536 +msgid "photos" +msgstr "照片" + +#: models.py:177 models.py:527 +msgid "sites" +msgstr "站点" + +#: models.py:185 +msgid "gallery" +msgstr "图库" + +#: models.py:186 +msgid "galleries" +msgstr "图库" + +#: models.py:224 +msgid "count" +msgstr "数量" + +#: models.py:240 models.py:741 +msgid "image" +msgstr "图像" + +#: models.py:243 +msgid "date taken" +msgstr "拍摄日期" + +#: models.py:246 +msgid "Date image was taken; is obtained from the image EXIF data." +msgstr "图像拍摄时的日期; 包含在图像的 EXIF 元数据中" + +#: models.py:247 +msgid "view count" +msgstr "浏览次数" + +#: models.py:250 +msgid "crop from" +msgstr "裁剪自" + +#: models.py:259 +msgid "effect" +msgstr "效果" + +#: models.py:279 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "\"admin_thumbnail\" 图像尺寸尚未定义." + +#: models.py:286 +msgid "Thumbnail" +msgstr "缩略图" + +#: models.py:516 +msgid "slug" +msgstr "缩写" + +#: models.py:520 +msgid "caption" +msgstr "副标题" + +#: models.py:522 +msgid "date added" +msgstr "添加日期" + +#: models.py:526 +msgid "Public photographs will be displayed in the default views." +msgstr "公开照片将被显示在默认视图中." + +#: models.py:535 +msgid "photo" +msgstr "照片" + +#: models.py:593 models.py:771 +msgid "name" +msgstr "名称" + +#: models.py:672 +msgid "rotate or flip" +msgstr "旋转或翻转" + +#: models.py:676 models.py:704 +msgid "color" +msgstr "色彩" + +#: models.py:678 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "数值为 0.0 时将产生黑白图像, 数值为 1.0 时将产生原图." + +#: models.py:680 +msgid "brightness" +msgstr "亮度" + +#: models.py:682 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "数值为 0.0 时将产生纯黑色图像, 数值为 1.0 时将产生原图." + +#: models.py:684 +msgid "contrast" +msgstr "对比度" + +#: models.py:686 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original" +" image." +msgstr "数值为 0.0 时将产生纯灰色图像, 数值为 1.0 时将产生原图." + +#: models.py:688 +msgid "sharpness" +msgstr "锐度" + +#: models.py:690 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "数值为 0.0 时将产生模糊图像, 数值为 1.0 时将产生原图." + +#: models.py:692 +msgid "filters" +msgstr "滤镜" + +#: models.py:696 +msgid "size" +msgstr "尺寸" + +#: models.py:698 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "倒影的高度占原图高度的百分比. 数值为 0.0 时将不添加倒影, 数值为 1.0 时将添加一个与原图高度相同的倒影." + +#: models.py:701 +msgid "strength" +msgstr "拉伸" + +#: models.py:703 +msgid "The initial opacity of the reflection gradient." +msgstr "倒影渐变的初始不透明度." + +#: models.py:707 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "倒影渐变的背景色. 请将其设置为展示页面的背景色. " + +#: models.py:711 models.py:815 +msgid "photo effect" +msgstr "照片效果" + +#: models.py:712 +msgid "photo effects" +msgstr "照片效果" + +#: models.py:743 +msgid "style" +msgstr "样式" + +#: models.py:747 +msgid "opacity" +msgstr "不透明度" + +#: models.py:749 +msgid "The opacity of the overlay." +msgstr "遮罩的不透明度" + +#: models.py:752 +msgid "watermark" +msgstr "水印" + +#: models.py:753 +msgid "watermarks" +msgstr "水印" + +#: models.py:775 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "照片尺寸名称应当仅包含字母, 数字和下划线. 示例: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." + +#: models.py:782 +msgid "width" +msgstr "宽度" + +#: models.py:785 +msgid "If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "如果宽度设置为 \"0\" 则图像将以高度为准进行缩放." + +#: models.py:786 +msgid "height" +msgstr "高度" + +#: models.py:789 +msgid "If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "如果高度设置为 \"0\" 则图像将以宽度为准进行缩放." + +#: models.py:790 +msgid "quality" +msgstr "质量" + +#: models.py:793 +msgid "JPEG image quality." +msgstr "JPEG 图像质量" + +#: models.py:794 +msgid "upscale images?" +msgstr "放大图像?" + +#: models.py:796 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "如果勾选此项, 图像将按需放大以适应所提供的尺寸.裁剪后的尺寸将忽略此项设定并被放大." + +#: models.py:800 +msgid "crop to fit?" +msgstr "裁剪以适应?" + +#: models.py:802 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "如果勾选此项, 图像将被缩放并裁剪以适应所提供的尺寸." + +#: models.py:804 +msgid "pre-cache?" +msgstr "预缓存?" + +#: models.py:806 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "如果勾选此项, 当添加照片被添加时, 将被处理为该尺寸并预先缓存." + +#: models.py:807 +msgid "increment view count?" +msgstr "累计预览次数?" + +#: models.py:809 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "如果勾选此项, 图像的 \"预览次数\" 将在该尺寸的图像被显示时一并累计." + +#: models.py:821 +msgid "watermark image" +msgstr "水印图像" + +#: models.py:826 +msgid "photo size" +msgstr "图像尺寸" + +#: models.py:827 +msgid "photo sizes" +msgstr "图像尺寸" + +#: models.py:844 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "仅当宽度和高度都被设置时裁剪照片" + +#: templates/admin/photologue/photo/change_list.html:9 +msgid "Upload a zip archive" +msgstr "上传 zip 存档" + +#: templates/admin/photologue/photo/upload_zip.html:15 +msgid "Home" +msgstr "首页" + +#: templates/admin/photologue/photo/upload_zip.html:19 +#: templates/admin/photologue/photo/upload_zip.html:53 +msgid "Upload" +msgstr "上传" + +#: templates/admin/photologue/photo/upload_zip.html:28 +msgid "" +"\n" +"\t\t

On this page you can upload many photos at once, as long as you have\n" +"\t\tput them all in a zip archive. The photos can be either:

\n" +"\t\t
    \n" +"\t\t\t
  • Added to an existing gallery.
  • \n" +"\t\t\t
  • Otherwise, a new gallery is created with the supplied title.
  • \n" +"\t\t
\n" +"\t" +msgstr "\n\t\t

在此页面, 你可以一次性上传包含多张图片的 zip 存档,\n\t\t上传的图片可以被:

\n\t\t
    \n\t\t\t
  • 添加至现有图库.
  • \n\t\t\t
  • 或者, 以提供的标题创建一个新图库.
  • \n\t\t
\n\t" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the error below." +msgstr "请更正以下错误" + +#: templates/admin/photologue/photo/upload_zip.html:39 +msgid "Please correct the errors below." +msgstr "请更正以下错误" + +#: templates/photologue/gallery_archive.html:4 +#: templates/photologue/gallery_archive.html:9 +msgid "Latest photo galleries" +msgstr "最新照片图库" + +#: templates/photologue/gallery_archive.html:16 +#: templates/photologue/photo_archive.html:16 +msgid "Filter by year" +msgstr "按年过滤" + +#: templates/photologue/gallery_archive.html:32 +#: templates/photologue/gallery_list.html:26 +msgid "No galleries were found" +msgstr "未找到图库" + +#: templates/photologue/gallery_archive_day.html:4 +#: templates/photologue/gallery_archive_day.html:9 +#, python-format +msgid "Galleries for %(show_day)s" +msgstr "%(show_day)s 的图库" + +#: templates/photologue/gallery_archive_day.html:18 +#: templates/photologue/gallery_archive_month.html:32 +#: templates/photologue/gallery_archive_year.html:32 +msgid "No galleries were found." +msgstr "未找到图库" + +#: templates/photologue/gallery_archive_day.html:22 +msgid "View all galleries for month" +msgstr "按月份浏览所有图库" + +#: templates/photologue/gallery_archive_month.html:4 +#: templates/photologue/gallery_archive_month.html:9 +#, python-format +msgid "Galleries for %(show_month)s" +msgstr "%(show_month)s 的图库" + +#: templates/photologue/gallery_archive_month.html:16 +#: templates/photologue/photo_archive_month.html:16 +msgid "Filter by day" +msgstr "按天过滤" + +#: templates/photologue/gallery_archive_month.html:35 +msgid "View all galleries for year" +msgstr "按年份浏览所有图库" + +#: templates/photologue/gallery_archive_year.html:4 +#: templates/photologue/gallery_archive_year.html:9 +#, python-format +msgid "Galleries for %(show_year)s" +msgstr "%(show_year)s 的图库" + +#: templates/photologue/gallery_archive_year.html:16 +#: templates/photologue/photo_archive_year.html:17 +msgid "Filter by month" +msgstr "按月过滤" + +#: templates/photologue/gallery_archive_year.html:35 +#: templates/photologue/gallery_detail.html:17 +msgid "View all galleries" +msgstr "浏览所有图库" + +#: templates/photologue/gallery_detail.html:10 +#: templates/photologue/gallery_list.html:16 +#: templates/photologue/includes/gallery_sample.html:8 +#: templates/photologue/photo_detail.html:10 +msgid "Published" +msgstr "已发布的" + +#: templates/photologue/gallery_list.html:4 +#: templates/photologue/gallery_list.html:9 +msgid "All galleries" +msgstr "所有图库" + +#: templates/photologue/includes/paginator.html:6 +#: templates/photologue/includes/paginator.html:8 +msgid "Previous" +msgstr "上一页" + +#: templates/photologue/includes/paginator.html:11 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "\n\t\t\t\t 第 %(page_number)s / %(total_pages)s 页\n\t\t\t\t" + +#: templates/photologue/includes/paginator.html:16 +#: templates/photologue/includes/paginator.html:18 +msgid "Next" +msgstr "下一页" + +#: templates/photologue/photo_archive.html:4 +#: templates/photologue/photo_archive.html:9 +msgid "Latest photos" +msgstr "最新照片" + +#: templates/photologue/photo_archive.html:34 +#: templates/photologue/photo_archive_day.html:21 +#: templates/photologue/photo_archive_month.html:36 +#: templates/photologue/photo_archive_year.html:37 +#: templates/photologue/photo_list.html:21 +msgid "No photos were found" +msgstr "未找到照片" + +#: templates/photologue/photo_archive_day.html:4 +#: templates/photologue/photo_archive_day.html:9 +#, python-format +msgid "Photos for %(show_day)s" +msgstr "%(show_day)s 的照片" + +#: templates/photologue/photo_archive_day.html:24 +msgid "View all photos for month" +msgstr "按月份浏览所有照片" + +#: templates/photologue/photo_archive_month.html:4 +#: templates/photologue/photo_archive_month.html:9 +#, python-format +msgid "Photos for %(show_month)s" +msgstr "%(show_month)s 的照片" + +#: templates/photologue/photo_archive_month.html:39 +msgid "View all photos for year" +msgstr "按年份浏览所有照片" + +#: templates/photologue/photo_archive_year.html:4 +#: templates/photologue/photo_archive_year.html:10 +#, python-format +msgid "Photos for %(show_year)s" +msgstr "%(show_year)s 的照片" + +#: templates/photologue/photo_archive_year.html:40 +msgid "View all photos" +msgstr "浏览所有照片" + +#: templates/photologue/photo_detail.html:22 +msgid "This photo is found in the following galleries" +msgstr "此照片在下列图库中被找到" + +#: templates/photologue/photo_list.html:4 +#: templates/photologue/photo_list.html:9 +msgid "All photos" +msgstr "所有照片" + +#~ msgid "" +#~ "All uploaded photos will be given a title made up of this title + a " +#~ "sequential number." +#~ msgstr "" +#~ "All photos in the gallery will be given a title made up of the gallery title" +#~ " + a sequential number." + +#~ msgid "Separate tags with spaces, put quotes around multiple-word tags." +#~ msgstr "Separate tags with spaces, put quotes around multiple-word tags." + +#~ msgid "Django-tagging was not found, tags will be treated as plain text." +#~ msgstr "Django-tagging was not found, tags will be treated as plain text." + +#~ msgid "tags" +#~ msgstr "tags" + +#~ msgid "images file (.zip)" +#~ msgstr "images file (.zip)" + +#~ msgid "gallery upload" +#~ msgstr "gallery upload" + +#~ msgid "gallery uploads" +#~ msgstr "gallery uploads" diff --git a/photologue/management/__init__.py b/photologue/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/photologue/management/commands/__init__.py b/photologue/management/commands/__init__.py new file mode 100644 index 0000000..af67d5b --- /dev/null +++ b/photologue/management/commands/__init__.py @@ -0,0 +1,39 @@ +from photologue.models import PhotoSize + + +def get_response(msg, func=int, default=None): + while True: + resp = input(msg) + if not resp and default is not None: + return default + try: + return func(resp) + except: + print('Invalid input.') + + +def create_photosize(name, width=0, height=0, crop=False, pre_cache=False, increment_count=False): + try: + size = PhotoSize.objects.get(name=name) + exists = True + except PhotoSize.DoesNotExist: + size = PhotoSize(name=name) + exists = False + if exists: + msg = 'A "%s" photo size already exists. Do you want to replace it? (yes, no):' % name + if not get_response(msg, lambda inp: inp == 'yes', False): + return + print('\nWe will now define the "%s" photo size:\n' % size) + w = get_response('Width (in pixels):', lambda inp: int(inp), width) + h = get_response('Height (in pixels):', lambda inp: int(inp), height) + c = get_response('Crop to fit? (yes, no):', lambda inp: inp == 'yes', crop) + p = get_response('Pre-cache? (yes, no):', lambda inp: inp == 'yes', pre_cache) + i = get_response('Increment count? (yes, no):', lambda inp: inp == 'yes', increment_count) + size.width = w + size.height = h + size.crop = c + size.pre_cache = p + size.increment_count = i + size.save() + print('\nA "%s" photo size has been created.\n' % name) + return size diff --git a/photologue/management/commands/plcache.py b/photologue/management/commands/plcache.py new file mode 100644 index 0000000..871a0e3 --- /dev/null +++ b/photologue/management/commands/plcache.py @@ -0,0 +1,41 @@ +from django.core.management.base import BaseCommand, CommandError + +from photologue.models import ImageModel, PhotoSize + + +class Command(BaseCommand): + + help = 'Manages Photologue cache file for the given sizes.' + + def add_arguments(self, parser): + parser.add_argument('sizes', + nargs='*', + type=str, + help='Name of the photosize.') + parser.add_argument('--reset', + action='store_true', + default=False, + dest='reset', + help='Reset photo cache before generating.') + + def handle(self, *args, **options): + reset = options['reset'] + sizes = options['sizes'] + + if not sizes: + photosizes = PhotoSize.objects.all() + else: + photosizes = PhotoSize.objects.filter(name__in=sizes) + + if not len(photosizes): + raise CommandError('No photo sizes were found.') + + print('Caching photos, this may take a while...') + + for cls in ImageModel.__subclasses__(): + for photosize in photosizes: + print('Cacheing %s size images' % photosize.name) + for obj in cls.objects.all(): + if reset: + obj.remove_size(photosize) + obj.create_size(photosize) diff --git a/photologue/management/commands/plcreatesize.py b/photologue/management/commands/plcreatesize.py new file mode 100644 index 0000000..8244401 --- /dev/null +++ b/photologue/management/commands/plcreatesize.py @@ -0,0 +1,17 @@ +from django.core.management.base import BaseCommand + +from photologue.management.commands import create_photosize + + +class Command(BaseCommand): + help = ('Creates a new Photologue photo size interactively.') + requires_model_validation = True + can_import_settings = True + + def add_arguments(self, parser): + parser.add_argument('name', + type=str, + help='Name of the new photo size') + + def handle(self, *args, **options): + create_photosize(options['name']) diff --git a/photologue/management/commands/plflush.py b/photologue/management/commands/plflush.py new file mode 100644 index 0000000..06ae824 --- /dev/null +++ b/photologue/management/commands/plflush.py @@ -0,0 +1,32 @@ +from django.core.management.base import BaseCommand, CommandError + +from photologue.models import ImageModel, PhotoSize + + +class Command(BaseCommand): + help = 'Clears the Photologue cache for the given sizes.' + + def add_arguments(self, parser): + parser.add_argument('sizes', + nargs='*', + type=str, + help='Name of the photosize.') + + def handle(self, *args, **options): + sizes = options['sizes'] + + if not sizes: + photosizes = PhotoSize.objects.all() + else: + photosizes = PhotoSize.objects.filter(name__in=sizes) + + if not len(photosizes): + raise CommandError('No photo sizes were found.') + + print('Flushing cache...') + + for cls in ImageModel.__subclasses__(): + for photosize in photosizes: + print('Flushing %s size images' % photosize.name) + for obj in cls.objects.all(): + obj.remove_size(photosize) diff --git a/photologue/managers.py b/photologue/managers.py new file mode 100644 index 0000000..0874613 --- /dev/null +++ b/photologue/managers.py @@ -0,0 +1,23 @@ +from django.conf import settings +from django.db.models.query import QuerySet + + +class SharedQueries: + + """Some queries that are identical for Gallery and Photo.""" + + def is_public(self): + """Trivial filter - will probably become more complex as time goes by!""" + return self.filter(is_public=True) + + def on_site(self): + """Return objects linked to the current site only.""" + return self.filter(sites__id=settings.SITE_ID) + + +class GalleryQuerySet(SharedQueries, QuerySet): + pass + + +class PhotoQuerySet(SharedQueries, QuerySet): + pass diff --git a/photologue/migrations/0001_initial.py b/photologue/migrations/0001_initial.py new file mode 100644 index 0000000..0366e0e --- /dev/null +++ b/photologue/migrations/0001_initial.py @@ -0,0 +1,154 @@ +from django.db import models, migrations +import photologue.models +import django.utils.timezone +import django.core.validators +import sortedm2m.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('sites', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Gallery', + fields=[ + ('id', models.AutoField(primary_key=True, verbose_name='ID', serialize=False, auto_created=True)), + ('date_added', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date published')), + ('title', models.CharField(max_length=50, verbose_name='title', unique=True)), + ('slug', models.SlugField(help_text='A "slug" is a unique URL-friendly title for an object.', verbose_name='title slug', unique=True)), + ('description', models.TextField(blank=True, verbose_name='description')), + ('is_public', models.BooleanField(help_text='Public galleries will be displayed in the default views.', verbose_name='is public', default=True)), + ('tags', photologue.models.TagField(max_length=255, help_text='Django-tagging was not found, tags will be treated as plain text.', blank=True, verbose_name='tags')), + ('sites', models.ManyToManyField(blank=True, verbose_name='sites', null=True, to='sites.Site')), + ], + options={ + 'get_latest_by': 'date_added', + 'verbose_name': 'gallery', + 'ordering': ['-date_added'], + 'verbose_name_plural': 'galleries', + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='GalleryUpload', + fields=[ + ('id', models.AutoField(primary_key=True, verbose_name='ID', serialize=False, auto_created=True)), + ('zip_file', models.FileField(help_text='Select a .zip file of images to upload into a new Gallery.', verbose_name='images file (.zip)', upload_to='photologue/temp')), + ('title', models.CharField(max_length=50, help_text='All uploaded photos will be given a title made up of this title + a sequential number.', verbose_name='title')), + ('caption', models.TextField(help_text='Caption will be added to all photos.', blank=True, verbose_name='caption')), + ('description', models.TextField(help_text='A description of this Gallery.', blank=True, verbose_name='description')), + ('is_public', models.BooleanField(help_text='Uncheck this to make the uploaded gallery and included photographs private.', verbose_name='is public', default=True)), + ('tags', models.CharField(max_length=255, help_text='Django-tagging was not found, tags will be treated as plain text.', blank=True, verbose_name='tags')), + ('gallery', models.ForeignKey(blank=True, verbose_name='gallery', null=True, help_text='Select a gallery to add these images to. Leave this empty to create a new gallery from the supplied title.', to='photologue.Gallery', on_delete=models.CASCADE)), + ], + options={ + 'verbose_name': 'gallery upload', + 'verbose_name_plural': 'gallery uploads', + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Photo', + fields=[ + ('id', models.AutoField(primary_key=True, verbose_name='ID', serialize=False, auto_created=True)), + ('image', models.ImageField(upload_to=photologue.models.get_storage_path, verbose_name='image')), + ('date_taken', models.DateTimeField(verbose_name='date taken', blank=True, editable=False, null=True)), + ('view_count', models.PositiveIntegerField(verbose_name='view count', default=0, editable=False)), + ('crop_from', models.CharField(max_length=10, default='center', blank=True, verbose_name='crop from', choices=[('top', 'Top'), ('right', 'Right'), ('bottom', 'Bottom'), ('left', 'Left'), ('center', 'Center (Default)')])), + ('title', models.CharField(max_length=50, verbose_name='title', unique=True)), + ('slug', models.SlugField(help_text='A "slug" is a unique URL-friendly title for an object.', verbose_name='slug', unique=True)), + ('caption', models.TextField(blank=True, verbose_name='caption')), + ('date_added', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date added')), + ('is_public', models.BooleanField(help_text='Public photographs will be displayed in the default views.', verbose_name='is public', default=True)), + ('tags', photologue.models.TagField(max_length=255, help_text='Django-tagging was not found, tags will be treated as plain text.', blank=True, verbose_name='tags')), + ('sites', models.ManyToManyField(blank=True, verbose_name='sites', null=True, to='sites.Site')), + ], + options={ + 'get_latest_by': 'date_added', + 'verbose_name': 'photo', + 'ordering': ['-date_added'], + 'verbose_name_plural': 'photos', + }, + bases=(models.Model,), + ), + migrations.AddField( + model_name='gallery', + name='photos', + field=sortedm2m.fields.SortedManyToManyField(blank=True, verbose_name='photos', null=True, to='photologue.Photo'), + preserve_default=True, + ), + migrations.CreateModel( + name='PhotoEffect', + fields=[ + ('id', models.AutoField(primary_key=True, verbose_name='ID', serialize=False, auto_created=True)), + ('name', models.CharField(max_length=30, verbose_name='name', unique=True)), + ('description', models.TextField(blank=True, verbose_name='description')), + ('transpose_method', models.CharField(max_length=15, blank=True, verbose_name='rotate or flip', choices=[('FLIP_LEFT_RIGHT', 'Flip left to right'), ('FLIP_TOP_BOTTOM', 'Flip top to bottom'), ('ROTATE_90', 'Rotate 90 degrees counter-clockwise'), ('ROTATE_270', 'Rotate 90 degrees clockwise'), ('ROTATE_180', 'Rotate 180 degrees')])), + ('color', models.FloatField(help_text='A factor of 0.0 gives a black and white image, a factor of 1.0 gives the original image.', verbose_name='color', default=1.0)), + ('brightness', models.FloatField(help_text='A factor of 0.0 gives a black image, a factor of 1.0 gives the original image.', verbose_name='brightness', default=1.0)), + ('contrast', models.FloatField(help_text='A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original image.', verbose_name='contrast', default=1.0)), + ('sharpness', models.FloatField(help_text='A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original image.', verbose_name='sharpness', default=1.0)), + ('filters', models.CharField(max_length=200, help_text='Chain multiple filters using the following pattern "FILTER_ONE->FILTER_TWO->FILTER_THREE". Image filters will be applied in order. The following filters are available: BLUR, CONTOUR, DETAIL, EDGE_ENHANCE, EDGE_ENHANCE_MORE, EMBOSS, FIND_EDGES, SHARPEN, SMOOTH, SMOOTH_MORE.', blank=True, verbose_name='filters')), + ('reflection_size', models.FloatField(help_text='The height of the reflection as a percentage of the orignal image. A factor of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the height of the orignal image.', verbose_name='size', default=0)), + ('reflection_strength', models.FloatField(help_text='The initial opacity of the reflection gradient.', verbose_name='strength', default=0.6)), + ('background_color', models.CharField(max_length=7, help_text='The background color of the reflection gradient. Set this to match the background color of your page.', verbose_name='color', default='#FFFFFF')), + ], + options={ + 'verbose_name': 'photo effect', + 'verbose_name_plural': 'photo effects', + }, + bases=(models.Model,), + ), + migrations.AddField( + model_name='photo', + name='effect', + field=models.ForeignKey(blank=True, verbose_name='effect', null=True, to='photologue.PhotoEffect', on_delete=models.CASCADE), + preserve_default=True, + ), + migrations.CreateModel( + name='PhotoSize', + fields=[ + ('id', models.AutoField(primary_key=True, verbose_name='ID', serialize=False, auto_created=True)), + ('name', models.CharField(max_length=40, help_text='Photo size name should contain only letters, numbers and underscores. Examples: "thumbnail", "display", "small", "main_page_widget".', verbose_name='name', unique=True, validators=[django.core.validators.RegexValidator(regex='^[a-z0-9_]+$', message='Use only plain lowercase letters (ASCII), numbers and underscores.')])), + ('width', models.PositiveIntegerField(help_text='If width is set to "0" the image will be scaled to the supplied height.', verbose_name='width', default=0)), + ('height', models.PositiveIntegerField(help_text='If height is set to "0" the image will be scaled to the supplied width', verbose_name='height', default=0)), + ('quality', models.PositiveIntegerField(help_text='JPEG image quality.', verbose_name='quality', choices=[(30, 'Very Low'), (40, 'Low'), (50, 'Medium-Low'), (60, 'Medium'), (70, 'Medium-High'), (80, 'High'), (90, 'Very High')], default=70)), + ('upscale', models.BooleanField(help_text='If selected the image will be scaled up if necessary to fit the supplied dimensions. Cropped sizes will be upscaled regardless of this setting.', verbose_name='upscale images?', default=False)), + ('crop', models.BooleanField(help_text='If selected the image will be scaled and cropped to fit the supplied dimensions.', verbose_name='crop to fit?', default=False)), + ('pre_cache', models.BooleanField(help_text='If selected this photo size will be pre-cached as photos are added.', verbose_name='pre-cache?', default=False)), + ('increment_count', models.BooleanField(help_text='If selected the image\'s "view_count" will be incremented when this photo size is displayed.', verbose_name='increment view count?', default=False)), + ('effect', models.ForeignKey(blank=True, verbose_name='photo effect', null=True, to='photologue.PhotoEffect', on_delete=models.CASCADE)), + ], + options={ + 'verbose_name': 'photo size', + 'ordering': ['width', 'height'], + 'verbose_name_plural': 'photo sizes', + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Watermark', + fields=[ + ('id', models.AutoField(primary_key=True, verbose_name='ID', serialize=False, auto_created=True)), + ('name', models.CharField(max_length=30, verbose_name='name', unique=True)), + ('description', models.TextField(blank=True, verbose_name='description')), + ('image', models.ImageField(upload_to='photologue/watermarks', verbose_name='image')), + ('style', models.CharField(max_length=5, default='scale', verbose_name='style', choices=[('tile', 'Tile'), ('scale', 'Scale')])), + ('opacity', models.FloatField(help_text='The opacity of the overlay.', verbose_name='opacity', default=1)), + ], + options={ + 'verbose_name': 'watermark', + 'verbose_name_plural': 'watermarks', + }, + bases=(models.Model,), + ), + migrations.AddField( + model_name='photosize', + name='watermark', + field=models.ForeignKey(blank=True, verbose_name='watermark image', null=True, to='photologue.Watermark', on_delete=models.CASCADE), + preserve_default=True, + ), + ] diff --git a/photologue/migrations/0002_photosize_data.py b/photologue/migrations/0002_photosize_data.py new file mode 100644 index 0000000..e1bd854 --- /dev/null +++ b/photologue/migrations/0002_photosize_data.py @@ -0,0 +1,40 @@ +from django.db import models, migrations + + +def initial_photosizes(apps, schema_editor): + + PhotoSize = apps.get_model('photologue', 'PhotoSize') + + # If there are already Photosizes, then we are upgrading an existing + # installation, we don't want to auto-create some PhotoSizes. + if PhotoSize.objects.all().count() > 0: + return + PhotoSize.objects.create(name='admin_thumbnail', + width=100, + height=75, + crop=True, + pre_cache=True, + increment_count=False) + PhotoSize.objects.create(name='thumbnail', + width=100, + height=75, + crop=True, + pre_cache=True, + increment_count=False) + PhotoSize.objects.create(name='display', + width=400, + crop=False, + pre_cache=True, + increment_count=True) + + +class Migration(migrations.Migration): + + dependencies = [ + ('photologue', '0001_initial'), + ('contenttypes', '0002_remove_content_type_name'), + ] + + operations = [ + migrations.RunPython(initial_photosizes), + ] diff --git a/photologue/migrations/0003_auto_20140822_1716.py b/photologue/migrations/0003_auto_20140822_1716.py new file mode 100644 index 0000000..083e849 --- /dev/null +++ b/photologue/migrations/0003_auto_20140822_1716.py @@ -0,0 +1,16 @@ +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('photologue', '0002_photosize_data'), + ] + + operations = [ + migrations.AlterField( + model_name='galleryupload', + name='title', + field=models.CharField(null=True, help_text='All uploaded photos will be given a title made up of this title + a sequential number.', max_length=50, verbose_name='title', blank=True), + ), + ] diff --git a/photologue/migrations/0004_auto_20140915_1259.py b/photologue/migrations/0004_auto_20140915_1259.py new file mode 100644 index 0000000..f8b99c7 --- /dev/null +++ b/photologue/migrations/0004_auto_20140915_1259.py @@ -0,0 +1,32 @@ +from django.db import models, migrations +import sortedm2m.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('photologue', '0003_auto_20140822_1716'), + ] + + operations = [ + migrations.AlterField( + model_name='gallery', + name='photos', + field=sortedm2m.fields.SortedManyToManyField(to='photologue.Photo', related_name='galleries', null=True, verbose_name='photos', blank=True, help_text=None), + ), + migrations.AlterField( + model_name='photo', + name='effect', + field=models.ForeignKey(to='photologue.PhotoEffect', blank=True, related_name='photo_related', verbose_name='effect', null=True, on_delete=models.CASCADE), + ), + migrations.AlterField( + model_name='photosize', + name='effect', + field=models.ForeignKey(to='photologue.PhotoEffect', blank=True, related_name='photo_sizes', verbose_name='photo effect', null=True, on_delete=models.CASCADE), + ), + migrations.AlterField( + model_name='photosize', + name='watermark', + field=models.ForeignKey(to='photologue.Watermark', blank=True, related_name='photo_sizes', verbose_name='watermark image', null=True, on_delete=models.CASCADE), + ), + ] diff --git a/photologue/migrations/0005_auto_20141027_1552.py b/photologue/migrations/0005_auto_20141027_1552.py new file mode 100644 index 0000000..d815f54 --- /dev/null +++ b/photologue/migrations/0005_auto_20141027_1552.py @@ -0,0 +1,17 @@ +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('photologue', '0004_auto_20140915_1259'), + ] + + operations = [ + migrations.AlterField( + model_name='photo', + name='title', + field=models.CharField(unique=True, max_length=60, verbose_name='title'), + preserve_default=True, + ), + ] diff --git a/photologue/migrations/0006_auto_20141028_2005.py b/photologue/migrations/0006_auto_20141028_2005.py new file mode 100644 index 0000000..85946bb --- /dev/null +++ b/photologue/migrations/0006_auto_20141028_2005.py @@ -0,0 +1,18 @@ +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('photologue', '0005_auto_20141027_1552'), + ] + + operations = [ + migrations.RemoveField( + model_name='galleryupload', + name='gallery', + ), + migrations.DeleteModel( + name='GalleryUpload', + ), + ] diff --git a/photologue/migrations/0007_auto_20150404_1737.py b/photologue/migrations/0007_auto_20150404_1737.py new file mode 100644 index 0000000..0bbcc5a --- /dev/null +++ b/photologue/migrations/0007_auto_20150404_1737.py @@ -0,0 +1,27 @@ +from django.db import models, migrations +import sortedm2m.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('photologue', '0006_auto_20141028_2005'), + ] + + operations = [ + migrations.AlterField( + model_name='gallery', + name='photos', + field=sortedm2m.fields.SortedManyToManyField(help_text=None, related_name='galleries', verbose_name='photos', to='photologue.Photo', blank=True), + ), + migrations.AlterField( + model_name='gallery', + name='sites', + field=models.ManyToManyField(to='sites.Site', verbose_name='sites', blank=True), + ), + migrations.AlterField( + model_name='photo', + name='sites', + field=models.ManyToManyField(to='sites.Site', verbose_name='sites', blank=True), + ), + ] diff --git a/photologue/migrations/0008_auto_20150509_1557.py b/photologue/migrations/0008_auto_20150509_1557.py new file mode 100644 index 0000000..4ca5393 --- /dev/null +++ b/photologue/migrations/0008_auto_20150509_1557.py @@ -0,0 +1,19 @@ +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('photologue', '0007_auto_20150404_1737'), + ] + + operations = [ + migrations.RemoveField( + model_name='gallery', + name='tags', + ), + migrations.RemoveField( + model_name='photo', + name='tags', + ), + ] diff --git a/photologue/migrations/0009_auto_20160102_0904.py b/photologue/migrations/0009_auto_20160102_0904.py new file mode 100644 index 0000000..62a2bb0 --- /dev/null +++ b/photologue/migrations/0009_auto_20160102_0904.py @@ -0,0 +1,18 @@ +# Generated by Django 1.9 on 2016-01-02 09:04 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('photologue', '0008_auto_20150509_1557'), + ] + + operations = [ + migrations.AlterField( + model_name='photo', + name='date_taken', + field=models.DateTimeField(blank=True, help_text='Date image was taken; is obtained from the image EXIF data.', null=True, verbose_name='date taken'), + ), + ] diff --git a/photologue/migrations/0010_auto_20160105_1307.py b/photologue/migrations/0010_auto_20160105_1307.py new file mode 100644 index 0000000..4d49fd7 --- /dev/null +++ b/photologue/migrations/0010_auto_20160105_1307.py @@ -0,0 +1,33 @@ +# Generated by Django 1.9 on 2016-01-05 13:07 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('photologue', '0009_auto_20160102_0904'), + ] + + operations = [ + migrations.AlterField( + model_name='gallery', + name='slug', + field=models.SlugField(help_text='A "slug" is a unique URL-friendly title for an object.', max_length=250, unique=True, verbose_name='title slug'), + ), + migrations.AlterField( + model_name='gallery', + name='title', + field=models.CharField(max_length=250, unique=True, verbose_name='title'), + ), + migrations.AlterField( + model_name='photo', + name='slug', + field=models.SlugField(help_text='A "slug" is a unique URL-friendly title for an object.', max_length=250, unique=True, verbose_name='slug'), + ), + migrations.AlterField( + model_name='photo', + name='title', + field=models.CharField(max_length=250, unique=True, verbose_name='title'), + ), + ] diff --git a/photologue/migrations/0011_auto_20190223_2138.py b/photologue/migrations/0011_auto_20190223_2138.py new file mode 100644 index 0000000..7bee4eb --- /dev/null +++ b/photologue/migrations/0011_auto_20190223_2138.py @@ -0,0 +1,18 @@ +# Generated by Django 2.1.7 on 2019-02-23 21:38 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('photologue', '0010_auto_20160105_1307'), + ] + + operations = [ + migrations.AlterField( + model_name='photoeffect', + name='filters', + field=models.CharField(blank=True, help_text='Chain multiple filters using the following pattern "FILTER_ONE->FILTER_TWO->FILTER_THREE". Image filters will be applied in order. The following filters are available: BLUR, CONTOUR, DETAIL, EDGE_ENHANCE, EDGE_ENHANCE_MORE, EMBOSS, FIND_EDGES, Kernel, SHARPEN, SMOOTH, SMOOTH_MORE.', max_length=200, verbose_name='filters'), + ), + ] diff --git a/photologue/migrations/0012_alter_photo_effect.py b/photologue/migrations/0012_alter_photo_effect.py new file mode 100644 index 0000000..5cd3a97 --- /dev/null +++ b/photologue/migrations/0012_alter_photo_effect.py @@ -0,0 +1,19 @@ +# Generated by Django 4.0.2 on 2022-02-23 09:50 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('photologue', '0011_auto_20190223_2138'), + ] + + operations = [ + migrations.AlterField( + model_name='photo', + name='effect', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_related', to='photologue.photoeffect', verbose_name='effect'), + ), + ] diff --git a/photologue/migrations/0013_alter_watermark_image.py b/photologue/migrations/0013_alter_watermark_image.py new file mode 100644 index 0000000..14e0b2c --- /dev/null +++ b/photologue/migrations/0013_alter_watermark_image.py @@ -0,0 +1,19 @@ +# Generated by Django 4.2.3 on 2023-07-28 18:39 + +from django.db import migrations, models +import pathlib + + +class Migration(migrations.Migration): + + dependencies = [ + ('photologue', '0012_alter_photo_effect'), + ] + + operations = [ + migrations.AlterField( + model_name='watermark', + name='image', + field=models.ImageField(upload_to=pathlib.PurePosixPath('photologue/watermarks'), verbose_name='image'), + ), + ] diff --git a/photologue/migrations/__init__.py b/photologue/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/photologue/models.py b/photologue/models.py new file mode 100644 index 0000000..6d29ba7 --- /dev/null +++ b/photologue/models.py @@ -0,0 +1,913 @@ +import logging +import os +import pathlib +import random +import unicodedata +from datetime import datetime +from functools import partial +from importlib import import_module +from inspect import isclass +from io import BytesIO + +import exifread +from django.conf import settings +from django.contrib.sites.models import Site +from django.core.exceptions import ValidationError +from django.core.files.base import ContentFile +from django.core.files.storage import default_storage +from django.core.validators import RegexValidator +from django.db import models +from django.db.models.signals import post_save +from django.template.defaultfilters import slugify +from django.urls import reverse +from django.utils.encoding import filepath_to_uri, force_str, smart_str +from django.utils.safestring import mark_safe +from django.utils.timezone import now +from django.utils.translation import gettext_lazy as _ +from PIL import Image, ImageEnhance, ImageFile, ImageFilter +from sortedm2m.fields import SortedManyToManyField + +from .managers import GalleryQuerySet, PhotoQuerySet +from .utils.reflection import add_reflection +from .utils.watermark import apply_watermark + +logger = logging.getLogger('photologue.models') + +# Default limit for gallery.latest +LATEST_LIMIT = getattr(settings, 'PHOTOLOGUE_GALLERY_LATEST_LIMIT', None) + +# Number of random images from the gallery to display. +SAMPLE_SIZE = getattr(settings, 'PHOTOLOGUE_GALLERY_SAMPLE_SIZE', 5) + +# max_length setting for the ImageModel ImageField +IMAGE_FIELD_MAX_LENGTH = getattr(settings, 'PHOTOLOGUE_IMAGE_FIELD_MAX_LENGTH', 100) + +# Path to sample image +SAMPLE_IMAGE_PATH = getattr(settings, 'PHOTOLOGUE_SAMPLE_IMAGE_PATH', os.path.join( + os.path.dirname(__file__), 'res', 'sample.jpg')) + +# Modify image file buffer size. +ImageFile.MAXBLOCK = getattr(settings, 'PHOTOLOGUE_MAXBLOCK', 256 * 2 ** 10) + +# Photologue image path relative to media root +PHOTOLOGUE_DIR = getattr(settings, 'PHOTOLOGUE_DIR', 'photologue') + +# Look for user function to define file paths +PHOTOLOGUE_PATH = getattr(settings, 'PHOTOLOGUE_PATH', None) +if PHOTOLOGUE_PATH is not None: + if callable(PHOTOLOGUE_PATH): + get_storage_path = PHOTOLOGUE_PATH + else: + parts = PHOTOLOGUE_PATH.split('.') + module_name = '.'.join(parts[:-1]) + module = import_module(module_name) + get_storage_path = getattr(module, parts[-1]) +else: + def get_storage_path(instance, filename): + fn = unicodedata.normalize('NFKD', force_str(filename)).encode('ascii', 'ignore').decode('ascii') + return os.path.join(PHOTOLOGUE_DIR, 'photos', fn) + +# Support CACHEDIR.TAG spec for backups for ignoring cache dir. +# See http://www.brynosaurus.com/cachedir/spec.html +PHOTOLOGUE_CACHEDIRTAG = os.path.join(PHOTOLOGUE_DIR, "photos", "cache", "CACHEDIR.TAG") +if not default_storage.exists(PHOTOLOGUE_CACHEDIRTAG): + default_storage.save(PHOTOLOGUE_CACHEDIRTAG, ContentFile( + b"Signature: 8a477f597d28d172789f06886806bc55")) + +# Exif Orientation values +# Value 0thRow 0thColumn +# 1 top left +# 2 top right +# 3 bottom right +# 4 bottom left +# 5 left top +# 6 right top +# 7 right bottom +# 8 left bottom + +# Image Orientations (according to EXIF informations) that needs to be +# transposed and appropriate action +IMAGE_EXIF_ORIENTATION_MAP = { + 2: Image.Transpose.FLIP_LEFT_RIGHT, + 3: Image.Transpose.ROTATE_180, + 6: Image.Transpose.ROTATE_270, + 8: Image.Transpose.ROTATE_90, +} + +# Quality options for JPEG images +JPEG_QUALITY_CHOICES = ( + (30, _('Very Low')), + (40, _('Low')), + (50, _('Medium-Low')), + (60, _('Medium')), + (70, _('Medium-High')), + (80, _('High')), + (90, _('Very High')), +) + +# choices for new crop_anchor field in Photo +CROP_ANCHOR_CHOICES = ( + ('top', _('Top')), + ('right', _('Right')), + ('bottom', _('Bottom')), + ('left', _('Left')), + ('center', _('Center (Default)')), +) + +IMAGE_TRANSPOSE_CHOICES = ( + ('FLIP_LEFT_RIGHT', _('Flip left to right')), + ('FLIP_TOP_BOTTOM', _('Flip top to bottom')), + ('ROTATE_90', _('Rotate 90 degrees counter-clockwise')), + ('ROTATE_270', _('Rotate 90 degrees clockwise')), + ('ROTATE_180', _('Rotate 180 degrees')), +) + +WATERMARK_STYLE_CHOICES = ( + ('tile', _('Tile')), + ('scale', _('Scale')), +) + +# Prepare a list of image filters +filter_names = [] +for n in dir(ImageFilter): + klass = getattr(ImageFilter, n) + if isclass(klass) and issubclass(klass, ImageFilter.BuiltinFilter) and \ + hasattr(klass, 'name'): + filter_names.append(klass.__name__) +IMAGE_FILTERS_HELP_TEXT = _('Chain multiple filters using the following pattern "FILTER_ONE->FILTER_TWO->FILTER_THREE"' + '. Image filters will be applied in order. The following filters are available: %s.' + % (', '.join(filter_names))) + +size_method_map = {} + + +class TagField(models.CharField): + """Tags have been removed from Photologue, but the migrations still refer to them so this + Tagfield definition is left here. + """ + + def __init__(self, **kwargs): + default_kwargs = {'max_length': 255, 'blank': True} + default_kwargs.update(kwargs) + super().__init__(**default_kwargs) + + def get_internal_type(self): + return 'CharField' + + +class Gallery(models.Model): + date_added = models.DateTimeField(_('date published'), + default=now) + title = models.CharField(_('title'), + max_length=250, + unique=True) + slug = models.SlugField(_('title slug'), + unique=True, + max_length=250, + help_text=_('A "slug" is a unique URL-friendly title for an object.')) + description = models.TextField(_('description'), + blank=True) + is_public = models.BooleanField(_('is public'), + default=True, + help_text=_('Public galleries will be displayed ' + 'in the default views.')) + photos = SortedManyToManyField('photologue.Photo', + related_name='galleries', + verbose_name=_('photos'), + blank=True) + sites = models.ManyToManyField(Site, verbose_name=_('sites'), + blank=True) + + objects = GalleryQuerySet.as_manager() + + class Meta: + ordering = ['-date_added'] + get_latest_by = 'date_added' + verbose_name = _('gallery') + verbose_name_plural = _('galleries') + + def __str__(self): + return self.title + + def get_absolute_url(self): + return reverse('photologue:pl-gallery', args=[self.slug]) + + def latest(self, limit=LATEST_LIMIT, public=True): + if not limit: + limit = self.photo_count() + if public: + return self.public()[:limit] + else: + return self.photos.filter(sites__id=settings.SITE_ID)[:limit] + + def sample(self, count=None, public=True): + """Return a sample of photos, ordered at random. + If the 'count' is not specified, it will return a number of photos + limited by the GALLERY_SAMPLE_SIZE setting. + """ + if not count: + count = SAMPLE_SIZE + if count > self.photo_count(): + count = self.photo_count() + if public: + photo_set = self.public() + else: + photo_set = self.photos.filter(sites__id=settings.SITE_ID) + return random.sample(list(set(photo_set)), count) + + def photo_count(self, public=True): + """Return a count of all the photos in this gallery.""" + if public: + return self.public().count() + else: + return self.photos.filter(sites__id=settings.SITE_ID).count() + + photo_count.short_description = _('count') + + def public(self): + """Return a queryset of all the public photos in this gallery.""" + return self.photos.is_public().filter(sites__id=settings.SITE_ID) + + def orphaned_photos(self): + """ + Return all photos that belong to this gallery but don't share the + gallery's site. + """ + return self.photos.filter(is_public=True) \ + .exclude(sites__id__in=self.sites.all()) + + +class ImageModel(models.Model): + image = models.ImageField(_('image'), + max_length=IMAGE_FIELD_MAX_LENGTH, + upload_to=get_storage_path) + date_taken = models.DateTimeField(_('date taken'), + null=True, + blank=True, + help_text=_('Date image was taken; is obtained from the image EXIF data.')) + view_count = models.PositiveIntegerField(_('view count'), + default=0, + editable=False) + crop_from = models.CharField(_('crop from'), + blank=True, + max_length=10, + default='center', + choices=CROP_ANCHOR_CHOICES) + effect = models.ForeignKey('photologue.PhotoEffect', + null=True, + blank=True, + related_name="%(class)s_related", + verbose_name=_('effect'), + on_delete=models.CASCADE) + + class Meta: + abstract = True + + def EXIF(self, file=None): + try: + if file: + tags = exifread.process_file(file) + else: + with self.image.storage.open(self.image.name, 'rb') as file: + tags = exifread.process_file(file, details=False) + return tags + except: + return {} + + def admin_thumbnail(self): + func = getattr(self, 'get_admin_thumbnail_url', None) + if func is None: + return _('An "admin_thumbnail" photo size has not been defined.') + else: + if hasattr(self, 'get_absolute_url'): + return mark_safe(f'') + else: + return mark_safe(f'') + + admin_thumbnail.short_description = _('Thumbnail') + admin_thumbnail.allow_tags = True + + def cache_path(self): + return os.path.join(os.path.dirname(self.image.name), "cache") + + def cache_url(self): + return '/'.join([os.path.dirname(self.image.url), "cache"]) + + def image_filename(self): + return os.path.basename(force_str(self.image.name)) + + def _get_filename_for_size(self, size): + size = getattr(size, 'name', size) + base, ext = os.path.splitext(self.image_filename()) + return ''.join([base, '_', size, ext]) + + def _get_SIZE_photosize(self, size): + return PhotoSizeCache().sizes.get(size) + + def _get_SIZE_size(self, size): + photosize = PhotoSizeCache().sizes.get(size) + if not self.size_exists(photosize): + self.create_size(photosize) + try: + return Image.open(self.image.storage.open( + self._get_SIZE_filename(size))).size + except: + return None + + def _get_SIZE_url(self, size): + photosize = PhotoSizeCache().sizes.get(size) + if not self.size_exists(photosize): + self.create_size(photosize) + if photosize.increment_count: + self.increment_count() + return '/'.join([ + self.cache_url(), + filepath_to_uri(self._get_filename_for_size(photosize.name))]) + + def _get_SIZE_filename(self, size): + photosize = PhotoSizeCache().sizes.get(size) + return smart_str(os.path.join(self.cache_path(), + self._get_filename_for_size(photosize.name))) + + def increment_count(self): + self.view_count += 1 + models.Model.save(self) + + def __getattr__(self, name): + global size_method_map + if not size_method_map: + init_size_method_map() + di = size_method_map.get(name, None) + if di is not None: + result = partial(getattr(self, di['base_name']), di['size']) + setattr(self, name, result) + return result + else: + raise AttributeError + + def size_exists(self, photosize): + func = getattr(self, "get_%s_filename" % photosize.name, None) + if func is not None: + if self.image.storage.exists(func()): + return True + return False + + def resize_image(self, im, photosize): + cur_width, cur_height = im.size + new_width, new_height = photosize.size + if photosize.crop: + ratio = max(float(new_width) / cur_width, float(new_height) / cur_height) + x = (cur_width * ratio) + y = (cur_height * ratio) + xd = abs(new_width - x) + yd = abs(new_height - y) + x_diff = int(xd / 2) + y_diff = int(yd / 2) + if self.crop_from == 'top': + box = (int(x_diff), 0, int(x_diff + new_width), new_height) + elif self.crop_from == 'left': + box = (0, int(y_diff), new_width, int(y_diff + new_height)) + elif self.crop_from == 'bottom': + # y - yd = new_height + box = (int(x_diff), int(yd), int(x_diff + new_width), int(y)) + elif self.crop_from == 'right': + # x - xd = new_width + box = (int(xd), int(y_diff), int(x), int(y_diff + new_height)) + else: + box = (int(x_diff), int(y_diff), int(x_diff + new_width), int(y_diff + new_height)) + im = im.resize((int(x), int(y)), Image.Resampling.LANCZOS).crop(box) + else: + if not new_width == 0 and not new_height == 0: + ratio = min(float(new_width) / cur_width, + float(new_height) / cur_height) + else: + if new_width == 0: + ratio = float(new_height) / cur_height + else: + ratio = float(new_width) / cur_width + new_dimensions = (int(round(cur_width * ratio)), + int(round(cur_height * ratio))) + if new_dimensions[0] > cur_width or \ + new_dimensions[1] > cur_height: + if not photosize.upscale: + return im + im = im.resize(new_dimensions, Image.Resampling.LANCZOS) + return im + + def create_size(self, photosize, recreate=False): + if self.size_exists(photosize) and not recreate: + return + try: + im = Image.open(self.image.storage.open(self.image.name)) + except OSError: + return + # Save the original format + im_format = im.format + # Apply effect if found + if self.effect is not None: + im = self.effect.pre_process(im) + elif photosize.effect is not None: + im = photosize.effect.pre_process(im) + # Rotate if found & necessary + if 'Image Orientation' in self.EXIF() and \ + self.EXIF().get('Image Orientation').values[0] in IMAGE_EXIF_ORIENTATION_MAP: + im = im.transpose( + IMAGE_EXIF_ORIENTATION_MAP[self.EXIF().get('Image Orientation').values[0]]) + # Resize/crop image + if (im.size != photosize.size and photosize.size != (0, 0)) or recreate: + im = self.resize_image(im, photosize) + # Apply watermark if found + if photosize.watermark is not None: + im = photosize.watermark.post_process(im) + # Apply effect if found + if self.effect is not None: + im = self.effect.post_process(im) + elif photosize.effect is not None: + im = photosize.effect.post_process(im) + # Save file + im_filename = getattr(self, "get_%s_filename" % photosize.name)() + try: + buffer = BytesIO() + if im_format != 'JPEG': + im.save(buffer, im_format) + else: + # Issue #182 - test fix from https://github.com/bashu/django-watermark/issues/31 + if im.mode.endswith('A'): + im = im.convert(im.mode[:-1]) + im.save(buffer, 'JPEG', quality=int(photosize.quality), + optimize=True) + buffer_contents = ContentFile(buffer.getvalue()) + self.image.storage.save(im_filename, buffer_contents) + except OSError as e: + if self.image.storage.exists(im_filename): + self.image.storage.delete(im_filename) + raise e + + def remove_size(self, photosize, remove_dirs=True): + if not self.size_exists(photosize): + return + filename = getattr(self, "get_%s_filename" % photosize.name)() + if self.image.storage.exists(filename): + self.image.storage.delete(filename) + + def clear_cache(self): + cache = PhotoSizeCache() + for photosize in cache.sizes.values(): + self.remove_size(photosize, False) + + def pre_cache(self, recreate=False): + cache = PhotoSizeCache() + if recreate: + self.clear_cache() + for photosize in cache.sizes.values(): + if photosize.pre_cache: + self.create_size(photosize, recreate) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._old_image = self.image + + def save(self, *args, **kwargs): + recreate = kwargs.pop('recreate', False) + image_has_changed = False + if self._get_pk_val() and (self._old_image != self.image): + image_has_changed = True + # If we have changed the image, we need to clear from the cache all instances of the old + # image; clear_cache() works on the current (new) image, and in turn calls several other methods. + # Changing them all to act on the old image was a lot of changes, so instead we temporarily swap old + # and new images. + new_image = self.image + self.image = self._old_image + self.clear_cache() + self.image = new_image # Back to the new image. + self._old_image.storage.delete(self._old_image.name) # Delete (old) base image. + if self.date_taken is None or image_has_changed: + # Attempt to get the date the photo was taken from the EXIF data. + try: + exif_date = self.EXIF(self.image.file).get('EXIF DateTimeOriginal', None) + if exif_date is not None: + d, t = exif_date.values.split() + year, month, day = d.split(':') + hour, minute, second = t.split(':') + self.date_taken = datetime(int(year), int(month), int(day), + int(hour), int(minute), int(second)) + except: + logger.error('Failed to read EXIF DateTimeOriginal', exc_info=True) + super().save(*args, **kwargs) + self.pre_cache(recreate) + + def delete(self): + assert self._get_pk_val() is not None, \ + "%s object can't be deleted because its %s attribute is set to None." % \ + (self._meta.object_name, self._meta.pk.attname) + self.clear_cache() + # Files associated to a FileField have to be manually deleted: + # https://docs.djangoproject.com/en/dev/releases/1.3/#deleting-a-model-doesn-t-delete-associated-files + # http://haineault.com/blog/147/ + # The data loss scenarios mentioned in the docs hopefully do not apply + # to Photologue! + super().delete() + self.image.storage.delete(self.image.name) + + +class Photo(ImageModel): + title = models.CharField(_('title'), + max_length=250, + unique=True) + slug = models.SlugField(_('slug'), + unique=True, + max_length=250, + help_text=_('A "slug" is a unique URL-friendly title for an object.')) + caption = models.TextField(_('caption'), + blank=True) + date_added = models.DateTimeField(_('date added'), + default=now) + is_public = models.BooleanField(_('is public'), + default=True, + help_text=_('Public photographs will be displayed in the default views.')) + sites = models.ManyToManyField(Site, verbose_name=_('sites'), + blank=True) + + objects = PhotoQuerySet.as_manager() + + class Meta: + ordering = ['-date_added'] + get_latest_by = 'date_added' + verbose_name = _("photo") + verbose_name_plural = _("photos") + + def __str__(self): + return self.title + + def save(self, *args, **kwargs): + # If crop_from or effect property has been changed on existing image, + # update kwargs to force image recreation in parent class + current = Photo.objects.get(pk=self.pk) if self.pk else None + if current and (current.crop_from != self.crop_from or current.effect != self.effect): + kwargs.update(recreate=True) + + if self.slug is None: + self.slug = slugify(self.title) + super().save(*args, **kwargs) + + def get_absolute_url(self): + return reverse('photologue:pl-photo', args=[self.slug]) + + def public_galleries(self): + """Return the public galleries to which this photo belongs.""" + return self.galleries.filter(is_public=True) + + def get_previous_in_gallery(self, gallery): + """Find the neighbour of this photo in the supplied gallery. + We assume that the gallery and all its photos are on the same site. + """ + if not self.is_public: + raise ValueError('Cannot determine neighbours of a non-public photo.') + photos = gallery.photos.is_public() + if self not in photos: + raise ValueError('Photo does not belong to gallery.') + previous = None + for photo in photos: + if photo == self: + return previous + previous = photo + + def get_next_in_gallery(self, gallery): + """Find the neighbour of this photo in the supplied gallery. + We assume that the gallery and all its photos are on the same site. + """ + if not self.is_public: + raise ValueError('Cannot determine neighbours of a non-public photo.') + photos = gallery.photos.is_public() + if self not in photos: + raise ValueError('Photo does not belong to gallery.') + matched = False + for photo in photos: + if matched: + return photo + if photo == self: + matched = True + return None + + +class BaseEffect(models.Model): + name = models.CharField(_('name'), + max_length=30, + unique=True) + description = models.TextField(_('description'), + blank=True) + + class Meta: + abstract = True + + def sample_dir(self): + return os.path.join(PHOTOLOGUE_DIR, 'samples') + + def sample_url(self): + return settings.MEDIA_URL + '/'.join([PHOTOLOGUE_DIR, 'samples', + '{} {}.jpg'.format(self.name.lower(), 'sample')]) + + def sample_filename(self): + return os.path.join(self.sample_dir(), '{} {}.jpg'.format(self.name.lower(), 'sample')) + + def create_sample(self): + try: + im = Image.open(SAMPLE_IMAGE_PATH) + except OSError: + raise OSError( + 'Photologue was unable to open the sample image: %s.' % SAMPLE_IMAGE_PATH) + im = self.process(im) + buffer = BytesIO() + # Issue #182 - test fix from https://github.com/bashu/django-watermark/issues/31 + if im.mode.endswith('A'): + im = im.convert(im.mode[:-1]) + im.save(buffer, 'JPEG', quality=90, optimize=True) + buffer_contents = ContentFile(buffer.getvalue()) + default_storage.save(self.sample_filename(), buffer_contents) + + def admin_sample(self): + return '' % self.sample_url() + + admin_sample.short_description = 'Sample' + admin_sample.allow_tags = True + + def pre_process(self, im): + return im + + def post_process(self, im): + return im + + def process(self, im): + im = self.pre_process(im) + im = self.post_process(im) + return im + + def __str__(self): + return self.name + + def save(self, *args, **kwargs): + try: + default_storage.delete(self.sample_filename()) + except: + pass + models.Model.save(self, *args, **kwargs) + self.create_sample() + for size in self.photo_sizes.all(): + size.clear_cache() + # try to clear all related subclasses of ImageModel + for prop in [prop for prop in dir(self) if prop[-8:] == '_related']: + for obj in getattr(self, prop).all(): + obj.clear_cache() + obj.pre_cache() + + def delete(self): + try: + default_storage.delete(self.sample_filename()) + except: + pass + models.Model.delete(self) + + +class PhotoEffect(BaseEffect): + """ A pre-defined effect to apply to photos """ + transpose_method = models.CharField(_('rotate or flip'), + max_length=15, + blank=True, + choices=IMAGE_TRANSPOSE_CHOICES) + color = models.FloatField(_('color'), + default=1.0, + help_text=_('A factor of 0.0 gives a black and white image, a factor of 1.0 gives the ' + 'original image.')) + brightness = models.FloatField(_('brightness'), + default=1.0, + help_text=_('A factor of 0.0 gives a black image, a factor of 1.0 gives the ' + 'original image.')) + contrast = models.FloatField(_('contrast'), + default=1.0, + help_text=_('A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the ' + 'original image.')) + sharpness = models.FloatField(_('sharpness'), + default=1.0, + help_text=_('A factor of 0.0 gives a blurred image, a factor of 1.0 gives the ' + 'original image.')) + filters = models.CharField(_('filters'), + max_length=200, + blank=True, + help_text=_(IMAGE_FILTERS_HELP_TEXT)) + reflection_size = models.FloatField(_('size'), + default=0, + help_text=_('The height of the reflection as a percentage of the orignal ' + 'image. A factor of 0.0 adds no reflection, a factor of 1.0 adds a' + ' reflection equal to the height of the orignal image.')) + reflection_strength = models.FloatField(_('strength'), + default=0.6, + help_text=_('The initial opacity of the reflection gradient.')) + background_color = models.CharField(_('color'), + max_length=7, + default="#FFFFFF", + help_text=_('The background color of the reflection gradient. Set this to ' + 'match the background color of your page.')) + + class Meta: + verbose_name = _("photo effect") + verbose_name_plural = _("photo effects") + + def pre_process(self, im): + if self.transpose_method != '': + method = getattr(Image, self.transpose_method) + im = im.transpose(method) + if im.mode != 'RGB' and im.mode != 'RGBA': + return im + for name in ['Color', 'Brightness', 'Contrast', 'Sharpness']: + factor = getattr(self, name.lower()) + if factor != 1.0: + im = getattr(ImageEnhance, name)(im).enhance(factor) + for name in self.filters.split('->'): + image_filter = getattr(ImageFilter, name.upper(), None) + if image_filter is not None: + try: + im = im.filter(image_filter) + except ValueError: + pass + return im + + def post_process(self, im): + if self.reflection_size != 0.0: + im = add_reflection(im, bgcolor=self.background_color, + amount=self.reflection_size, opacity=self.reflection_strength) + return im + + +class Watermark(BaseEffect): + image = models.ImageField(_('image'), + upload_to=pathlib.Path(PHOTOLOGUE_DIR) / "watermarks") + style = models.CharField(_('style'), + max_length=5, + choices=WATERMARK_STYLE_CHOICES, + default='scale') + opacity = models.FloatField(_('opacity'), + default=1, + help_text=_("The opacity of the overlay.")) + + class Meta: + verbose_name = _('watermark') + verbose_name_plural = _('watermarks') + + def delete(self): + assert self._get_pk_val() is not None, "%s object can't be deleted because its %s attribute is set to None." \ + % (self._meta.object_name, self._meta.pk.attname) + super().delete() + self.image.storage.delete(self.image.name) + + def post_process(self, im): + mark = Image.open(self.image.storage.open(self.image.name)) + return apply_watermark(im, mark, self.style, self.opacity) + + +class PhotoSize(models.Model): + """About the Photosize name: it's used to create get_PHOTOSIZE_url() methods, + so the name has to follow the same restrictions as any Python method name, + e.g. no spaces or non-ascii characters.""" + + name = models.CharField(_('name'), + max_length=40, + unique=True, + help_text=_( + 'Photo size name should contain only letters, numbers and underscores. Examples: ' + '"thumbnail", "display", "small", "main_page_widget".'), + validators=[RegexValidator(regex='^[a-z0-9_]+$', + message='Use only plain lowercase letters (ASCII), numbers and ' + 'underscores.' + )] + ) + width = models.PositiveIntegerField(_('width'), + default=0, + help_text=_( + 'If width is set to "0" the image will be scaled to the supplied height.')) + height = models.PositiveIntegerField(_('height'), + default=0, + help_text=_( + 'If height is set to "0" the image will be scaled to the supplied width')) + quality = models.PositiveIntegerField(_('quality'), + choices=JPEG_QUALITY_CHOICES, + default=70, + help_text=_('JPEG image quality.')) + upscale = models.BooleanField(_('upscale images?'), + default=False, + help_text=_('If selected the image will be scaled up if necessary to fit the ' + 'supplied dimensions. Cropped sizes will be upscaled regardless of this ' + 'setting.') + ) + crop = models.BooleanField(_('crop to fit?'), + default=False, + help_text=_('If selected the image will be scaled and cropped to fit the supplied ' + 'dimensions.')) + pre_cache = models.BooleanField(_('pre-cache?'), + default=False, + help_text=_('If selected this photo size will be pre-cached as photos are added.')) + increment_count = models.BooleanField(_('increment view count?'), + default=False, + help_text=_('If selected the image\'s "view_count" will be incremented when ' + 'this photo size is displayed.')) + effect = models.ForeignKey('photologue.PhotoEffect', + null=True, + blank=True, + related_name='photo_sizes', + verbose_name=_('photo effect'), + on_delete=models.CASCADE) + watermark = models.ForeignKey('photologue.Watermark', + null=True, + blank=True, + related_name='photo_sizes', + verbose_name=_('watermark image'), + on_delete=models.CASCADE) + + class Meta: + ordering = ['width', 'height'] + verbose_name = _('photo size') + verbose_name_plural = _('photo sizes') + + def __str__(self): + return self.name + + def clear_cache(self): + for cls in ImageModel.__subclasses__(): + for obj in cls.objects.all(): + obj.remove_size(self) + if self.pre_cache: + obj.create_size(self) + PhotoSizeCache().reset() + + def clean(self): + if self.crop is True: + if self.width == 0 or self.height == 0: + raise ValidationError( + _("Can only crop photos if both width and height dimensions are set.")) + + def save(self, *args, **kwargs): + super().save(*args, **kwargs) + PhotoSizeCache().reset() + self.clear_cache() + + def delete(self): + assert self._get_pk_val() is not None, "%s object can't be deleted because its %s attribute is set to None." \ + % (self._meta.object_name, self._meta.pk.attname) + self.clear_cache() + super().delete() + + def _get_size(self): + return (self.width, self.height) + + def _set_size(self, value): + self.width, self.height = value + + size = property(_get_size, _set_size) + + +class PhotoSizeCache: + __state = {"sizes": {}} + + def __init__(self): + self.__dict__ = self.__state + if not len(self.sizes): + sizes = PhotoSize.objects.all() + for size in sizes: + self.sizes[size.name] = size + + def reset(self): + global size_method_map + size_method_map = {} + self.sizes = {} + + +def init_size_method_map(): + global size_method_map + for size in PhotoSizeCache().sizes.keys(): + size_method_map['get_%s_size' % size] = \ + {'base_name': '_get_SIZE_size', 'size': size} + size_method_map['get_%s_photosize' % size] = \ + {'base_name': '_get_SIZE_photosize', 'size': size} + size_method_map['get_%s_url' % size] = \ + {'base_name': '_get_SIZE_url', 'size': size} + size_method_map['get_%s_filename' % size] = \ + {'base_name': '_get_SIZE_filename', 'size': size} + + +def add_default_site(instance, created, **kwargs): + """ + Called via Django's signals when an instance is created. + In case PHOTOLOGUE_MULTISITE is False, the current site (i.e. + ``settings.SITE_ID``) will always be added to the site relations if none are + present. + """ + if not created: + return + if getattr(settings, 'PHOTOLOGUE_MULTISITE', False): + return + if instance.sites.exists(): + return + instance.sites.add(Site.objects.get_current()) + + +post_save.connect(add_default_site, sender=Gallery) +post_save.connect(add_default_site, sender=Photo) diff --git a/photologue/res/sample.jpg b/photologue/res/sample.jpg new file mode 100644 index 0000000000000000000000000000000000000000..07147aaa2479e8fd1440316544125750d30d06c3 GIT binary patch literal 14453 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 literal 0 HcmV?d00001 diff --git a/photologue/res/test_photologue_landscape.jpg b/photologue/res/test_photologue_landscape.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fd821d8a71bf3d1b8f7ea2076087cb1137cc561d GIT binary patch literal 659 zcmeH@I}XAy42FM`G)bfM5vlh`2;K*{QbbW&}XYg9EG3J)A0MGIG{B&Uv~ zjI>coD`l*S8Dp($;hH4Q`Ie%CWE2@~GHbIUP1DYQ-Gmz6;E0PLkC7+gDV(tY5#QJ+ e9vI}GGw=fw?r?&5v+x+>)bv;W`=5Lu3%56+KqI^W literal 0 HcmV?d00001 diff --git a/photologue/res/test_photologue_portrait.jpg b/photologue/res/test_photologue_portrait.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6e4d332805039835a84f121bcff16637a7786236 GIT binary patch literal 659 zcmeH@I}XAy42FM`G)bfM5vlh`2;K*{QbbW&}XYg9EG3J)A0MGIG{B&Uv~ zjI>coD`l*S8Dp($;hH4Q`Ie%CWE2@~GHbIUP1DYQ-Gmz6;DVzdkC7+gDV(tY5#QJ+ e9vI}GGw=fw?r?&5v+x+>)bv;W`=5Lu3%56+q$9il literal 0 HcmV?d00001 diff --git a/photologue/res/test_photologue_square.jpg b/photologue/res/test_photologue_square.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cd03d8f3c606ba3dc4932e0d366c254f3786ca42 GIT binary patch literal 573 zcmeH>Jqp4=5JtbrZZ?}`v&lm4BZ36fTWG8-tSsz3Lt3wr!bAAerGQx1@fW1Z;Sn7nk(4gTjPwD1}Y8bKbBC*dhvu?7+UI3}GK Y6yG=S6B8b=f;d@t%y8+(k^ep1Klx!JdjJ3c literal 0 HcmV?d00001 diff --git a/photologue/res/test_unicode_®.jpg b/photologue/res/test_unicode_®.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6e4d332805039835a84f121bcff16637a7786236 GIT binary patch literal 659 zcmeH@I}XAy42FM`G)bfM5vlh`2;K*{QbbW&}XYg9EG3J)A0MGIG{B&Uv~ zjI>coD`l*S8Dp($;hH4Q`Ie%CWE2@~GHbIUP1DYQ-Gmz6;DVzdkC7+gDV(tY5#QJ+ e9vI}GGw=fw?r?&5v+x+>)bv;W`=5Lu3%56+q$9il literal 0 HcmV?d00001 diff --git a/photologue/res/zips/ignored_files.zip b/photologue/res/zips/ignored_files.zip new file mode 100644 index 0000000000000000000000000000000000000000..451c760587b7bd48605b1102311756aba5fe00f3 GIT binary patch literal 15784 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 PKjjDj0Q~oP0Kk6%;zGcz literal 0 HcmV?d00001 diff --git a/photologue/res/zips/not_image.zip b/photologue/res/zips/not_image.zip new file mode 100644 index 0000000000000000000000000000000000000000..0ff5a218ea85a16cf9c199dbbef55dd1b0d3d6ba GIT binary patch literal 7815 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 literal 0 HcmV?d00001 diff --git a/photologue/sitemaps.py b/photologue/sitemaps.py new file mode 100644 index 0000000..c8192f3 --- /dev/null +++ b/photologue/sitemaps.py @@ -0,0 +1,55 @@ +""" +The `Sitemaps protocol `_ allows a webmaster +to inform search engines about URLs on a website that are available for crawling. +Django comes with a high-level framework that makes generating sitemap XML files easy. + +Install the sitemap application as per the `instructions in the django documentation +`_, then edit your +project's ``urls.py`` and add a reference to Photologue's Sitemap classes in order to +included all the publicly-viewable Photologue pages: + +.. code-block:: python + + ... + from photologue.sitemaps import GallerySitemap, PhotoSitemap + + sitemaps = {... + 'photologue_galleries': GallerySitemap, + 'photologue_photos': PhotoSitemap, + ... + } + etc... + +There are 2 sitemap classes, as in some cases you may want to have gallery pages, +but no photo detail page (e.g. if all photos are displayed via a javascript +lightbox). + +""" +from django.contrib.sitemaps import Sitemap + +from .models import Gallery, Photo + +# Note: Gallery and Photo are split, because there are use cases for having galleries +# in the sitemap, but not photos (e.g. if the photos are displayed with a lightbox). + + +class GallerySitemap(Sitemap): + + def items(self): + # The following code is very basic and will probably cause problems with + # large querysets. + return Gallery.objects.on_site().is_public() + + def lastmod(self, obj): + return obj.date_added + + +class PhotoSitemap(Sitemap): + + def items(self): + # The following code is very basic and will probably cause problems with + # large querysets. + return Photo.objects.on_site().is_public() + + def lastmod(self, obj): + return obj.date_added diff --git a/photologue/templates/admin/photologue/photo/change_list.html b/photologue/templates/admin/photologue/photo/change_list.html new file mode 100644 index 0000000..a57fa84 --- /dev/null +++ b/photologue/templates/admin/photologue/photo/change_list.html @@ -0,0 +1,13 @@ +{% extends "admin/change_list.html" %} +{% load i18n %} + + +{% block object-tools-items %} + {{ block.super }} +

  • + + {% trans "Upload a zip archive" %} + +
  • +{% endblock %} + diff --git a/photologue/templates/admin/photologue/photo/upload_zip.html b/photologue/templates/admin/photologue/photo/upload_zip.html new file mode 100644 index 0000000..1891eaf --- /dev/null +++ b/photologue/templates/admin/photologue/photo/upload_zip.html @@ -0,0 +1,57 @@ +{% extends "admin/base_site.html" %} +{% load i18n admin_urls static %} + +{# Admin styling code largely taken from http://www.dmertl.com/blog/?p=116 #} + +{% block extrastyle %} + {{ block.super }} + +{% endblock %} + +{% block bodyclass %}{{ opts.app_label }}-{{ opts.object_name.lower }} change-form{% endblock %} + +{% block breadcrumbs %} + +{% endblock %} + +{% block content_title %}{% endblock %} + +{% block content %} + +

    {% trans "Upload a zip archive of photos" %}

    + {% blocktrans %} +

    On this page you can upload many photos at once, as long as you have + put them all in a zip archive. The photos can be either:

    +
      +
    • Added to an existing gallery.
    • +
    • Otherwise, a new gallery is created with the supplied title.
    • +
    + {% endblocktrans %} + + {% if form.errors %} +

    + {% if form.errors|length == 1 %}{% trans "Please correct the error below." %}{% else %}{% trans "Please correct the errors below." %}{% endif %} +

    + {{ form.non_field_errors }} + {% endif %} + +
    + {% csrf_token %} +
    + {% for fieldset in adminform %} + {% include "admin/includes/fieldset.html" %} + {% endfor %} +
    +
    + +
    +
    + +{% endblock %} diff --git a/photologue/templates/photologue/gallery_archive.html b/photologue/templates/photologue/gallery_archive.html new file mode 100644 index 0000000..ba5e83a --- /dev/null +++ b/photologue/templates/photologue/gallery_archive.html @@ -0,0 +1,41 @@ +{% extends "photologue/root.html" %} +{% load i18n %} + +{% block title %}{% trans "Latest photo galleries" %}{% endblock %} + +{% block content %} + +
    +
    +

    {% trans "Latest photo galleries" %}

    +
    +
    + +
    + + + +
    + + {% if latest %} + {% for gallery in latest %} + {% include "photologue/includes/gallery_sample.html" %} + {% endfor %} + {% else %} +

    {% trans "No galleries were found" %}.

    + {% endif %} + +
    + +
    + +{% endblock %} diff --git a/photologue/templates/photologue/gallery_archive_day.html b/photologue/templates/photologue/gallery_archive_day.html new file mode 100644 index 0000000..560efd1 --- /dev/null +++ b/photologue/templates/photologue/gallery_archive_day.html @@ -0,0 +1,28 @@ +{% extends "photologue/root.html" %} +{% load i18n %} + +{% block title %}{% blocktrans with show_day=day|date:"d F Y" %}Galleries for {{ show_day }}{% endblocktrans %}{% endblock %} + +{% block content %} + +
    +
    +

    {% blocktrans with show_day=day|date:"d F Y" %}Galleries for {{ show_day }}{% endblocktrans %}

    +
    +
    + +
    +
    + {% if object_list %} + {% for gallery in object_list %} + {% include "photologue/includes/gallery_sample.html" %} + {% endfor %} + {% else %} +

    {% trans "No galleries were found." %}

    + {% endif %} +
    +
    + + + +{% endblock %} diff --git a/photologue/templates/photologue/gallery_archive_month.html b/photologue/templates/photologue/gallery_archive_month.html new file mode 100644 index 0000000..ecc6442 --- /dev/null +++ b/photologue/templates/photologue/gallery_archive_month.html @@ -0,0 +1,43 @@ +{% extends "photologue/root.html" %} +{% load i18n %} + +{% block title %}{% blocktrans with show_month=month|date:"F Y" %}Galleries for {{ show_month }}{% endblocktrans %}{% endblock %} + +{% block content %} + +
    +
    +

    {% blocktrans with show_month=month|date:"F Y" %}Galleries for {{ show_month }}{% endblocktrans %}

    +
    +
    + +
    + + + +
    + + {% if object_list %} + {% for gallery in object_list %} + {% include "photologue/includes/gallery_sample.html" %} + {% endfor %} + {% else %} +

    {% trans "No galleries were found." %}

    + {% endif %} + + + +
    + +
    + +{% endblock %} diff --git a/photologue/templates/photologue/gallery_archive_year.html b/photologue/templates/photologue/gallery_archive_year.html new file mode 100644 index 0000000..145b541 --- /dev/null +++ b/photologue/templates/photologue/gallery_archive_year.html @@ -0,0 +1,42 @@ +{% extends "photologue/root.html" %} +{% load i18n %} + +{% block title %}{% blocktrans with show_year=year|date:"Y" %}Galleries for {{ show_year }}{% endblocktrans %}{% endblock %} + +{% block content %} + +
    +
    +

    {% blocktrans with show_year=year|date:"Y" %}Galleries for {{ show_year }}{% endblocktrans %}

    +
    +
    +
    + + + +
    + + {% if object_list %} + {% for gallery in object_list %} + {% include "photologue/includes/gallery_sample.html" %} + {% endfor %} + {% else %} +

    {% trans "No galleries were found." %}

    + {% endif %} + + + +
    + +
    + +{% endblock %} diff --git a/photologue/templates/photologue/gallery_detail.html b/photologue/templates/photologue/gallery_detail.html new file mode 100644 index 0000000..098f9be --- /dev/null +++ b/photologue/templates/photologue/gallery_detail.html @@ -0,0 +1,26 @@ +{% extends "photologue/root.html" %} +{% load i18n %} + +{% block title %}{{ gallery.title }}{% endblock %} + +{% block content %} + +
    +
    +

    {{ gallery.title }}

    +

    {% trans "Published" %} {{ gallery.date_added }}

    + {% if gallery.description %}{{ gallery.description|safe }}{% endif %} + + +
    +
    + +{% endblock %} diff --git a/photologue/templates/photologue/gallery_list.html b/photologue/templates/photologue/gallery_list.html new file mode 100644 index 0000000..db32995 --- /dev/null +++ b/photologue/templates/photologue/gallery_list.html @@ -0,0 +1,30 @@ +{% extends "photologue/root.html" %} +{% load i18n %} + +{% block title %}{% trans "All galleries" %}{% endblock %} + +{% block content %} + +
    +
    +

    {% trans "All galleries" %}

    +
    +
    + +{% if object_list %} +{% for gallery in object_list %} +
    +
    + {% include "photologue/includes/gallery_sample.html" %} +
    +
    +{% endfor %} +{% else %} +
    +
    {% trans "No galleries were found" %}.
    +
    +{% endif %} + +{% include "photologue/includes/paginator.html" %} + +{% endblock %} diff --git a/photologue/templates/photologue/includes/gallery_sample.html b/photologue/templates/photologue/includes/gallery_sample.html new file mode 100644 index 0000000..db1fb77 --- /dev/null +++ b/photologue/templates/photologue/includes/gallery_sample.html @@ -0,0 +1,17 @@ +{% load i18n %} + +{# Display a randomnly-selected set of photos from a given gallery #} + + diff --git a/photologue/templates/photologue/includes/paginator.html b/photologue/templates/photologue/includes/paginator.html new file mode 100644 index 0000000..1a22b61 --- /dev/null +++ b/photologue/templates/photologue/includes/paginator.html @@ -0,0 +1,32 @@ +{% load i18n %} +{% if is_paginated %} +
    +
    + + +
    +
    +{% endif %} diff --git a/photologue/templates/photologue/photo_archive.html b/photologue/templates/photologue/photo_archive.html new file mode 100644 index 0000000..e409119 --- /dev/null +++ b/photologue/templates/photologue/photo_archive.html @@ -0,0 +1,45 @@ +{% extends "photologue/root.html" %} +{% load i18n %} + +{% block title %}{% trans "Latest photos" %}{% endblock %} + +{% block content %} + +
    +
    +

    {% trans "Latest photos" %}

    +
    +
    + +
    + + + +
    + + {% if latest %} + {% for photo in latest %} + + {{ photo.title }} + + {% endfor %} + {% else %} +

    {% trans "No photos were found" %}.

    + {% endif %} + +
    + +
    + +{% endblock %} + + diff --git a/photologue/templates/photologue/photo_archive_day.html b/photologue/templates/photologue/photo_archive_day.html new file mode 100644 index 0000000..2b66ff5 --- /dev/null +++ b/photologue/templates/photologue/photo_archive_day.html @@ -0,0 +1,30 @@ +{% extends "photologue/root.html" %} +{% load i18n %} + +{% block title %}{% blocktrans with show_day=day|date:"d F Y" %}Photos for {{ show_day }}{% endblocktrans %}{% endblock %} + +{% block content %} + +
    +
    +

    {% blocktrans with show_day=day|date:"d F Y" %}Photos for {{ show_day }}{% endblocktrans %}

    +
    +
    + + {% if object_list %} +
    +
    + {% for photo in object_list %} + + {{ photo.title }} + + {% endfor %} +
    +
    + {% else %} +

    {% trans "No photos were found" %}.

    + {% endif %} + + + +{% endblock %} diff --git a/photologue/templates/photologue/photo_archive_month.html b/photologue/templates/photologue/photo_archive_month.html new file mode 100644 index 0000000..4f15ade --- /dev/null +++ b/photologue/templates/photologue/photo_archive_month.html @@ -0,0 +1,49 @@ +{% extends "photologue/root.html" %} +{% load i18n %} + +{% block title %}{% blocktrans with show_month=month|date:"F Y" %}Photos for {{ show_month }}{% endblocktrans %}{% endblock %} + +{% block content %} + +
    +
    +

    {% blocktrans with show_month=month|date:"F Y" %}Photos for {{ show_month }}{% endblocktrans %}

    +
    +
    + +
    + + + +
    + + {% if object_list %} +
    +
    + {% for photo in object_list %} + + {{ photo.title }} + + {% endfor %} +
    +
    + {% else %} +

    {% trans "No photos were found" %}.

    + {% endif %} + + + +
    + +
    + +{% endblock %} diff --git a/photologue/templates/photologue/photo_archive_year.html b/photologue/templates/photologue/photo_archive_year.html new file mode 100644 index 0000000..23f6f18 --- /dev/null +++ b/photologue/templates/photologue/photo_archive_year.html @@ -0,0 +1,54 @@ +{% extends "photologue/root.html" %} +{% load i18n %} + +{% block title %}{% blocktrans with show_year=year|date:"Y" %}Photos for {{ show_year }}{% endblocktrans %}{% endblock %} + + +{% block content %} + +
    +
    +

    {% blocktrans with show_year=year|date:"Y" %}Photos for {{ show_year }}{% endblocktrans %}

    +
    +
    + +
    + + + +
    + + {% if object_list %} +
    +
    + {% for photo in object_list %} + + {{ photo.title }} + + {% endfor %} +
    +
    + {% else %} +

    {% trans "No photos were found" %}.

    + {% endif %} + + + +
    + +
    + +{% endblock %} + + + + diff --git a/photologue/templates/photologue/photo_detail.html b/photologue/templates/photologue/photo_detail.html new file mode 100644 index 0000000..21240fc --- /dev/null +++ b/photologue/templates/photologue/photo_detail.html @@ -0,0 +1,38 @@ +{% extends "photologue/root.html" %} +{% load photologue_tags i18n %} + +{% block title %}{{ object.title }}{% endblock %} + +{% block content %} + +
    +
    +

    {{ object.title }}

    +

    {% trans "Published" %} {{ object.date_added }}

    +
    +
    + +
    +
    + {% if object.caption %}

    {{ object.caption }}

    {% endif %} + + {{ object.title }} + +
    +
    + {% if object.public_galleries %} +

    {% trans "This photo is found in the following galleries" %}:

    + + {% for gallery in object.public_galleries %} + + + + + + {% endfor %} +
    {% previous_in_gallery object gallery %}{{ gallery.title }}{% next_in_gallery object gallery %}
    + {% endif %} +
    +
    + +{% endblock %} diff --git a/photologue/templates/photologue/photo_list.html b/photologue/templates/photologue/photo_list.html new file mode 100644 index 0000000..b05cfe5 --- /dev/null +++ b/photologue/templates/photologue/photo_list.html @@ -0,0 +1,29 @@ +{% extends "photologue/root.html" %} +{% load i18n %} + +{% block title %}{% trans "All photos" %}{% endblock %} + +{% block content %} + +
    +
    +

    {% trans "All photos" %}

    +
    +
    +{% if object_list %} +
    +
    + {% for photo in object_list %} + + {{ photo.title }} + + {% endfor %} +
    +
    +{% else %} +
    {% trans "No photos were found" %}.
    +{% endif %} + +{% include "photologue/includes/paginator.html" %} + +{% endblock %} diff --git a/photologue/templates/photologue/root.html b/photologue/templates/photologue/root.html new file mode 100644 index 0000000..94d9808 --- /dev/null +++ b/photologue/templates/photologue/root.html @@ -0,0 +1 @@ +{% extends "base.html" %} diff --git a/photologue/templates/photologue/tags/next_in_gallery.html b/photologue/templates/photologue/tags/next_in_gallery.html new file mode 100644 index 0000000..c53f003 --- /dev/null +++ b/photologue/templates/photologue/tags/next_in_gallery.html @@ -0,0 +1,5 @@ +{% if photo %} + + {{ photo.title }} + +{% endif %} diff --git a/photologue/templates/photologue/tags/prev_in_gallery.html b/photologue/templates/photologue/tags/prev_in_gallery.html new file mode 100644 index 0000000..c53f003 --- /dev/null +++ b/photologue/templates/photologue/tags/prev_in_gallery.html @@ -0,0 +1,5 @@ +{% if photo %} + + {{ photo.title }} + +{% endif %} diff --git a/photologue/templatetags/__init__.py b/photologue/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/photologue/templatetags/photologue_tags.py b/photologue/templatetags/photologue_tags.py new file mode 100644 index 0000000..464e5bb --- /dev/null +++ b/photologue/templatetags/photologue_tags.py @@ -0,0 +1,131 @@ +import random + +from django import template + +from ..models import Gallery, Photo + +register = template.Library() + + +@register.inclusion_tag('photologue/tags/next_in_gallery.html') +def next_in_gallery(photo, gallery): + return {'photo': photo.get_next_in_gallery(gallery)} + + +@register.inclusion_tag('photologue/tags/prev_in_gallery.html') +def previous_in_gallery(photo, gallery): + return {'photo': photo.get_previous_in_gallery(gallery)} + + +@register.simple_tag +def cycle_lite_gallery(gallery_title, height, width): + """Generate image tags for jquery slideshow gallery. + See http://malsup.com/jquery/cycle/lite/""" + html = "" + first = 'class="first"' + for p in Gallery.objects.get(title=gallery_title).public(): + html += '{}'.format( + p.get_display_url(), p.title, height, width, first) + first = None + return html + + +@register.tag +def get_photo(parser, token): + """Get a single photo from the photologue library and return the img tag to display it. + + Takes 3 args: + - the photo to display. This can be either the slug of a photo, or a variable that holds either a photo instance or + a integer (photo id) + - the photosize to use. + - a CSS class to apply to the img tag. + """ + try: + # Split the contents of the tag, i.e. tag name + argument. + tag_name, photo, photosize, css_class = token.split_contents() + except ValueError: + msg = '%r tag requires 3 arguments' % token.contents[0] + raise template.TemplateSyntaxError(msg) + return PhotoNode(photo, photosize[1:-1], css_class[1:-1]) + + +class PhotoNode(template.Node): + + def __init__(self, photo, photosize, css_class): + self.photo = photo + self.photosize = photosize + self.css_class = css_class + + def render(self, context): + try: + a = template.Variable(self.photo).resolve(context) + except: + a = self.photo + if isinstance(a, Photo): + p = a + else: + try: + p = Photo.objects.get(slug=a) + except Photo.DoesNotExist: + # Ooops. Fail silently + return None + if not p.is_public: + return None + func = getattr(p, 'get_%s_url' % (self.photosize), None) + if func is None: + return 'A "%s" photo size has not been defined.' % (self.photosize) + else: + return f'{p.title}' + + +@register.tag +def get_rotating_photo(parser, token): + """Pick at random a photo from a given photologue gallery and return the img tag to display it. + + Takes 3 args: + - the gallery to pick a photo from. This can be either the slug of a gallery, or a variable that holds either a + gallery instance or a gallery slug. + - the photosize to use. + - a CSS class to apply to the img tag. + """ + try: + # Split the contents of the tag, i.e. tag name + argument. + tag_name, gallery, photosize, css_class = token.split_contents() + except ValueError: + msg = '%r tag requires 3 arguments' % token.contents[0] + raise template.TemplateSyntaxError(msg) + return PhotoGalleryNode(gallery, photosize[1:-1], css_class[1:-1]) + + +class PhotoGalleryNode(template.Node): + + def __init__(self, gallery, photosize, css_class): + self.gallery = gallery + self.photosize = photosize + self.css_class = css_class + + def render(self, context): + try: + a = template.resolve_variable(self.gallery, context) + except: + a = self.gallery + if isinstance(a, Gallery): + g = a + else: + try: + g = Gallery.objects.get(slug=a) + except Gallery.DoesNotExist: + return None + photos = g.public() + if len(photos) > 1: + r = random.randint(0, len(photos) - 1) + p = photos[r] + elif len(photos) == 1: + p = photos[0] + else: + return None + func = getattr(p, 'get_%s_url' % (self.photosize), None) + if func is None: + return 'A "%s" photo size has not been defined.' % (self.photosize) + else: + return f'{p.title}' diff --git a/photologue/tests/__init__.py b/photologue/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/photologue/tests/factories.py b/photologue/tests/factories.py new file mode 100644 index 0000000..ec9a632 --- /dev/null +++ b/photologue/tests/factories.py @@ -0,0 +1,120 @@ +import datetime +import os + +from django.conf import settings +from django.utils.text import slugify + +try: + import factory +except ImportError: + raise ImportError( + "No module named factory. To run photologue's tests you need to install factory-boy.") + +from ..models import Gallery, ImageModel, Photo, PhotoEffect, PhotoSize + +RES_DIR = os.path.join(os.path.dirname(__file__), '../res') +LANDSCAPE_IMAGE_PATH = os.path.join(RES_DIR, 'test_photologue_landscape.jpg') +PORTRAIT_IMAGE_PATH = os.path.join(RES_DIR, 'test_photologue_portrait.jpg') +SQUARE_IMAGE_PATH = os.path.join(RES_DIR, 'test_photologue_square.jpg') +QUOTING_IMAGE_PATH = os.path.join(RES_DIR, 'test_photologue_"ing.jpg') +UNICODE_IMAGE_PATH = os.path.join(RES_DIR, 'test_unicode_®.jpg') +NONSENSE_IMAGE_PATH = os.path.join(RES_DIR, 'test_nonsense.jpg') +SAMPLE_ZIP_PATH = os.path.join(RES_DIR, 'zips/sample.zip') +SAMPLE_NOT_IMAGE_ZIP_PATH = os.path.join(RES_DIR, 'zips/not_image.zip') +IGNORED_FILES_ZIP_PATH = os.path.join(RES_DIR, 'zips/ignored_files.zip') + + +class GalleryFactory(factory.django.DjangoModelFactory): + + class Meta: + model = Gallery + + title = factory.Sequence(lambda n: f'gallery{n:0>3}') + slug = factory.LazyAttribute(lambda a: slugify(a.title)) + + @factory.sequence + def date_added(n): + # Have to cater projects being non-timezone aware. + if settings.USE_TZ: + sample_date = datetime.datetime( + year=2011, month=12, day=23, hour=17, minute=40, tzinfo=datetime.timezone.utc) + else: + sample_date = datetime.datetime(year=2011, month=12, day=23, hour=17, minute=40) + return sample_date + datetime.timedelta(minutes=n) + + @factory.post_generation + def sites(self, create, extracted, **kwargs): + """ + Associates the object with the current site unless ``sites`` was passed, + in which case the each item in ``sites`` is associated with the object. + + Note that if PHOTOLOGUE_MULTISITE is False, all Gallery/Photos are automatically + associated with the current site - bear this in mind when writing tests. + """ + if not create: + return + if extracted: + for site in extracted: + self.sites.add(site) + + +class ImageModelFactory(factory.django.DjangoModelFactory): + + class Meta: + model = ImageModel + abstract = True + + +class PhotoFactory(ImageModelFactory): + + """Note: after creating Photo instances for tests, remember to manually + delete them. + """ + + class Meta: + model = Photo + + title = factory.Sequence(lambda n: f'photo{n:0>3}') + slug = factory.LazyAttribute(lambda a: slugify(a.title)) + image = factory.django.ImageField(from_path=LANDSCAPE_IMAGE_PATH) + + @factory.sequence + def date_added(n): + # Have to cater projects being non-timezone aware. + if settings.USE_TZ: + sample_date = datetime.datetime( + year=2011, month=12, day=23, hour=17, minute=40, tzinfo=datetime.timezone.utc) + else: + sample_date = datetime.datetime(year=2011, month=12, day=23, hour=17, minute=40) + return sample_date + datetime.timedelta(minutes=n) + + @factory.post_generation + def sites(self, create, extracted, **kwargs): + """ + Associates the object with the current site unless ``sites`` was passed, + in which case the each item in ``sites`` is associated with the object. + + Note that if PHOTOLOGUE_MULTISITE is False, all Gallery/Photos are automatically + associated with the current site - bear this in mind when writing tests. + """ + if not create: + return + if extracted: + for site in extracted: + self.sites.add(site) + + +class PhotoSizeFactory(factory.django.DjangoModelFactory): + + class Meta: + model = PhotoSize + + name = factory.Sequence(lambda n: f'name{n:0>3}') + + +class PhotoEffectFactory(factory.django.DjangoModelFactory): + + class Meta: + model = PhotoEffect + + name = factory.Sequence(lambda n: f'effect{n:0>3}') diff --git a/photologue/tests/helpers.py b/photologue/tests/helpers.py new file mode 100644 index 0000000..d296650 --- /dev/null +++ b/photologue/tests/helpers.py @@ -0,0 +1,25 @@ +import warnings + +from django.test import TestCase + +from .factories import PhotoFactory, PhotoSizeFactory + + +class PhotologueBaseTest(TestCase): + + def setUp(self): + self.s = PhotoSizeFactory(name='testPhotoSize', + width=100, + height=100) + try: + # Squash lots of ResourceWarning generated by the Pillow library during unit tests. + warnings.simplefilter("ignore", ResourceWarning) + except NameError: + # Doesn't exist in Python 2.7. + pass + self.pl = PhotoFactory(title='Landscape', + slug='landscape') + + def tearDown(self): + # Need to manually remove the files created during testing. + self.pl.delete() diff --git a/photologue/tests/templates/base.html b/photologue/tests/templates/base.html new file mode 100644 index 0000000..e69de29 diff --git a/photologue/tests/test_effect.py b/photologue/tests/test_effect.py new file mode 100644 index 0000000..987c97a --- /dev/null +++ b/photologue/tests/test_effect.py @@ -0,0 +1,12 @@ +from ..models import Image, PhotoEffect +from .helpers import PhotologueBaseTest + + +class PhotoEffectTest(PhotologueBaseTest): + + def test(self): + effect = PhotoEffect(name='test') + im = Image.open(self.pl.image.storage.open(self.pl.image.name)) + self.assertIsInstance(effect.pre_process(im), Image.Image) + self.assertIsInstance(effect.post_process(im), Image.Image) + self.assertIsInstance(effect.process(im), Image.Image) diff --git a/photologue/tests/test_gallery.py b/photologue/tests/test_gallery.py new file mode 100644 index 0000000..5d1b657 --- /dev/null +++ b/photologue/tests/test_gallery.py @@ -0,0 +1,63 @@ +from .. import models +from .factories import GalleryFactory, PhotoFactory +from .helpers import PhotologueBaseTest + + +class GalleryTest(PhotologueBaseTest): + + def setUp(self): + """Create a test gallery with 2 photos.""" + super().setUp() + self.test_gallery = GalleryFactory() + self.pl2 = PhotoFactory() + self.test_gallery.photos.add(self.pl) + self.test_gallery.photos.add(self.pl2) + + def tearDown(self): + super().tearDown() + self.pl2.delete() + + def test_public(self): + """Method 'public' should only return photos flagged as public.""" + self.assertEqual(self.test_gallery.public().count(), 2) + self.pl.is_public = False + self.pl.save() + self.assertEqual(self.test_gallery.public().count(), 1) + + def test_photo_count(self): + """Method 'photo_count' should return the count of the photos in this + gallery.""" + self.assertEqual(self.test_gallery.photo_count(), 2) + self.pl.is_public = False + self.pl.save() + self.assertEqual(self.test_gallery.photo_count(), 1) + + # Method takes an optional 'public' kwarg. + self.assertEqual(self.test_gallery.photo_count(public=False), 2) + + def test_sample(self): + """Method 'sample' should return a random queryset of photos from the + gallery.""" + + # By default we return all photos from the gallery (but ordered at random). + _current_sample_size = models.SAMPLE_SIZE + models.SAMPLE_SIZE = 5 + self.assertEqual(len(self.test_gallery.sample()), 2) + + # We can state how many photos we want. + self.assertEqual(len(self.test_gallery.sample(count=1)), 1) + + # If only one photo is public then the sample cannot have more than one + # photo. + self.pl.is_public = False + self.pl.save() + self.assertEqual(len(self.test_gallery.sample(count=2)), 1) + + self.pl.is_public = True + self.pl.save() + + # We can limit the number of photos by changing settings. + models.SAMPLE_SIZE = 1 + self.assertEqual(len(self.test_gallery.sample()), 1) + + models.SAMPLE_SIZE = _current_sample_size diff --git a/photologue/tests/test_photo.py b/photologue/tests/test_photo.py new file mode 100644 index 0000000..48e608b --- /dev/null +++ b/photologue/tests/test_photo.py @@ -0,0 +1,293 @@ +import os +import unittest +from io import BytesIO +from unittest.mock import patch + +from django import VERSION +from django.conf import settings +from django.core.files.base import ContentFile +from django.core.files.storage import default_storage + +from ..models import PHOTOLOGUE_CACHEDIRTAG, PHOTOLOGUE_DIR, Image, Photo +from .factories import (LANDSCAPE_IMAGE_PATH, NONSENSE_IMAGE_PATH, QUOTING_IMAGE_PATH, UNICODE_IMAGE_PATH, + GalleryFactory, PhotoEffectFactory, PhotoFactory) +from .helpers import PhotologueBaseTest + + +class PhotoTest(PhotologueBaseTest): + + def tearDown(self): + """Delete any extra test files (if created).""" + super().tearDown() + try: + self.pl2.delete() + except: + pass + + def test_new_photo(self): + self.assertEqual(Photo.objects.count(), 1) + self.assertTrue(self.pl.image.storage.exists(self.pl.image.name)) + self.assertEqual(self.pl.image.storage.size(self.pl.image.name), + os.path.getsize(LANDSCAPE_IMAGE_PATH)) + + # def test_exif(self): + # self.assertTrue(len(self.pl.EXIF.keys()) > 0) + + def test_paths(self): + self.assertEqual(os.path.normpath(str(self.pl.cache_path())).lower(), + os.path.normpath(os.path.join(PHOTOLOGUE_DIR, + 'photos', + 'cache')).lower()) + self.assertEqual(self.pl.cache_url(), + settings.MEDIA_URL + PHOTOLOGUE_DIR + '/photos/cache') + + def test_cachedir_tag(self): + self.assertTrue(default_storage.exists(PHOTOLOGUE_CACHEDIRTAG)) + + content = default_storage.open(PHOTOLOGUE_CACHEDIRTAG).read() + self.assertEqual(content, b"Signature: 8a477f597d28d172789f06886806bc55") + + def test_count(self): + for i in range(5): + self.pl.get_testPhotoSize_url() + self.assertEqual(self.pl.view_count, 0) + self.s.increment_count = True + self.s.save() + for i in range(5): + self.pl.get_testPhotoSize_url() + self.assertEqual(self.pl.view_count, 5) + + def test_precache(self): + # set the thumbnail photo size to pre-cache + self.s.pre_cache = True + self.s.save() + # make sure it created the file + self.assertTrue(self.pl.image.storage.exists( + self.pl.get_testPhotoSize_filename())) + self.s.pre_cache = False + self.s.save() + # clear the cache and make sure the file's deleted + self.pl.clear_cache() + self.assertFalse(self.pl.image.storage.exists( + self.pl.get_testPhotoSize_filename())) + + def test_accessor_methods(self): + self.assertEqual(self.pl.get_testPhotoSize_photosize(), self.s) + self.assertEqual(self.pl.get_testPhotoSize_size(), + Image.open(self.pl.image.storage.open( + self.pl.get_testPhotoSize_filename())).size) + self.assertEqual(self.pl.get_testPhotoSize_url(), + self.pl.cache_url() + '/' + self.pl._get_filename_for_size(self.s)) + self.assertEqual(self.pl.get_testPhotoSize_filename(), + os.path.join(self.pl.cache_path(), + self.pl._get_filename_for_size(self.s))) + + def test_quoted_url(self): + """Test for issue #29 - filenames of photos are incorrectly quoted when + building a URL.""" + + # Create a Photo with a name that needs quoting. + self.pl2 = PhotoFactory(image__from_path=QUOTING_IMAGE_PATH) + # Quoting method filepath_to_uri has changed in Django 1.9 - so the string that we're looking + # for depends on the Django version. + if VERSION[0] == 1 and VERSION[1] <= 8: + quoted_string = 'test_photologue_%26quoting_testPhotoSize.jpg' + else: + quoted_string = 'test_photologue_quoting_testPhotoSize.jpg' + self.assertIn(quoted_string, + self.pl2.get_testPhotoSize_url(), + self.pl2.get_testPhotoSize_url()) + + def test_unicode(self): + """Trivial check that unicode titles work. + (I was trying to track down an elusive unicode issue elsewhere)""" + self.pl2 = PhotoFactory(title='É', + slug='é') + + @patch('photologue.models.ImageModel.resize_image') + def test_update_crop_applied(self, mock_resize_image): + self.assertEqual(1, Photo.objects.count()) + self.assertTrue(self.pl.crop_from != 'right') + self.pl.crop_from = 'right' + self.pl.save() + self.assertTrue(mock_resize_image.called) + + @patch('photologue.models.ImageModel.resize_image') + @patch('photologue.models.PhotoEffect.pre_process') + @patch('photologue.models.PhotoEffect.post_process') + def test_update_effect_applied(self, mock_post_process, mock_pre_process, mock_resize_image): + self.assertEqual(1, Photo.objects.count()) + self.assertIsNone(self.pl.effect) + self.pl.effect = PhotoEffectFactory() + self.pl.save() + self.assertTrue(mock_pre_process.called) + self.assertTrue(mock_resize_image.called) + self.assertTrue(mock_post_process.called) + + +class PhotoManagerTest(PhotologueBaseTest): + """Some tests for the methods on the Photo manager class.""" + + def setUp(self): + """Create 2 photos.""" + super().setUp() + self.pl2 = PhotoFactory() + + def tearDown(self): + super().tearDown() + self.pl2.delete() + + def test_public(self): + """Method 'is_public' should only return photos flagged as public.""" + self.assertEqual(Photo.objects.is_public().count(), 2) + self.pl.is_public = False + self.pl.save() + self.assertEqual(Photo.objects.is_public().count(), 1) + + +class PreviousNextTest(PhotologueBaseTest): + """Tests for the methods that provide the previous/next photos in a gallery.""" + + def setUp(self): + """Create a test gallery with 2 photos.""" + super().setUp() + self.test_gallery = GalleryFactory() + self.pl1 = PhotoFactory() + self.pl2 = PhotoFactory() + self.pl3 = PhotoFactory() + self.test_gallery.photos.add(self.pl1) + self.test_gallery.photos.add(self.pl2) + self.test_gallery.photos.add(self.pl3) + + def tearDown(self): + super().tearDown() + self.pl1.delete() + self.pl2.delete() + self.pl3.delete() + + def test_previous_simple(self): + # Previous in gallery. + self.assertEqual(self.pl1.get_previous_in_gallery(self.test_gallery), + None) + self.assertEqual(self.pl2.get_previous_in_gallery(self.test_gallery), + self.pl1) + self.assertEqual(self.pl3.get_previous_in_gallery(self.test_gallery), + self.pl2) + + def test_previous_public(self): + """What happens if one of the photos is not public.""" + self.pl2.is_public = False + self.pl2.save() + + self.assertEqual(self.pl1.get_previous_in_gallery(self.test_gallery), + None) + self.assertRaisesMessage(ValueError, + 'Cannot determine neighbours of a non-public photo.', + self.pl2.get_previous_in_gallery, + self.test_gallery) + self.assertEqual(self.pl3.get_previous_in_gallery(self.test_gallery), + self.pl1) + + def test_previous_gallery_mismatch(self): + """Photo does not belong to the gallery.""" + self.pl4 = PhotoFactory() + + self.assertRaisesMessage(ValueError, + 'Photo does not belong to gallery.', + self.pl4.get_previous_in_gallery, + self.test_gallery) + + self.pl4.delete() + + def test_next_simple(self): + # Next in gallery. + self.assertEqual(self.pl1.get_next_in_gallery(self.test_gallery), + self.pl2) + self.assertEqual(self.pl2.get_next_in_gallery(self.test_gallery), + self.pl3) + self.assertEqual(self.pl3.get_next_in_gallery(self.test_gallery), + None) + + def test_next_public(self): + """What happens if one of the photos is not public.""" + self.pl2.is_public = False + self.pl2.save() + + self.assertEqual(self.pl1.get_next_in_gallery(self.test_gallery), + self.pl3) + self.assertRaisesMessage(ValueError, + 'Cannot determine neighbours of a non-public photo.', + self.pl2.get_next_in_gallery, + self.test_gallery) + self.assertEqual(self.pl3.get_next_in_gallery(self.test_gallery), + None) + + def test_next_gallery_mismatch(self): + """Photo does not belong to the gallery.""" + self.pl4 = PhotoFactory() + + self.assertRaisesMessage(ValueError, + 'Photo does not belong to gallery.', + self.pl4.get_next_in_gallery, + self.test_gallery) + + self.pl4.delete() + + +class ImageModelTest(PhotologueBaseTest): + + def setUp(self): + super().setUp() + + # Unicode image has unicode in the path + # self.pu = TestPhoto(name='portrait') + self.pu = PhotoFactory() + self.pu.image.save(os.path.basename(UNICODE_IMAGE_PATH), + ContentFile(open(UNICODE_IMAGE_PATH, 'rb').read())) + + # Nonsense image contains nonsense + # self.pn = TestPhoto(name='portrait') + self.pn = PhotoFactory() + self.pn.image.save(os.path.basename(NONSENSE_IMAGE_PATH), + ContentFile(open(NONSENSE_IMAGE_PATH, 'rb').read())) + + def tearDown(self): + super().tearDown() + self.pu.delete() + self.pn.delete() + + @unittest.skipUnless(os.path.exists(UNICODE_IMAGE_PATH), + 'Test relies on a file with a non-ascii filename - this cannot be distributed as it breaks ' + 'under Python 2.7, so the distribution does not include that test file.') + def test_create_size(self): + """Nonsense image must not break scaling""" + self.pn.create_size(self.s) + + +def raw_image(mode='RGB', fmt='JPEG'): + """Create raw image. + """ + data = BytesIO() + Image.new(mode, (100, 100)).save(data, fmt) + data.seek(0) + return data + + +class ImageTransparencyTest(PhotologueBaseTest): + + def setUp(self): + super().setUp() + self.png = PhotoFactory() + self.png.image.save( + 'trans.png', ContentFile(raw_image('RGBA', 'PNG').read())) + + def tearDown(self): + super().tearDown() + self.png.clear_cache() + os.unlink(os.path.join(settings.MEDIA_ROOT, self.png.image.path)) + + def test_create_size_png_keep_alpha_channel(self): + thumbnail = self.png.get_thumbnail_filename() + im = Image.open( + os.path.join(settings.MEDIA_ROOT, thumbnail)) + self.assertEqual('RGBA', im.mode) diff --git a/photologue/tests/test_photosize.py b/photologue/tests/test_photosize.py new file mode 100644 index 0000000..52c6507 --- /dev/null +++ b/photologue/tests/test_photosize.py @@ -0,0 +1,29 @@ +from django.core.exceptions import ValidationError + +from .factories import PhotoSizeFactory +from .helpers import PhotologueBaseTest + + +class PhotoSizeNameTest(PhotologueBaseTest): + + def test_valid_name(self): + """We are restricted in what names we can enter.""" + + photosize = PhotoSizeFactory() + photosize.name = None + with self.assertRaisesMessage(ValidationError, 'This field cannot be null.'): + photosize.full_clean() + + photosize = PhotoSizeFactory(name='') + with self.assertRaisesMessage(ValidationError, 'This field cannot be blank.'): + photosize.full_clean() + + for name in ('a space', 'UPPERCASE', 'bad?chars'): + photosize = PhotoSizeFactory(name=name) + with self.assertRaisesMessage(ValidationError, + 'Use only plain lowercase letters (ASCII), numbers and underscores.'): + photosize.full_clean() + + for name in ('label', '2_words'): + photosize = PhotoSizeFactory(name=name) + photosize.full_clean() diff --git a/photologue/tests/test_resize.py b/photologue/tests/test_resize.py new file mode 100644 index 0000000..9fdd510 --- /dev/null +++ b/photologue/tests/test_resize.py @@ -0,0 +1,134 @@ +import unittest + +from django.core.exceptions import ValidationError + +from ..models import PhotoSize, PhotoSizeCache +from .factories import PORTRAIT_IMAGE_PATH, SQUARE_IMAGE_PATH, PhotoFactory +from .helpers import PhotologueBaseTest + + +class PhotoSizeTest(unittest.TestCase): + + def test_clean_wont_allow_zero_dimension_and_crop(self): + """Tests if ValidationError is raised by clean method if with or height + is set to 0 and crop is set to true""" + s = PhotoSize(name='test', width=400, crop=True) + self.assertRaises(ValidationError, s.clean) + + +class ImageResizeTest(PhotologueBaseTest): + + def setUp(self): + super().setUp() + # Portrait. + self.pp = PhotoFactory(image__from_path=PORTRAIT_IMAGE_PATH) + # Square. + self.ps = PhotoFactory(image__from_path=SQUARE_IMAGE_PATH) + + def tearDown(self): + super().tearDown() + self.pp.delete() + self.ps.delete() + + def test_resize_to_fit(self): + self.assertEqual(self.pl.get_testPhotoSize_size(), (100, 75)) + self.assertEqual(self.pp.get_testPhotoSize_size(), (75, 100)) + self.assertEqual(self.ps.get_testPhotoSize_size(), (100, 100)) + + def test_resize_to_fit_width(self): + self.s.size = (100, 0) + self.s.save() + self.assertEqual(self.pl.get_testPhotoSize_size(), (100, 75)) + self.assertEqual(self.pp.get_testPhotoSize_size(), (100, 133)) + self.assertEqual(self.ps.get_testPhotoSize_size(), (100, 100)) + + def test_resize_to_fit_width_enlarge(self): + self.s.size = (400, 0) + self.s.upscale = True + self.s.save() + self.assertEqual(self.pl.get_testPhotoSize_size(), (400, 300)) + self.assertEqual(self.pp.get_testPhotoSize_size(), (400, 533)) + self.assertEqual(self.ps.get_testPhotoSize_size(), (400, 400)) + + def test_resize_to_fit_height(self): + self.s.size = (0, 100) + self.s.save() + self.assertEqual(self.pl.get_testPhotoSize_size(), (133, 100)) + self.assertEqual(self.pp.get_testPhotoSize_size(), (75, 100)) + self.assertEqual(self.ps.get_testPhotoSize_size(), (100, 100)) + + def test_resize_to_fit_height_enlarge(self): + self.s.size = (0, 400) + self.s.upscale = True + self.s.save() + self.assertEqual(self.pl.get_testPhotoSize_size(), (533, 400)) + self.assertEqual(self.pp.get_testPhotoSize_size(), (300, 400)) + self.assertEqual(self.ps.get_testPhotoSize_size(), (400, 400)) + + def test_resize_and_crop(self): + self.s.crop = True + self.s.save() + self.assertEqual(self.pl.get_testPhotoSize_size(), self.s.size) + self.assertEqual(self.pp.get_testPhotoSize_size(), self.s.size) + self.assertEqual(self.ps.get_testPhotoSize_size(), self.s.size) + + def test_resize_rounding_to_fit(self): + self.s.size = (113, 113) + self.s.save() + self.assertEqual(self.pl.get_testPhotoSize_size(), (113, 85)) + self.assertEqual(self.pp.get_testPhotoSize_size(), (85, 113)) + self.assertEqual(self.ps.get_testPhotoSize_size(), (113, 113)) + + def test_resize_rounding_cropped(self): + self.s.size = (113, 113) + self.s.crop = True + self.s.save() + self.assertEqual(self.pl.get_testPhotoSize_size(), self.s.size) + self.assertEqual(self.pp.get_testPhotoSize_size(), self.s.size) + self.assertEqual(self.ps.get_testPhotoSize_size(), self.s.size) + + def test_resize_one_dimension_width(self): + self.s.size = (100, 150) + self.s.save() + self.assertEqual(self.pl.get_testPhotoSize_size(), (100, 75)) + + def test_resize_one_dimension_height(self): + self.s.size = (200, 75) + self.s.save() + self.assertEqual(self.pl.get_testPhotoSize_size(), (100, 75)) + + def test_resize_no_upscale(self): + self.s.size = (1000, 1000) + self.s.save() + self.assertEqual(self.pl.get_testPhotoSize_size(), (200, 150)) + + def test_resize_no_upscale_mixed_height(self): + self.s.size = (400, 75) + self.s.save() + self.assertEqual(self.pl.get_testPhotoSize_size(), (100, 75)) + + def test_resize_no_upscale_mixed_width(self): + self.s.size = (100, 300) + self.s.save() + self.assertEqual(self.pl.get_testPhotoSize_size(), (100, 75)) + + def test_resize_no_upscale_crop(self): + self.s.size = (1000, 1000) + self.s.crop = True + self.s.save() + self.assertEqual(self.pl.get_testPhotoSize_size(), (1000, 1000)) + + def test_resize_upscale(self): + self.s.size = (1000, 1000) + self.s.upscale = True + self.s.save() + self.assertEqual(self.pl.get_testPhotoSize_size(), (1000, 750)) + self.assertEqual(self.pp.get_testPhotoSize_size(), (750, 1000)) + self.assertEqual(self.ps.get_testPhotoSize_size(), (1000, 1000)) + + +class PhotoSizeCacheTest(PhotologueBaseTest): + + def test(self): + cache = PhotoSizeCache() + self.assertEqual(cache.sizes['testPhotoSize'], self.s) diff --git a/photologue/tests/test_sitemap.py b/photologue/tests/test_sitemap.py new file mode 100644 index 0000000..0b9ccec --- /dev/null +++ b/photologue/tests/test_sitemap.py @@ -0,0 +1,33 @@ +import unittest + +from django.conf import settings +from django.test import override_settings + +from .factories import GalleryFactory +from .helpers import PhotologueBaseTest + + +@unittest.skipUnless('django.contrib.sitemaps' in settings.INSTALLED_APPS, + 'Sitemaps not installed in this project, nothing to test.') +@override_settings(ROOT_URLCONF='photologue.tests.test_urls') +class SitemapTest(PhotologueBaseTest): + + def test_get_photo(self): + """Default test setup contains one photo, this should appear in the sitemap.""" + response = self.client.get('/sitemap.xml') + self.assertContains(response, + 'http://example.com/ptests/photo/landscape/' + '2011-12-23') + + def test_get_gallery(self): + """if we add a gallery to the site, we should see both the gallery and + the photo in the sitemap.""" + self.gallery = GalleryFactory(slug='test-gallery') + + response = self.client.get('/sitemap.xml') + self.assertContains(response, + 'http://example.com/ptests/photo/landscape/' + '2011-12-23') + self.assertContains(response, + 'http://example.com/ptests/gallery/test-gallery/' + '2011-12-23') diff --git a/photologue/tests/test_sites.py b/photologue/tests/test_sites.py new file mode 100644 index 0000000..85e1f47 --- /dev/null +++ b/photologue/tests/test_sites.py @@ -0,0 +1,139 @@ +import unittest + +from django.conf import settings +from django.contrib.sites.models import Site +from django.test import TestCase, override_settings + +from .factories import GalleryFactory, PhotoFactory + + +@override_settings(ROOT_URLCONF='photologue.tests.test_urls') +class SitesTest(TestCase): + + def setUp(self): + """ + Create two example sites that we can use to test what gets displayed + where. + """ + super().setUp() + + self.site1, created1 = Site.objects.get_or_create( + domain="example.com", name="example.com") + self.site2, created2 = Site.objects.get_or_create( + domain="example.org", name="example.org") + + with self.settings(PHOTOLOGUE_MULTISITE=True): + # Be explicit about linking Galleries/Photos to Sites.""" + self.gallery1 = GalleryFactory(slug='test-gallery', sites=[self.site1]) + self.gallery2 = GalleryFactory(slug='not-on-site-gallery') + self.photo1 = PhotoFactory(slug='test-photo', sites=[self.site1]) + self.photo2 = PhotoFactory(slug='not-on-site-photo') + self.gallery1.photos.add(self.photo1, self.photo2) + + # I'd like to use factory_boy's mute_signal decorator but that + # will only available once factory_boy 2.4 is released. So long + # we'll have to remove the site association manually + self.photo2.sites.clear() + + def tearDown(self): + super().tearDown() + self.gallery1.delete() + self.gallery2.delete() + self.photo1.delete() + self.photo2.delete() + + def test_basics(self): + """ See if objects were added automatically (by the factory) to the current site. """ + self.assertEqual(list(self.gallery1.sites.all()), [self.site1]) + self.assertEqual(list(self.photo1.sites.all()), [self.site1]) + + def test_auto_add_sites(self): + """ + Objects should not be automatically associated with a particular site when + ``PHOTOLOGUE_MULTISITE`` is ``True``. + """ + + with self.settings(PHOTOLOGUE_MULTISITE=False): + gallery = GalleryFactory() + photo = PhotoFactory() + self.assertEqual(list(gallery.sites.all()), [self.site1]) + self.assertEqual(list(photo.sites.all()), [self.site1]) + + photo.delete() + + with self.settings(PHOTOLOGUE_MULTISITE=True): + gallery = GalleryFactory() + photo = PhotoFactory() + self.assertEqual(list(gallery.sites.all()), []) + self.assertEqual(list(photo.sites.all()), []) + + photo.delete() + + def test_gallery_list(self): + response = self.client.get('/ptests/gallerylist/') + self.assertEqual(list(response.context['object_list']), [self.gallery1]) + + def test_gallery_detail(self): + response = self.client.get('/ptests/gallery/test-gallery/') + self.assertEqual(response.context['object'], self.gallery1) + + response = self.client.get('/ptests/gallery/not-on-site-gallery/') + self.assertEqual(response.status_code, 404) + + def test_photo_list(self): + response = self.client.get('/ptests/photolist/') + self.assertEqual(list(response.context['object_list']), [self.photo1]) + + def test_photo_detail(self): + response = self.client.get('/ptests/photo/test-photo/') + self.assertEqual(response.context['object'], self.photo1) + + response = self.client.get('/ptests/photo/not-on-site-photo/') + self.assertEqual(response.status_code, 404) + + def test_photo_archive(self): + response = self.client.get('/ptests/photo/') + self.assertEqual(list(response.context['object_list']), [self.photo1]) + + def test_photos_in_gallery(self): + """ + Only those photos are supposed to be shown in a gallery that are + also associated with the current site. + """ + response = self.client.get('/ptests/gallery/test-gallery/') + self.assertEqual(list(response.context['object'].public()), [self.photo1]) + + @unittest.skipUnless('django.contrib.sitemaps' in settings.INSTALLED_APPS, + 'Sitemaps not installed in this project, nothing to test.') + def test_sitemap(self): + """A sitemap should only show objects associated with the current site.""" + response = self.client.get('/sitemap.xml') + + # Check photos. + self.assertContains(response, + 'http://example.com/ptests/photo/test-photo/' + '2011-12-23') + self.assertNotContains(response, + 'http://example.com/ptests/photo/not-on-site-photo/' + '2011-12-23') + + # Check galleries. + self.assertContains(response, + 'http://example.com/ptests/gallery/test-gallery/' + '2011-12-23') + self.assertNotContains(response, + 'http://example.com/ptests/gallery/not-on-site-gallery/' + '2011-12-23') + + def test_orphaned_photos(self): + self.assertEqual(list(self.gallery1.orphaned_photos()), [self.photo2]) + + self.gallery2.photos.add(self.photo2) + self.assertEqual(list(self.gallery1.orphaned_photos()), [self.photo2]) + + self.gallery1.sites.clear() + self.assertEqual(list(self.gallery1.orphaned_photos()), [self.photo1, self.photo2]) + + self.photo1.sites.clear() + self.photo2.sites.clear() + self.assertEqual(list(self.gallery1.orphaned_photos()), [self.photo1, self.photo2]) diff --git a/photologue/tests/test_urls.py b/photologue/tests/test_urls.py new file mode 100644 index 0000000..d2d6bef --- /dev/null +++ b/photologue/tests/test_urls.py @@ -0,0 +1,16 @@ +from django.contrib.sitemaps.views import sitemap +from django.urls import include, path + +from ..sitemaps import GallerySitemap, PhotoSitemap + +urlpatterns = [ + path('ptests/', include('photologue.urls', namespace='photologue')), +] + +sitemaps = {'photologue_galleries': GallerySitemap, + 'photologue_photos': PhotoSitemap, + } + +urlpatterns += [ + path('sitemap.xml', sitemap, {'sitemaps': sitemaps}), +] diff --git a/photologue/tests/test_views_gallery.py b/photologue/tests/test_views_gallery.py new file mode 100644 index 0000000..d3afece --- /dev/null +++ b/photologue/tests/test_views_gallery.py @@ -0,0 +1,58 @@ +from django.test import TestCase, override_settings + +from .factories import GalleryFactory + + +@override_settings(ROOT_URLCONF='photologue.tests.test_urls') +class RequestGalleryTest(TestCase): + + def setUp(self): + super().setUp() + self.gallery = GalleryFactory(slug='test-gallery') + + def test_archive_gallery_url_works(self): + response = self.client.get('/ptests/gallery/') + self.assertEqual(response.status_code, 200) + + def test_archive_gallery_empty(self): + """If there are no galleries to show, tell the visitor - don't show a + 404.""" + + self.gallery.is_public = False + self.gallery.save() + + response = self.client.get('/ptests/gallery/') + self.assertEqual(response.status_code, 200) + + self.assertEqual(response.context['latest'].count(), + 0) + + def test_paginated_gallery_url_works(self): + response = self.client.get('/ptests/gallerylist/') + self.assertEqual(response.status_code, 200) + + def test_gallery_works(self): + response = self.client.get('/ptests/gallery/test-gallery/') + self.assertEqual(response.status_code, 200) + + def test_archive_year_gallery_works(self): + response = self.client.get('/ptests/gallery/2011/') + self.assertEqual(response.status_code, 200) + + def test_archive_month_gallery_works(self): + response = self.client.get('/ptests/gallery/2011/12/') + self.assertEqual(response.status_code, 200) + + def test_archive_day_gallery_works(self): + response = self.client.get('/ptests/gallery/2011/12/23/') + self.assertEqual(response.status_code, 200) + + def test_detail_gallery_works(self): + response = self.client.get('/ptests/gallery/2011/12/23/test-gallery/') + self.assertEqual(response.status_code, 200) + + def test_redirect_to_list(self): + """Trivial test - if someone requests the root url of the app + (i.e. /ptests/'), redirect them to the gallery list page.""" + response = self.client.get('/ptests/') + self.assertRedirects(response, '/ptests/gallery/', 301, 200) diff --git a/photologue/tests/test_views_photo.py b/photologue/tests/test_views_photo.py new file mode 100644 index 0000000..b5793f1 --- /dev/null +++ b/photologue/tests/test_views_photo.py @@ -0,0 +1,67 @@ +from django.test import TestCase, override_settings + +from ..models import Photo +from .factories import PhotoFactory + + +@override_settings(ROOT_URLCONF='photologue.tests.test_urls') +class RequestPhotoTest(TestCase): + + def setUp(self): + super().setUp() + self.photo = PhotoFactory(slug='fake-photo') + + def tearDown(self): + super().tearDown() + self.photo.delete() + + def test_archive_photo_url_works(self): + response = self.client.get('/ptests/photo/') + self.assertEqual(response.status_code, 200) + + def test_archive_photo_empty(self): + """If there are no photo to show, tell the visitor - don't show a + 404.""" + + Photo.objects.all().update(is_public=False) + + response = self.client.get('/ptests/photo/') + self.assertEqual(response.status_code, 200) + + self.assertEqual(response.context['latest'].count(), + 0) + + def test_paginated_photo_url_works(self): + response = self.client.get('/ptests/photolist/') + self.assertEqual(response.status_code, 200) + + def test_photo_works(self): + response = self.client.get('/ptests/photo/fake-photo/') + self.assertEqual(response.status_code, 200) + + def test_archive_year_photo_works(self): + response = self.client.get('/ptests/photo/2011/') + self.assertEqual(response.status_code, 200) + + def test_archive_month_photo_works(self): + response = self.client.get('/ptests/photo/2011/12/') + self.assertEqual(response.status_code, 200) + + def test_archive_day_photo_works(self): + response = self.client.get('/ptests/photo/2011/12/23/') + self.assertEqual(response.status_code, 200) + + def test_detail_photo_works(self): + response = self.client.get('/ptests/photo/2011/12/23/fake-photo/') + self.assertEqual(response.status_code, 200) + + def test_detail_photo_xss(self): + """Check that the default templates handle XSS.""" + self.photo.title = '' + self.photo.caption = '' + self.photo.save() + response = self.client.get('/ptests/photo/2011/12/23/fake-photo/') + self.assertContains(response, 'Photologue Demo - <img src=x onerror=alert("title")>') + self.assertNotContains(response, '') + self.assertContains(response, '<img src=x onerror=alert(origin)>') + self.assertNotContains(response, '') diff --git a/photologue/tests/test_zipupload.py b/photologue/tests/test_zipupload.py new file mode 100644 index 0000000..186688e --- /dev/null +++ b/photologue/tests/test_zipupload.py @@ -0,0 +1,211 @@ +import copy + +from django import VERSION +from django.contrib.auth.models import User +from django.test import TestCase + +from ..models import Gallery, Photo +from .factories import (IGNORED_FILES_ZIP_PATH, LANDSCAPE_IMAGE_PATH, SAMPLE_NOT_IMAGE_ZIP_PATH, SAMPLE_ZIP_PATH, + GalleryFactory, PhotoFactory) + + +class GalleryUploadTest(TestCase): + + """Testing the admin page that allows users to upload zips.""" + + def setUp(self): + super().setUp() + user = User.objects.create_user('john.doe', + 'john.doe@example.com', + 'secret') + user.is_staff = True + user.save() + self.assertTrue(self.client.login(username='john.doe', password='secret')) + + self.zip_file = open(SAMPLE_ZIP_PATH, mode='rb') + + self.sample_form_data = {'zip_file': self.zip_file, + 'title': 'This is a test title'} + + def tearDown(self): + super().tearDown() + self.zip_file.close() + for photo in Photo.objects.all(): + photo.delete() + + def test_get(self): + """We can get the custom admin page.""" + + response = self.client.get('/admin/photologue/photo/upload_zip/') + self.assertEqual(response.status_code, 200) + self.assertTemplateUsed(response, 'admin/photologue/photo/upload_zip.html') + + self.assertContains(response, 'Upload a zip archive of photos') + + def test_breadcrumbs(self): + """Quick check that the breadcrumbs are generated correctly.""" + + response = self.client.get('/admin/photologue/photo/upload_zip/') + self.assertContains( + response, """""", html=True) + + def test_missing_fields(self): + """Missing fields mean the form is redisplayed with errors.""" + + test_data = copy.copy(self.sample_form_data) + del test_data['zip_file'] + response = self.client.post('/admin/photologue/photo/upload_zip/', test_data) + self.assertEqual(response.status_code, 200) + self.assertTrue(response.context['form'].errors) + + def test_good_data(self): + """Upload a zip with a single file it it: 'sample.jpg'. + It gets assigned to a newly created gallery 'Test'.""" + + test_data = copy.copy(self.sample_form_data) + response = self.client.post('/admin/photologue/photo/upload_zip/', test_data) + # The redirect Location has changed in Django 1.9 - it used to be an absolute URI, now it returns + # a relative one. + if VERSION[0] == 1 and VERSION[1] <= 8: + location = 'http://testserver/admin/photologue/photo/' + else: + location = '..' + + self.assertEqual(response['Location'], location) + + self.assertQuerysetEqual(Gallery.objects.all(), + [''], + transform=repr) + self.assertQuerysetEqual(Photo.objects.all(), + [''], + transform=repr) + + # The photo is attached to the gallery. + gallery = Gallery.objects.get(title='This is a test title') + self.assertQuerysetEqual(gallery.photos.all(), + [''], + transform=repr) + + def test_duplicate_gallery(self): + """If we try to create a Gallery with a title that duplicates an existing title, refuse to load.""" + + GalleryFactory(title='This is a test title') + + test_data = copy.copy(self.sample_form_data) + response = self.client.post('/admin/photologue/photo/upload_zip/', test_data) + self.assertEqual(response.status_code, 200) + self.assertTrue(response.context['form']['title'].errors) + + def test_title_or_gallery(self): + """We should supply either a title field or a gallery.""" + + test_data = copy.copy(self.sample_form_data) + del test_data['title'] + response = self.client.post('/admin/photologue/photo/upload_zip/', test_data) + self.assertEqual(list(response.context['form'].non_field_errors()), + ['Select an existing gallery, or enter a title for a new gallery.']) + + def test_not_image(self): + """A zip with a file of the wrong format (.txt). + That file gets ignored.""" + + test_data = copy.copy(self.sample_form_data) + with open(SAMPLE_NOT_IMAGE_ZIP_PATH, mode='rb') as f: + test_data['zip_file'] = f + response = self.client.post('/admin/photologue/photo/upload_zip/', test_data) + self.assertEqual(response.status_code, 302) + + self.assertQuerysetEqual(Gallery.objects.all(), + [''], + transform=repr) + self.assertQuerysetEqual(Photo.objects.all(), + [''], + transform=repr) + + def test_ignored(self): + """Ignore anything that does not look like a image file. + E.g. hidden files, and folders. + We have two images: one in the top level of the zip, and one in a subfolder. + The second one gets ignored - we only process files at the zip root.""" + + test_data = copy.copy(self.sample_form_data) + with open(IGNORED_FILES_ZIP_PATH, mode='rb') as f: + test_data['zip_file'] = f + response = self.client.post('/admin/photologue/photo/upload_zip/', test_data) + self.assertEqual(response.status_code, 302) + + self.assertQuerysetEqual(Gallery.objects.all(), + [''], + transform=repr) + self.assertQuerysetEqual(Photo.objects.all(), + [''], + transform=repr) + + def test_existing_gallery(self): + """Add the photos in the zip to an existing gallery.""" + + existing_gallery = GalleryFactory(title='Existing') + + test_data = copy.copy(self.sample_form_data) + test_data['gallery'] = existing_gallery.id + del test_data['title'] + response = self.client.post('/admin/photologue/photo/upload_zip/', test_data) + self.assertEqual(response.status_code, 302) + + self.assertQuerysetEqual(Gallery.objects.all(), + [''], + transform=repr) + self.assertQuerysetEqual(Photo.objects.all(), + [''], + transform=repr) + + # The photo is attached to the existing gallery. + self.assertQuerysetEqual(existing_gallery.photos.all(), + [''], + transform=repr) + + def test_existing_gallery_custom_title(self): + """Add the photos in the zip to an existing gallery, but specify a + custom title for the photos.""" + + existing_gallery = GalleryFactory(title='Existing') + + test_data = copy.copy(self.sample_form_data) + test_data['gallery'] = existing_gallery.id + test_data['title'] = 'Custom title' + response = self.client.post('/admin/photologue/photo/upload_zip/', test_data) + self.assertEqual(response.status_code, 302) + + self.assertQuerysetEqual(Photo.objects.all(), + [''], + transform=repr) + + def test_duplicate_slug(self): + """Uploading a zip, but a photo already exists with the target slug.""" + + PhotoFactory(title='This is a test title 1') + PhotoFactory(title='This is a test title 2') + + test_data = copy.copy(self.sample_form_data) + response = self.client.post('/admin/photologue/photo/upload_zip/', test_data) + self.assertEqual(response.status_code, 302) + + self.assertQuerysetEqual(Photo.objects.all(), + [ + '', + '', + '' + ], + ordered=False, + transform=repr) + + def test_bad_zip(self): + """Supplied file is not a zip file - tell user.""" + + test_data = copy.copy(self.sample_form_data) + with open(LANDSCAPE_IMAGE_PATH, mode='rb') as f: + test_data['zip_file'] = f + response = self.client.post('/admin/photologue/photo/upload_zip/', test_data) + self.assertEqual(response.status_code, 200) + self.assertTrue(response.context['form']['zip_file'].errors) diff --git a/photologue/urls.py b/photologue/urls.py new file mode 100644 index 0000000..419ef7c --- /dev/null +++ b/photologue/urls.py @@ -0,0 +1,68 @@ +from django.urls import path, re_path, reverse_lazy +from django.views.generic import RedirectView + +from .views import (GalleryArchiveIndexView, GalleryDateDetailView, GalleryDayArchiveView, GalleryDetailView, + GalleryListView, GalleryMonthArchiveView, GalleryYearArchiveView, PhotoArchiveIndexView, + PhotoDateDetailView, PhotoDayArchiveView, PhotoDetailView, PhotoListView, PhotoMonthArchiveView, + PhotoYearArchiveView) + +"""NOTE: the url names are changing. In the long term, I want to remove the 'pl-' +prefix on all urls, and instead rely on an application namespace 'photologue'. + +At the same time, I want to change some URL patterns, e.g. for pagination. Changing the urls +twice within a few releases, could be confusing, so instead I am updating URLs bit by bit. + +The new style will coexist with the existing 'pl-' prefix for a couple of releases. + +""" + +app_name = 'photologue' +urlpatterns = [ + re_path(r'^gallery/(?P\d{4})/(?P[0-9]{2})/(?P\w{1,2})/(?P[\-\d\w]+)/$', + GalleryDateDetailView.as_view(month_format='%m'), + name='gallery-detail'), + re_path(r'^gallery/(?P\d{4})/(?P[0-9]{2})/(?P\w{1,2})/$', + GalleryDayArchiveView.as_view(month_format='%m'), + name='gallery-archive-day'), + re_path(r'^gallery/(?P\d{4})/(?P[0-9]{2})/$', + GalleryMonthArchiveView.as_view(month_format='%m'), + name='gallery-archive-month'), + re_path(r'^gallery/(?P\d{4})/$', + GalleryYearArchiveView.as_view(), + name='pl-gallery-archive-year'), + path('gallery/', + GalleryArchiveIndexView.as_view(), + name='pl-gallery-archive'), + path('', + RedirectView.as_view( + url=reverse_lazy('photologue:pl-gallery-archive'), permanent=True), + name='pl-photologue-root'), + re_path(r'^gallery/(?P[\-\d\w]+)/$', + GalleryDetailView.as_view(), name='pl-gallery'), + path('gallerylist/', + GalleryListView.as_view(), + name='gallery-list'), + + re_path(r'^photo/(?P\d{4})/(?P[0-9]{2})/(?P\w{1,2})/(?P[\-\d\w]+)/$', + PhotoDateDetailView.as_view(month_format='%m'), + name='photo-detail'), + re_path(r'^photo/(?P\d{4})/(?P[0-9]{2})/(?P\w{1,2})/$', + PhotoDayArchiveView.as_view(month_format='%m'), + name='photo-archive-day'), + re_path(r'^photo/(?P\d{4})/(?P[0-9]{2})/$', + PhotoMonthArchiveView.as_view(month_format='%m'), + name='photo-archive-month'), + re_path(r'^photo/(?P\d{4})/$', + PhotoYearArchiveView.as_view(), + name='pl-photo-archive-year'), + path('photo/', + PhotoArchiveIndexView.as_view(), + name='pl-photo-archive'), + + re_path(r'^photo/(?P[\-\d\w]+)/$', + PhotoDetailView.as_view(), + name='pl-photo'), + path('photolist/', + PhotoListView.as_view(), + name='photo-list'), +] diff --git a/photologue/utils/__init__.py b/photologue/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/photologue/utils/reflection.py b/photologue/utils/reflection.py new file mode 100644 index 0000000..4d836e7 --- /dev/null +++ b/photologue/utils/reflection.py @@ -0,0 +1,91 @@ +""" Function for generating web 2.0 style image reflection effects. + +Copyright (c) 2007, Justin C. Driscoll +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. Neither the name of reflection.py nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +""" + +try: + import Image + import ImageColor +except ImportError: + try: + from PIL import Image, ImageColor + except ImportError: + raise ImportError("The Python Imaging Library was not found.") + + +def add_reflection(im, bgcolor="#00000", amount=0.4, opacity=0.6): + """ Returns the supplied PIL Image (im) with a reflection effect + + bgcolor The background color of the reflection gradient + amount The height of the reflection as a percentage of the orignal image + opacity The initial opacity of the reflection gradient + + Originally written for the Photologue image management system for Django + and Based on the original concept by Bernd Schlapsi + + """ + # convert bgcolor string to rgb value + background_color = ImageColor.getrgb(bgcolor) + + # copy orignial image and flip the orientation + reflection = im.copy().transpose(Image.FLIP_TOP_BOTTOM) + + # create a new image filled with the bgcolor the same size + background = Image.new("RGB", im.size, background_color) + + # calculate our alpha mask + start = int(255 - (255 * opacity)) # The start of our gradient + steps = int(255 * amount) # the number of intermedite values + increment = (255 - start) / float(steps) + mask = Image.new('L', (1, 255)) + for y in range(255): + if y < steps: + val = int(y * increment + start) + else: + val = 255 + mask.putpixel((0, y), val) + alpha_mask = mask.resize(im.size) + + # merge the reflection onto our background color using the alpha mask + reflection = Image.composite(background, reflection, alpha_mask) + + # crop the reflection + reflection_height = int(im.size[1] * amount) + reflection = reflection.crop((0, 0, im.size[0], reflection_height)) + + # create new image sized to hold both the original image and the reflection + composite = Image.new("RGB", (im.size[0], im.size[1] + reflection_height), background_color) + + # paste the orignal image and the reflection into the composite image + composite.paste(im, (0, 0)) + composite.paste(reflection, (0, im.size[1])) + + # return the image complete with reflection effect + return composite diff --git a/photologue/utils/watermark.py b/photologue/utils/watermark.py new file mode 100644 index 0000000..3c3d769 --- /dev/null +++ b/photologue/utils/watermark.py @@ -0,0 +1,55 @@ +""" Function for applying watermarks to images. + +Original found here: +http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/362879 + +""" + +try: + import Image + import ImageEnhance +except ImportError: + try: + from PIL import Image, ImageEnhance + except ImportError: + raise ImportError("The Python Imaging Library was not found.") + + +def reduce_opacity(im, opacity): + """Returns an image with reduced opacity.""" + assert opacity >= 0 and opacity <= 1 + if im.mode != 'RGBA': + im = im.convert('RGBA') + else: + im = im.copy() + alpha = im.split()[3] + alpha = ImageEnhance.Brightness(alpha).enhance(opacity) + im.putalpha(alpha) + return im + + +def apply_watermark(im, mark, position, opacity=1): + """Adds a watermark to an image.""" + if opacity < 1: + mark = reduce_opacity(mark, opacity) + if im.mode != 'RGBA': + im = im.convert('RGBA') + # create a transparent layer the size of the image and draw the + # watermark in that layer. + layer = Image.new('RGBA', im.size, (0, 0, 0, 0)) + if position == 'tile': + for y in range(0, im.size[1], mark.size[1]): + for x in range(0, im.size[0], mark.size[0]): + layer.paste(mark, (x, y)) + elif position == 'scale': + # scale, but preserve the aspect ratio + ratio = min( + float(im.size[0]) / mark.size[0], float(im.size[1]) / mark.size[1]) + w = int(mark.size[0] * ratio) + h = int(mark.size[1] * ratio) + mark = mark.resize((w, h)) + layer.paste(mark, (int((im.size[0] - w) / 2), int((im.size[1] - h) / 2))) + else: + layer.paste(mark, position) + # composite the watermark with the layer + return Image.composite(layer, im, layer) diff --git a/photologue/views.py b/photologue/views.py new file mode 100644 index 0000000..6c68c8d --- /dev/null +++ b/photologue/views.py @@ -0,0 +1,80 @@ +from django.views.generic.dates import (ArchiveIndexView, DateDetailView, DayArchiveView, MonthArchiveView, + YearArchiveView) +from django.views.generic.detail import DetailView +from django.views.generic.list import ListView + +from .models import Gallery, Photo + +# Gallery views. + + +class GalleryListView(ListView): + queryset = Gallery.objects.on_site().is_public() + paginate_by = 20 + + +class GalleryDetailView(DetailView): + queryset = Gallery.objects.on_site().is_public() + + +class GalleryDateView: + queryset = Gallery.objects.on_site().is_public() + date_field = 'date_added' + allow_empty = True + + +class GalleryDateDetailView(GalleryDateView, DateDetailView): + pass + + +class GalleryArchiveIndexView(GalleryDateView, ArchiveIndexView): + pass + + +class GalleryDayArchiveView(GalleryDateView, DayArchiveView): + pass + + +class GalleryMonthArchiveView(GalleryDateView, MonthArchiveView): + pass + + +class GalleryYearArchiveView(GalleryDateView, YearArchiveView): + make_object_list = True + +# Photo views. + + +class PhotoListView(ListView): + queryset = Photo.objects.on_site().is_public() + paginate_by = 20 + + +class PhotoDetailView(DetailView): + queryset = Photo.objects.on_site().is_public() + + +class PhotoDateView: + queryset = Photo.objects.on_site().is_public() + date_field = 'date_added' + allow_empty = True + + +class PhotoDateDetailView(PhotoDateView, DateDetailView): + pass + + +class PhotoArchiveIndexView(PhotoDateView, ArchiveIndexView): + pass + + +class PhotoDayArchiveView(PhotoDateView, DayArchiveView): + pass + + +class PhotoMonthArchiveView(PhotoDateView, MonthArchiveView): + pass + + +class PhotoYearArchiveView(PhotoDateView, YearArchiveView): + make_object_list = True diff --git a/requirements.txt b/requirements.txt index 165ed24..e217537 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,5 @@ django<5.0 django-markdownx -django-photologue django-braces django-app-namespace-template-loader ox @@ -8,3 +7,6 @@ gunicorn django_extensions psycopg2-binary lxml +ExifRead>=3 +django-sortedm2m>=3.1.1 +Pillow>=9