diff --git a/.bumpversion.toml b/.bumpversion.toml new file mode 100755 index 000000000..f5f14423c --- /dev/null +++ b/.bumpversion.toml @@ -0,0 +1,35 @@ +[tool.bumpversion] +current_version = "3.4.4+pbs.1" +commit = false +tag = false +parse = """(?x) + (?P0|[1-9]\\d*)\\. + (?P0|[1-9]\\d*)\\. + (?P0|[1-9]\\d*) + \\+pbs\\. + (?P0|[1-9]\\d*) + (?: + \\.(?Pdev) + \\.g[0-9a-f]{7,40} + \\.\\d{8} + )? +""" + +serialize = [ + "{major}.{minor}.{patch}+pbs.{pbs}.{prekind}.g{$GITHUB_SHA}.{now:%Y%m%d}", + "{major}.{minor}.{patch}+pbs.{pbs}" +] + + +[tool.bumpversion.parts.prekind] +values = [ + "", + "dev" +] +optional_value = "" + + +[[tool.bumpversion.files]] +filename = "filer/__init__.py" +search = "{current_version}" +replace = "{new_version}" diff --git a/.gitignore b/.gitignore index eca0e10e0..4e08979de 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,7 @@ .installed.cfg bin develop-eggs -dist +/dist downloads eggs parts @@ -14,6 +14,7 @@ tmp *.egg .DS_Store .sass-cache +node_modules .project .pydevproject .settings diff --git a/Makefile b/Makefile index 42b7ab51c..7202313c9 100644 --- a/Makefile +++ b/Makefile @@ -3,32 +3,68 @@ help: ## This help. @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n\nTargets:\n"} /^[a-zA-Z_-]+:.*?##/ { printf " \033[36m%-10s\033[0m %s\n", $$1, $$2 }' $(MAKEFILE_LIST) .DEFAULT_GOAL := help +.PHONY: bump-pbs bump-prekind build publish-nexus publish-nexus-dry-run + IMAGE_NAME := django-filer-test CONTAINER_NAME := django-filer-test-run SHELL:=/bin/bash -## Build the test Docker image -test-build: +test-build: ## Build the test Docker image docker build -f Dockerfile.test -t $(IMAGE_NAME) . -## Run unit tests in a Docker container -test: +test: ## Run unit tests in a Docker container @if [ -z "$$(docker images -q $(IMAGE_NAME) 2>/dev/null)" ]; then \ echo "Image not found, building..."; \ $(MAKE) test-build; \ fi docker run --rm --name $(CONTAINER_NAME) $(IMAGE_NAME) -## Run tests with verbose output and stop on first failure -test-verbose: test-build +test-verbose: test-build ## Run tests with verbose output and stop on first failure docker run --rm --name $(CONTAINER_NAME) $(IMAGE_NAME) \ pytest -vx --ds=filer.test_settings --pyargs filer.tests -## Open a shell in the test container (useful for debugging) -test-shell: test-build +test-shell: test-build ## Open a shell in the test container (useful for debugging) docker run --rm -it --name $(CONTAINER_NAME) $(IMAGE_NAME) /bin/bash -## Remove the test Docker image -test-clean: +test-clean: ## Remove the test Docker image -docker rmi $(IMAGE_NAME) + +bump-pbs: ## Bump PBS number: 3.4.4+pbs.3 -> 3.4.4+pbs.4 + bump-my-version bump --allow-dirty pbs + +bump-prekind: ## Bump prekind dev version: 3.4.4+pbs.3 -> 3.4.4+pbs.3.dev.g.YYYYMMDD. Pass sha= to override. + @current=$$(grep "^__version__" filer/__init__.py | sed "s/^__version__ = '//;s/'.*//"); \ + sha="$${sha:-$$(git rev-parse --short=8 HEAD)}"; \ + sha8="$${sha:0:8}"; \ + if echo "$$current" | grep -q '\.dev\.'; then \ + current_sha=$$(echo "$$current" | sed -nE "s/.*\.dev\.g([0-9a-f]{7,40})\.[0-9]{8}/\1/p"); \ + current_sha8="$${current_sha:0:8}"; \ + if [ "$$current_sha8" = "$$sha8" ]; then \ + echo "Nothing to bump: '$$current' already targets commit '$$sha8'. Create a new commit first or run 'make bump-pbs'."; \ + exit 1; \ + fi; \ + base=$$(echo "$$current" | sed -E "s/\.dev\.g[0-9a-f]+\.[0-9]{8}$$//"); \ + new_version="$$base.dev.g$$sha8.$$(date +%Y%m%d)"; \ + else \ + base="$$current"; \ + new_version="$$base.dev.g$$sha8.$$(date +%Y%m%d)"; \ + fi; \ + echo "Bumping: $$current -> $$new_version"; \ + sed -i.bak "s/__version__ = '$$current'/__version__ = '$$new_version'/" filer/__init__.py && rm -f filer/__init__.py.bak; \ + sed -i.bak -E "s/^current_version = \"[^\"]+\"/current_version = \"$$new_version\"/" .bumpversion.toml && rm -f .bumpversion.toml.bak + + +build: ## Build distribution packages (sdist and wheel) + rm -rf dist/ build/ *.egg-info + python3 -m pip install --upgrade --break-system-packages build + python3 -m build + +publish-nexus: build ## Publish to Nexus using ~/.pypirc config + python3 -m pip install --upgrade --break-system-packages twine + python3 -m twine upload -r nexus dist/* + +publish-nexus-dry-run: build ## Validate packages ready for Nexus (without uploading) + python3 -m pip install --upgrade --break-system-packages twine + python3 -m twine check dist/* + diff --git a/README_PBS.md b/README_PBS.md new file mode 100644 index 000000000..40ba51006 --- /dev/null +++ b/README_PBS.md @@ -0,0 +1,150 @@ +# PBS Fork – Developer Guide + +## Versioning Scheme + +This fork uses a PBS-specific versioning scheme: + +``` ++pbs. +``` + +Example: `3.4.4+pbs.1`, `3.4.4+pbs.2` + +Development (pre-release) versions append a dev suffix: + +``` ++pbs..dev.g.YYYYMMDD +``` + +Example: `3.4.4+pbs.1.dev.g1a2b3c4d.20260617` + +The version is stored in `filer/__init__.py` and read dynamically by `pyproject.toml`. + +--- + +## Makefile Targets + +Run `make help` to see all available targets. Summary: + +| Target | Description | +|--------|-------------| +| `make help` | Show all available targets | +| `make test-build` | Build the test Docker image | +| `make test` | Run unit tests in a Docker container (builds image if missing) | +| `make test-verbose` | Run tests with verbose output, stop on first failure | +| `make test-shell` | Open a shell in the test container (for debugging) | +| `make test-clean` | Remove the test Docker image | +| `make bump-pbs` | Bump the PBS version number (e.g. `+pbs.1` → `+pbs.2`) | +| `make bump-prekind` | Create a dev pre-release version from the current commit | +| `make build` | Build sdist and wheel packages into `dist/` | +| `make publish-nexus` | Build and upload packages to Nexus | +| `make publish-nexus-dry-run` | Build and validate packages without uploading | + +--- + +## How to Publish a New Version + +### Prerequisites + +- Python 3 installed +- `bump-my-version` installed (`pip install bump-my-version`) +- `~/.pypirc` configured with a `[nexus]` section containing your repository URL and credentials + +### Steps + +#### 1. Run tests + +```bash +make test +``` + +Ensure all tests pass before proceeding. + +#### 2. Bump the PBS version + +```bash +make bump-pbs +``` + +This increments the PBS number (e.g. `3.4.4+pbs.1` → `3.4.4+pbs.2`) in both `filer/__init__.py` and `.bumpversion.toml`. + +#### 3. Commit and push + +```bash +git add filer/__init__.py .bumpversion.toml +git commit -m "Bump to $(grep __version__ filer/__init__.py | sed "s/.*'//;s/'.*//")" +git push +``` + +#### 4. Publish to Nexus + +```bash +make publish-nexus +``` + +This will: +1. Clean previous build artifacts +2. Build source distribution and wheel (`python3 -m build`) +3. Upload to Nexus using `twine` with the `[nexus]` section from `~/.pypirc` + +#### 5. (Optional) Validate without uploading + +```bash +make publish-nexus-dry-run +``` + +Runs `twine check` on the built packages to verify they are well-formed. + +--- + +## Publishing a Dev (Pre-release) Version + +Use this when you need to test unreleased changes without a formal PBS bump: + +```bash +make bump-prekind +``` + +This creates a version like `3.4.4+pbs.1.dev.g1a2b3c4d.20260617` based on the current HEAD commit and date. + +You can override the commit SHA: + +```bash +make bump-prekind sha=abc12345 +``` + +Then publish normally: + +```bash +make publish-nexus +``` + +> **Note:** To bump again on the same commit, you must first run `make bump-pbs` to move to the next PBS number. + +--- + +## Publishing via GitHub Actions (Bento3) + +You can also publish a new version using the **bento3** GitHub Actions workflow: + +🔗 [publish_django_filer.yml](https://github.com/pbs-digital/bento3/actions/workflows/publish_django_filer.yml) + +Trigger the workflow manually from the Actions tab. This is the recommended approach for CI-driven releases. + +--- + +## `~/.pypirc` Configuration (for local publishing) + +Ensure your `~/.pypirc` contains a `[nexus]` entry: + +```ini +[distutils] +index-servers = + nexus + +[nexus] +repository = https://your-nexus-instance/repository/pypi-hosted/ +username = your-username +password = your-password-or-token +``` + diff --git a/UPSTREAM_MERGE_FIXES.md b/UPSTREAM_MERGE_FIXES.md new file mode 100644 index 000000000..237a27d2e --- /dev/null +++ b/UPSTREAM_MERGE_FIXES.md @@ -0,0 +1,207 @@ +# Upstream Merge Fix Progress + +## Overview + +**Upstream source:** `https://github.com/django-cms/django-filer` (master branch, v3.4.4) +**Fork divergence:** Forked at tag `0.9` (commit `a9364960`), ~790 PBS vs ~1,977 upstream commits, 603 files changed. +**Target:** Django 5.1 / Python 3.12+ + +### Test Results Timeline + +| Stage | Failed | Passed | Skipped | +|-------|--------|--------|---------| +| Pre-merge (PBS baseline) | 0 | 153 | 68 | +| After upstream merge | 73 | ~80 | 68 | +| After Session 1 fixes | 67 | 86 | 68 | +| After Session 2 fixes | 59 | 94 | 68 | +| **After all fixes (final)** | **0** | **153** | **68** | + +--- + +## Fixes Applied + +### 1. `setup.py` — Build-time import error (GHA blocker) + +- **Problem:** `__import__('filer').__version__` fails because Django isn't installed in the build environment +- **Fix:** Replaced with regex-based `get_version()` that reads `filer/__init__.py` without importing +- **Also:** Removed deprecated `setuptools.command.test` references and `test_suite`/`tests_require` +- **Code:** + ```python + def get_version(): + """Read version from filer/__init__.py without importing the package.""" + init_py = os.path.join(os.path.dirname(__file__), 'filer', '__init__.py') + with open(init_py) as f: + match = re.search(r"^__version__\s*=\s*['\"]([^'\"]+)['\"]", f.read(), re.M) + if not match: + raise RuntimeError("Cannot find __version__ in filer/__init__.py") + return match.group(1) + ``` + +### 2. `filer/__init__.py` — PEP 440 version + +- **Problem:** `3.5.0.pbs.1` is invalid per PEP 440 +- **Fix:** Changed to `3.5.0+pbs.1` (local version identifier) + +### 3. `filer/models/abstract.py` — VILImage import + +- **Problem:** `from easy_thumbnails.VIL import Image` fails without `reportlab` +- **Fix:** Wrapped in try/except, set `VILImage = None` as fallback +- **Code:** + ```python + try: + from easy_thumbnails.VIL import Image as VILImage + except (ImportError, ModuleNotFoundError): + VILImage = None + ``` + +### 4. `filer/admin/fileadmin.py` — `display_canonical` FieldError + +- **Problem:** `get_readonly_fields` returned only model field names for restricted/core files, but fieldsets contain `display_canonical` (an admin method, not a model field) +- **Fix:** Appended `'display_canonical'` to the readonly fields list in that code path +- **Error:** `FieldError: Unknown field(s) (display_canonical) specified for File` + +### 5. `filer/templates/admin/filer/submit_line.html` — Delete URL with empty pk + +- **Problem:** `{% url opts|admin_urlname:'delete' obj.pk %}` failed when `obj.pk` was empty +- **Fix:** Changed to `original.pk` and added `and original.pk` guard + +### 6. `filer/admin/folderadmin.py` — Multiple fixes + +#### 6a. `destination_folders` AJAX view +- **Problem:** `NoReverseMatch: 'filer-destination_folders' not found` — the fancytree folder picker widget needed this URL +- **Fix:** Added AJAX view and URL pattern to `FolderAdmin.get_urls()` + +#### 6b. `move_file_to_clipboard` signature mismatch +- **Problem:** Both call sites passed wrong number of arguments +- **Fix:** Added missing `request` argument at both call sites + +#### 6c. `KeyError: 'name'` in folder form clean +- **Problem:** Folder form clean method assumed `'name'` was always in `cleaned_data` +- **Fix:** Added guard `if 'name' not in cleaned_data: return cleaned_data` + +#### 6d. `exclude` tuple incomplete +- **Problem:** Upstream had `exclude = ('parent',)` but PBS needs `('parent', 'owner', 'folder_type')` +- **Fix:** Restored full PBS exclude tuple + +#### 6e. `get_form()` — PBS field visibility logic +- **Problem:** Upstream `get_form()` didn't handle PBS-specific dynamic field visibility +- **Fix:** Restored full PBS logic: + - Hide `site`/`shared` for child folders and core folders + - Only show `shared` to superusers + - Pop `restricted` for add view + - Set `owner`/`parent` in clean method + +#### 6f. `_move_files_and_folders_impl` — MPTT corruption +- **Problem:** Upstream used bulk `update()` which bypasses MPTT tree updates and model signals +- **Fix:** Changed to individual `save()` calls to trigger MPTT tree recalculation + +#### 6g. `move_files_and_folders()` — PBS validation +- **Problem:** PBS site validation checks were missing from upstream's move implementation +- **Fix:** Restored: + - Root folder move prevention + - Site consistency checks (all moved items must belong to same site as destination) +- **Code:** + ```python + # PBS: prevent moving root folders + if folders_queryset.filter(parent=None).exists(): + messages.error(request, "To prevent potential problems, users " + "are not allowed to move root folders.") + return + # PBS: site consistency checks + sites_from_folders = \ + set(folders_queryset.values_list('site_id', flat=True)) | \ + set(files_queryset.exclude(folder__isnull=True).\ + values_list('folder__site_id', flat=True)) + if sites_from_folders and None in sites_from_folders: + messages.error(request, "Some of the selected files/folders " + "do not belong to any site.") + return + ``` + +#### 6h. `log_deletion` deprecation +- **Problem:** Dead `else` branches for Django < 5.1; bug where `files_queryset` was logged instead of `folders_queryset` +- **Fix:** Removed dead branches, fixed queryset reference + +### 7. `filer/server/backends/` — Server backend fixes (3 files) + +- **Files:** `default.py`, `nginx.py`, `xsendfile.py` +- **Problem 1:** `filer_file.mime_type` — `filer_file` is a `FieldFile` (not the `File` model), so it has no `mime_type` attribute +- **Fix 1:** Added `mimetypes.guess_type()` fallback +- **Problem 2:** `file_obj=filer_file.file` — `filer_file` is already the `FieldFile`, `.file` is the raw Python file object +- **Fix 2:** Changed to `file_obj=filer_file` +- **Error:** `AttributeError: 'MultiStorageFieldFile' has no attribute 'mime_type'` + +### 8. `filer/admin/views.py` — NewFolderForm missing `site` field + +- **Problem:** Form only had `fields = ('name',)`, ignoring PBS `site` field from POST data +- **Fix:** Added `'site'` to form fields: `fields = ('name', 'site')` + +### 9. `filer/templatetags/filermedia.py` — Deleted by upstream merge + +- **Problem:** Upstream deleted `filermedia.py` but 8+ templates still reference `{% load filermedia %}` +- **Fix:** Restored file with `filer_staticmedia_prefix` simple tag +- **Error:** `TemplateSyntaxError: 'filermedia' is not a registered tag library` + +### 10. `filer/admin/clipboardadmin.py` — Clipboard not created on upload + +- **Problem:** Upstream commented out `Clipboard.objects.get_or_create(user=request.user)` in `ajax_upload` +- **Fix:** Restored the get_or_create call so clipboard is created during upload +- **Error:** `Clipboard.DoesNotExist` + +### 11. `filer/tests/admin.py` — Test compatibility fixes + +- **Clipboard access:** Replaced `self.superuser.filer_clipboard` with `Clipboard.objects.get(user=self.superuser)` +- **Return values:** Removed `return folders, files` from test methods + +### 12. `filer/utils/cdn.py` — `modified_at` None guard + +- **Problem:** `get_cdn_url()` crashes with `TypeError: unsupported operand type(s) for +: 'NoneType' and 'datetime.timedelta'` when `file_obj.modified_at` is `None` +- **Fix:** Added early return `if file_obj.modified_at is None: return url` before the timedelta arithmetic +- **Error:** `TypeError: unsupported operand type(s) for +: 'NoneType' and 'datetime.timedelta'` + +--- + +## PBS-Specific Features Preserved + +These features exist in the PBS fork but not in upstream django-filer: + +| Feature | Description | +|---------|-------------| +| **Trash / Soft-delete** | Files/folders are soft-deleted to trash before permanent deletion | +| **Site-based permissions** | Folders belong to Django sites; users have site-scoped access | +| **Folder types** | `CORE_FOLDER`, `SITE_FOLDER` — restricts operations on system folders | +| **Restricted flag** | Files/folders can be marked restricted; cascades to children | +| **Shared folders** | M2M relationship allowing folders shared across sites | +| **CDN invalidation** | URL hashing and CDN cache invalidation on file changes | +| **S3/Botocore storage** | Multi-storage backend with S3 support | +| **Clipboard model** | Per-user clipboard for file operations | +| **Folder-affects-URL** | Hash-based filenames tied to folder structure | + +--- + +## Test Results — ✅ All Passing + +**Final result: 153 passed, 68 skipped, 0 failed** (matches PBS baseline) + +All 59 previously failing tests have been resolved. The upstream merge is fully compatible with the PBS test suite. + +--- + +## Files Modified (Summary) + +| File | Type of Change | +|------|---------------| +| `setup.py` | Build fix (regex version reader) | +| `filer/__init__.py` | PEP 440 version fix | +| `filer/models/abstract.py` | Import guard for VILImage | +| `filer/admin/fileadmin.py` | Readonly fields fix | +| `filer/admin/folderadmin.py` | 8 separate fixes (AJAX view, move/copy validation, MPTT, field visibility) | +| `filer/admin/views.py` | NewFolderForm site field | +| `filer/admin/clipboardadmin.py` | Clipboard creation restored | +| `filer/server/backends/default.py` | mime_type + file_obj fixes | +| `filer/server/backends/nginx.py` | mime_type + file_obj fixes | +| `filer/server/backends/xsendfile.py` | mime_type + file_obj fixes | +| `filer/templatetags/filermedia.py` | Restored deleted file | +| `filer/templates/admin/filer/submit_line.html` | Delete URL pk guard | +| `filer/tests/admin.py` | Test compatibility fixes | +| `filer/utils/cdn.py` | `modified_at` None guard for CDN URL | diff --git a/conftest.py b/conftest.py index 2091456e0..a91cddad2 100644 --- a/conftest.py +++ b/conftest.py @@ -3,5 +3,7 @@ collect_ignore = [ os.path.join(os.path.dirname(__file__), "filer", "tests", "utils"), os.path.join(os.path.dirname(__file__), "filer", "tests", "__init__.py"), + os.path.join(os.path.dirname(__file__), "filer", "contrib"), + os.path.join(os.path.dirname(__file__), "filer", "management"), ] diff --git a/filer/__init__.py b/filer/__init__.py index f705a2ba8..03cc0b520 100644 --- a/filer/__init__.py +++ b/filer/__init__.py @@ -1,3 +1,14 @@ -#-*- coding: utf-8 -*- -# version string following pep-0440 -__version__ = '0.9.123' # pragma: nocover +""" +See PEP 386 (https://www.python.org/dev/peps/pep-0386/) + +Release logic: + 1. Increase version number (change __version__ below). + 2. Check that all changes have been documented in CHANGELOG.rst. + 3. git add filer/__init__.py CHANGELOG.rst + 4. git commit -m 'Bump to {new version}' + 5. git push + 6. Assure that all tests pass on CI + 7. Create a new release on github. +""" + +__version__ = '3.4.4+pbs.1' diff --git a/filer/admin/__init__.py b/filer/admin/__init__.py index a55a36e4e..c84fb51b9 100644 --- a/filer/admin/__init__.py +++ b/filer/admin/__init__.py @@ -1,18 +1,43 @@ -#-*- coding: utf-8 -*- from django.contrib import admin -from filer.admin.clipboardadmin import ClipboardAdmin -from filer.admin.fileadmin import FileAdmin -from filer.admin.folderadmin import FolderAdmin -from filer.admin.imageadmin import ImageAdmin -from filer.admin.archiveadmin import ArchiveAdmin -from filer.models import (Folder, File, Clipboard, Image, - Archive) -from filer.admin.trashadmin import Trash, TrashAdmin +from ..models import Clipboard, File, Folder, FolderPermission +from ..settings import FILER_IMAGE_MODEL +from ..utils.loader import load_model +from .clipboardadmin import ClipboardAdmin +from .fileadmin import FileAdmin +from .folderadmin import FolderAdmin +from .imageadmin import ImageAdmin +from .permissionadmin import PermissionAdmin + +# PBS-specific: ThumbnailOption model may not exist in PBS migrations yet +try: + from ..models import ThumbnailOption + from .thumbnailoptionadmin import ThumbnailOptionAdmin + _has_thumbnail_option = True +except ImportError: + _has_thumbnail_option = False + +# PBS-specific: Trash admin +from ..admin.trashadmin import Trash, TrashAdmin + +Image = load_model(FILER_IMAGE_MODEL) admin.site.register(Folder, FolderAdmin) admin.site.register(File, FileAdmin) admin.site.register(Clipboard, ClipboardAdmin) admin.site.register(Image, ImageAdmin) -admin.site.register(Archive, ArchiveAdmin) +admin.site.register(FolderPermission, PermissionAdmin) + +if _has_thumbnail_option: + admin.site.register(ThumbnailOption, ThumbnailOptionAdmin) + +# PBS-specific: register Trash admin admin.site.register([Trash], TrashAdmin) + +# PBS-specific: Archive (backward compat) +try: + from ..models import Archive + from ..admin.archiveadmin import ArchiveAdmin + admin.site.register(Archive, ArchiveAdmin) +except ImportError: + pass diff --git a/filer/admin/archiveadmin.py b/filer/admin/archiveadmin.py index f7e1f1214..2c30342b9 100644 --- a/filer/admin/archiveadmin.py +++ b/filer/admin/archiveadmin.py @@ -1,9 +1,8 @@ -from django import forms -from filer.admin.fileadmin import FileAdmin +from filer.admin.fileadmin import FileAdmin, FileAdminChangeFrom from filer.models import Archive -class ArchiveAdminForm(forms.ModelForm): +class ArchiveAdminForm(FileAdminChangeFrom): class Meta: model = Archive diff --git a/filer/admin/clipboardadmin.py b/filer/admin/clipboardadmin.py index b8200e9b6..fbcc41cf2 100644 --- a/filer/admin/clipboardadmin.py +++ b/filer/admin/clipboardadmin.py @@ -1,30 +1,30 @@ -#-*- coding: utf-8 -*- + +from django.contrib import admin, messages +from django.core.exceptions import ValidationError from django.forms.models import modelform_factory -from django.core.exceptions import PermissionDenied -from django.contrib import admin -from django.http import HttpResponse, HttpResponseRedirect +from django.http import JsonResponse +from django.urls import path, reverse +from django.utils.translation import gettext_lazy as _ from django.views.decorators.csrf import csrf_exempt -from django.urls import re_path -from filer import settings as filer_settings -from filer.models import Clipboard, ClipboardItem, Folder, tools -from filer.utils.files import ( - handle_upload, UploadException, matching_file_subtypes, truncate_filename -) -from filer.views import ( - popup_param, selectfolder_param, current_site_param, - file_type_param + +from .. import settings as filer_settings +from ..models import Clipboard, ClipboardItem, Folder +from ..settings import FILER_THUMBNAIL_ICON_SIZE +from ..utils.files import handle_request_files_upload, handle_upload, truncate_filename +from ..utils.loader import load_model +from ..validation import validate_upload +from . import views + + +NO_PERMISSIONS = _("You do not have permission to upload files.") +NO_FOLDER_ERROR = _("Can't find folder to upload. Please refresh and try again") +NO_PERMISSIONS_FOR_FOLDER = _( + "Can't use this folder, Permission Denied. Please select another folder." ) -from filer.admin.tools import is_valid_destination -from filer.utils.is_ajax import is_ajax -import json -import logging -logger = logging.getLogger(__name__) -# even though the CharField is limited at 255 characters, the filename is used in -# thumbnail creation, which remembers the path and also post-fixes the name with -# '__32x32_q85_crop_subsampling-2_upscale.jpg'-like strings -FILENAME_LIMIT = 100 # larger values cause DataError +Image = load_model(filer_settings.FILER_IMAGE_MODEL) + # ModelAdmins class ClipboardItemInline(admin.TabularInline): @@ -34,161 +34,163 @@ class ClipboardItemInline(admin.TabularInline): class ClipboardAdmin(admin.ModelAdmin): model = Clipboard inlines = [ClipboardItemInline] - # filter_horizontal = ('files',) raw_id_fields = ('user',) verbose_name = "DEBUG Clipboard" verbose_name_plural = "DEBUG Clipboards" messages = { - 'already-exists': 'A file named {} already exists in the clipboard', - 'request-invalid': "AJAX request not valid: form invalid '{}'" + 'already-exists': "File '{}' already exists in the clipboard.", } def get_urls(self): - urls = super(ClipboardAdmin, self).get_urls() - url_patterns = [ - re_path(r'^operations/paste_clipboard_to_folder/$', - self.admin_site.admin_view(self.paste_clipboard_to_folder), - name='filer-paste_clipboard_to_folder'), - re_path(r'^operations/discard_clipboard/$', - self.admin_site.admin_view(self.discard_clipboard), - name='filer-discard_clipboard'), - re_path(r'^operations/delete_clipboard/$', - self.admin_site.admin_view(self.delete_clipboard), - name='filer-delete_clipboard'), - # upload does it's own permission stuff (because of the stupid - # flash missing cookie stuff) - re_path(r'^operations/upload/$', - self.ajax_upload, - name='filer-ajax_upload'), - ] - url_patterns.extend(urls) - return url_patterns - - def get_clipboard(self, request): - return Clipboard.objects.get(id=request.POST.get('clipboard_id')) - - def make_clipboard_redirect(self, request): - return HttpResponseRedirect('%s%s%s%s%s' % ( - request.POST.get('redirect_to', ''), - popup_param(request), - selectfolder_param(request), - current_site_param(request), - file_type_param(request))) - - def paste_clipboard_to_folder(self, request): - if request.method == 'POST': - folder_id = request.POST.get('folder_id') - if not folder_id: - raise PermissionDenied - folder = Folder.objects.get(id=folder_id) - if not is_valid_destination(request, folder): - raise PermissionDenied - - clipboard = self.get_clipboard(request) - files_moved = tools.move_files_from_clipboard_to_folder( - request, clipboard, folder) - tools.discard_clipboard_files(clipboard, files_moved) - return self.make_clipboard_redirect(request) - - def discard_clipboard(self, request): - if request.method == 'POST': - clipboard = self.get_clipboard(request) - tools.discard_clipboard(clipboard) - return self.make_clipboard_redirect(request) - - def delete_clipboard(self, request): - if request.method == 'POST': - tools.delete_clipboard(self.get_clipboard(request)) - return self.make_clipboard_redirect(request) - - def clone_files_from_clipboard_to_folder(self, request): - if request.method == 'POST': - folder_id = request.POST.get('folder_id') - if not folder_id: - raise PermissionDenied - folder = Folder.objects.get(id=folder_id) - if not is_valid_destination(request, folder): - raise PermissionDenied - tools.clone_files_from_clipboard_to_folder( - self.get_clipboard(request), folder) - return self.make_clipboard_redirect(request) - - @csrf_exempt - def ajax_upload(self, request, folder_id=None): + return [ + path('operations/paste_clipboard_to_folder/', + self.admin_site.admin_view(views.paste_clipboard_to_folder), + name='filer-paste_clipboard_to_folder'), + path('operations/discard_clipboard/', + self.admin_site.admin_view(views.discard_clipboard), + name='filer-discard_clipboard'), + path('operations/delete_clipboard/', + self.admin_site.admin_view(views.delete_clipboard), + name='filer-delete_clipboard'), + path('operations/upload//', + ajax_upload, + name='filer-ajax_upload'), + path('operations/upload/no_folder/', + ajax_upload, + name='filer-ajax_upload'), + ] + super().get_urls() + + def get_model_perms(self, *args, **kwargs): """ - receives an upload from the uploader. Receives only one file at the time. + It seems this is only used for the list view. NICE :-) """ - mimetype = "application/json" if is_ajax(request) else "text/html" - upload, file_obj, clipboard_item = None, None, None - try: - upload, original_filename, _ = handle_upload(request) - - filename = truncate_filename(upload, maxlen=FILENAME_LIMIT) - upload.name = filename # the upload raw has also the title saved in a CharField + return { + 'add': False, + 'change': False, + 'delete': False, + } - # Get clipboad - clipboard, created = Clipboard.objects.get_or_create(user=request.user) - if any(f for f in clipboard.files.all() if f.original_filename == filename): - raise UploadException(self.messages['already-exists'].format(filename)) +@csrf_exempt +def ajax_upload(request, folder_id=None): + """ + Receives an upload from the uploader. Receives only one file at a time. + """ - matched_file_types = matching_file_subtypes(filename, upload, request) + if not request.user.has_perm("filer.add_file"): + messages.error(request, NO_PERMISSIONS) + return JsonResponse({'error': NO_PERMISSIONS}) + if folder_id: + try: + # Get folder + folder = Folder.objects.get(pk=folder_id) + except Folder.DoesNotExist: + messages.error(request, NO_FOLDER_ERROR) + return JsonResponse({'error': NO_FOLDER_ERROR}) + else: + folder = Folder.objects.filter(pk=request.session.get('filer_last_folder_id', 0)).first() + + # check permissions + if folder and not folder.has_add_children_permission(request): + messages.error(request, NO_PERMISSIONS_FOR_FOLDER) + return JsonResponse({'error': NO_PERMISSIONS_FOR_FOLDER}) + + try: + if len(request.FILES) == 1: + # don't check if request is ajax or not, just grab the file + upload, filename, is_raw, mime_type = handle_request_files_upload(request) + else: + # else process the request as usual + upload, filename, is_raw, mime_type = handle_upload(request) + except Exception as e: + return JsonResponse({'error': str(e)}) + + # Truncate long filenames + filename = truncate_filename(upload, maxlen=100) + upload.name = filename + + # Re-detect mime_type after truncation may have added an extension + import mimetypes as _mimetypes + guessed_type = _mimetypes.guess_type(filename)[0] + if guessed_type and ( + mime_type == 'application/octet-stream' + or not _mimetypes.guess_all_extensions(mime_type) + ): + mime_type = guessed_type + + + # Get clipboard + clipboard = Clipboard.objects.get_or_create(user=request.user)[0] + + # Remove any stale clipboard entries with the same filename + # (e.g. from previous failed upload attempts) to allow re-upload + existing_in_clipboard = clipboard.files.filter(original_filename=filename) + if existing_in_clipboard.exists(): + # Get the actual file pks before clearing the M2M + stale_file_pks = list(existing_in_clipboard.values_list('pk', flat=True)) + ClipboardItem.objects.filter(clipboard=clipboard, file_id__in=stale_file_pks).delete() + from ..models import File as FilerFile + FilerFile.objects.filter(pk__in=stale_file_pks).delete() + + # find the file type + for filer_class in filer_settings.FILER_FILE_MODELS: + FileSubClass = load_model(filer_class) + # TODO: What if there are more than one that qualify? + if FileSubClass.matches_file_type(filename, upload, mime_type): FileForm = modelform_factory( - model=matched_file_types[0], + model=FileSubClass, fields=('original_filename', 'owner', 'file') ) - uploadform = FileForm({'original_filename': filename, - 'owner': request.user.pk}, - {'file': upload}) - if uploadform.is_valid(): - file_obj = uploadform.save(commit=False) - # Enforce the FILER_IS_PUBLIC_DEFAULT - file_obj.is_public = filer_settings.FILER_IS_PUBLIC_DEFAULT - file_obj.save() - - clipboard_item = ClipboardItem( - clipboard=clipboard, file=file_obj) - clipboard_item.save() - - json_response = { - 'thumbnail': file_obj.icons['32'], - 'alt_text': '', - 'label': str(file_obj), - } - return HttpResponse(json.dumps(json_response), - content_type=mimetype) - else: - form_errors = '; '.join(['%s: %s' % ( - field, - ', '.join(errors)) for field, errors in list(uploadform.errors.items()) - ]) - raise UploadException(self.messages['request-invalid'].format(form_errors)) - except UploadException as exception: - return HttpResponse(json.dumps({'error': str(exception)}), - content_type=mimetype) - except Exception as error: # no matter the error, we don't return a 500 code - logger.exception("[ajax_upload] Unexpected error: %s", str(error)) - # an error occurred trying to build the file obj and the clipboard item - # since they are interconnected, we'll delete both to cleanup - if clipboard_item: - clipboard_item.file.file.close() - clipboard_item.file.file.delete() - clipboard_item.delete() - return HttpResponse(json.dumps({'error': str(error)}), - content_type=mimetype) - finally: - if upload: - upload.close() - if file_obj and file_obj.file: - file_obj.file.close() - - def get_model_perms(self, request): - """ - It seems this is only used for the list view. NICE :-) - """ - return { - 'add': False, - 'change': False, - 'delete': False, - } + break + uploadform = FileForm({'original_filename': filename, 'owner': request.user.pk}, + {'file': upload}) + uploadform.request = request + uploadform.instance.mime_type = mime_type + if uploadform.is_valid(): + try: + validate_upload(filename, upload, request.user, mime_type) + file_obj = uploadform.save(commit=False) + # Enforce the FILER_IS_PUBLIC_DEFAULT + file_obj.is_public = filer_settings.FILER_IS_PUBLIC_DEFAULT + except ValidationError as error: + messages.error(request, str(error)) + return JsonResponse({'error': str(error)}) + file_obj.folder = folder + try: + file_obj.save() + except Exception as error: + messages.error(request, str(error)) + return JsonResponse({'error': str(error)}) + clipboard_item = ClipboardItem( + clipboard=clipboard, file=file_obj) + clipboard_item.save() + + try: + thumbnail = None + data = { + 'thumbnail': thumbnail, + 'alt_text': '', + 'label': str(file_obj), + 'file_id': file_obj.pk, + } + # prepare preview thumbnail + if isinstance(file_obj, Image): + data['thumbnail_180'] = reverse( + f"admin:filer_{file_obj._meta.model_name}_fileicon", + args=(file_obj.pk, FILER_THUMBNAIL_ICON_SIZE), + ) + data['original_image'] = file_obj.url + return JsonResponse(data) + except Exception as error: + messages.error(request, str(error)) + return JsonResponse({"error": str(error)}) + else: + for key, error_list in uploadform.errors.items(): + for error in error_list: + messages.error(request, error) + + form_errors = '; '.join(['{}'.format( + ', '.join(errors)) for errors in list(uploadform.errors.values()) + ]) + return JsonResponse({'error': str(form_errors)}, status=200) diff --git a/filer/admin/common_admin.py b/filer/admin/common_admin.py index c6ee96971..c7771bc1a 100644 --- a/filer/admin/common_admin.py +++ b/filer/admin/common_admin.py @@ -7,8 +7,8 @@ from django.http import HttpResponseRedirect from filer.models import Folder, File -from filer.admin.tools import (has_admin_role, has_role_on_site, - has_multi_file_action_permission) +from filer.utils.cms_roles import has_admin_role, has_role_on_site +from filer.admin.tools import has_multi_file_action_permission from filer.views import (popup_param, selectfolder_param, popup_status, selectfolder_status, current_site_param, get_param_from_request) @@ -126,7 +126,7 @@ def render_change_form(self, request, context, add=False, change=False, 'select_folder': selectfolder_status(request), }) return super(CommonModelAdmin, self).render_change_form( - request=request, context=context, add=False, + request=request, context=context, add=add, change=change, form_url=form_url, obj=obj) def response_change(self, request, obj): @@ -147,12 +147,20 @@ def response_change(self, request, obj): class FolderPermissionModelAdmin(CommonModelAdmin): def has_add_permission(self, request): - # allow only make folder view + # allow only make folder views current_view = resolve(request.path_info).url_name - if not current_view == 'filer-directory_listing-make_root_folder': + allowed_views = ( + 'filer-directory_listing-make_root_folder', + 'filer-directory_listing-make_folder', + ) + if current_view not in allowed_views: return False folder_id = get_param_from_request(request, 'parent_id') + # Also check URL kwargs for folder_id + if not folder_id: + resolved = resolve(request.path_info) + folder_id = resolved.kwargs.get('folder_id') if not folder_id: # only site admins and superusers can add root folders if has_admin_role(request.user): diff --git a/filer/admin/fileadmin.py b/filer/admin/fileadmin.py index 2dbadb63d..7487e2846 100644 --- a/filer/admin/fileadmin.py +++ b/filer/admin/fileadmin.py @@ -1,80 +1,263 @@ -#-*- coding: utf-8 -*- +import mimetypes + +from django import forms +from django.contrib.admin.templatetags.admin_urls import admin_urlname +from django.contrib.admin.utils import unquote +from django.contrib.staticfiles.storage import staticfiles_storage from django.db import models -from django.utils.translation import gettext as _ -from filer.admin.common_admin import FilePermissionModelAdmin -from filer.fields.file import NonClearableFileInput +from django.http import Http404, HttpResponse, HttpResponseRedirect +from django.shortcuts import get_object_or_404 +from django.urls import path, reverse +from django.utils.safestring import mark_safe +from django.utils.timezone import now +from django.utils.translation import gettext as _ + +from easy_thumbnails.engine import NoSourceGenerator +from easy_thumbnails.exceptions import InvalidImageFormatError +from easy_thumbnails.files import get_thumbnailer +from easy_thumbnails.models import Thumbnail as EasyThumbnail +from easy_thumbnails.options import ThumbnailOptions + +from .. import settings +from ..models import File +from ..settings import DEFERRED_THUMBNAIL_SIZES +from ..utils.loader import load_model +from .permissions import PrimitivePermissionAwareModelAdmin +from .tools import AdminContext, admin_url_params_encoded, popup_status + +# PBS-specific imports +from .common_admin import FilePermissionModelAdmin +from ..fields.file import NonClearableFileInput + +try: + from ..models import BaseImage +except ImportError: + BaseImage = None + +Image = load_model(settings.FILER_IMAGE_MODEL) + +class FileAdminChangeFrom(forms.ModelForm): + class Meta: + model = File + exclude = () -class FileAdmin(FilePermissionModelAdmin): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + if "file" in self.fields: + self.fields["file"].widget = forms.FileInput() + # Pre-populate the "name" field with the original_filename when it is + # empty so that users see the current effective filename on first edit. + if self.instance and self.instance.pk and "name" in self.fields: + if not self.instance.name and self.instance.original_filename: + self.initial["name"] = self.instance.original_filename + + def clean(self): + from ..validation import validate_upload + cleaned_data = super().clean() + if "file" in self.changed_data and cleaned_data["file"]: + mime_type = mimetypes.guess_type(cleaned_data["file"].name)[0] or 'application/octet-stream' + file = cleaned_data["file"] + file.open("w+") # Allow for sanitizing upload + file.seek(0) + validate_upload( + file_name=cleaned_data["file"].name, + file=file.file, + owner=cleaned_data.get("owner"), + mime_type=mime_type, + ) + file.open("r") + return self.cleaned_data + + +class FileAdmin(PrimitivePermissionAwareModelAdmin): list_display = ('label',) list_per_page = 10 search_fields = ['name', 'original_filename', 'sha1', 'description'] - raw_id_fields = ('owner',) - readonly_fields = ('sha1', ) + readonly_fields = ('sha1', 'display_canonical') + + form = FileAdminChangeFrom formfield_overrides = { - models.FileField: {'widget': NonClearableFileInput}, + models.FileField: {'widget': NonClearableFileInput}, } + # PBS-specific: make fields readonly for restricted/core files def get_readonly_fields(self, request, obj=None): if obj and (obj.is_readonly_for_user(request.user) or obj.is_restricted_for_user(request.user)): - return [field.name - for field in obj.__class__._meta.fields] - self.readonly_fields = [ro_field - for ro_field in self.readonly_fields] + return [field.name for field in obj.__class__._meta.fields] + ['display_canonical'] + readonly = list(self.readonly_fields) self._make_restricted_field_readonly(request.user, obj) if not request.user.is_superuser: - # allow owner to be editable only by superusers - self.readonly_fields += ['owner'] - return super(FileAdmin, self).get_readonly_fields( - request, obj) + if 'owner' not in readonly: + readonly.append('owner') + return readonly + + def _make_restricted_field_readonly(self, user, obj): + """PBS: make restricted field readonly if user can't change restriction.""" + if obj and hasattr(obj, 'can_change_restricted'): + if not obj.can_change_restricted(user): + if 'restricted' not in self.readonly_fields: + self.readonly_fields = list(self.readonly_fields) + ['restricted'] @classmethod - def build_fieldsets(cls, extra_main_fields=(), extra_advanced_fields=(), extra_fieldsets=()): + def build_fieldsets(cls, extra_main_fields=(), extra_advanced_fields=(), + extra_fieldsets=()): fieldsets = ( (None, { - 'fields': ('title', 'owner', 'description',) + extra_main_fields, + 'fields': ( + 'title', + 'owner', + 'description', + ) + extra_main_fields, }), (_('Advanced'), { - # due to custom requirements: sha1 field should be hidden - # 'fields': ('file', 'sha1',) + extra_advanced_fields, - 'fields': ('file', 'name',) + extra_advanced_fields, + 'fields': ( + 'file', + 'name', + 'sha1', + 'display_canonical', + ) + extra_advanced_fields, 'classes': ('collapse',), - }), - (('Permissions'), { + }), + (_('Permissions'), { 'fields': ('restricted',), 'classes': ('collapse', 'wide', 'extrapretty'), - }) - ) + extra_fieldsets + }), + ) + extra_fieldsets + if settings.FILER_ENABLE_PERMISSIONS: + fieldsets = fieldsets + ( + (None, { + 'fields': ('is_public',) + }), + ) return fieldsets + def response_change(self, request, obj): + if ( + request.POST + and '_continue' not in request.POST + and '_saveasnew' not in request.POST + and '_addanother' not in request.POST + and '_edit_from_widget' not in request.POST + ): + if obj.folder: + url = reverse('admin:filer-directory_listing', + kwargs={'folder_id': obj.folder.id}) + else: + url = reverse( + 'admin:filer-directory_listing-unfiled_images') + url = "{}{}".format( + url, + admin_url_params_encoded(request), + ) + return HttpResponseRedirect(url) + + template_response = super().response_change(request, obj) + if hasattr(template_response, 'context_data'): + template_response.context_data["media"] = self.media + return template_response + + def render_change_form(self, request, context, add=False, change=False, + form_url='', obj=None): + # PBS: flag readonly files to suppress submit buttons in template + is_readonly = obj and (obj.is_readonly_for_user(request.user) or + obj.is_restricted_for_user(request.user)) + context.update({ + 'show_delete': True, + 'history_url': admin_urlname(self.opts, 'history'), + 'expand_image_url': None, + 'is_popup': popup_status(request), + 'filer_admin_context': AdminContext(request), + 'is_readonly_file': is_readonly, + }) + if obj and obj.mime_maintype == 'image' and obj.file.exists(): + if 'svg' in obj.mime_type: + context['expand_image_url'] = reverse(admin_urlname(Image._meta, 'expand'), args=(obj.pk,)) + else: + context['expand_image_url'] = obj.file.url + return super().render_change_form( + request=request, context=context, add=add, change=change, + form_url=form_url, obj=obj) + + def delete_view(self, request, object_id, extra_context=None): + try: + obj = self.get_queryset(request).get(pk=unquote(object_id)) + parent_folder = obj.folder + except self.model.DoesNotExist: + parent_folder = None + + if request.POST: + super().delete_view( + request=request, object_id=object_id, + extra_context=extra_context) + if parent_folder: + url = reverse('admin:filer-directory_listing', + kwargs={'folder_id': parent_folder.id}) + else: + url = reverse('admin:filer-directory_listing-unfiled_images') + url = "{}{}".format( + url, + admin_url_params_encoded(request) + ) + return HttpResponseRedirect(url) + + return super().delete_view( + request=request, object_id=object_id, + extra_context=extra_context) + def has_add_permission(self, request): return False def has_change_permission(self, request, obj=None): if not obj: - # We do this in order to prevent access to the change_list view return False - return super(FileAdmin, self).has_change_permission(request, obj) + return super().has_change_permission(request, obj) def has_view_permission(self, request, obj=None): if not obj: - # Block access to the changelist view (Django 4.2+ uses - # has_view_permission separately from has_change_permission) return False - return super(FileAdmin, self).has_view_permission(request, obj) + return super().has_view_permission(request, obj) def get_model_perms(self, request): - """ - While this method is used by Django, it is no longer used to determine if the - option is available in the changelist view, which was the original intention. - The has_xxx_permission is used instead. - """ return { - 'add': self.has_add_permission(request), - 'change': self.has_change_permission(request), + 'add': False, + 'change': False, 'delete': False, } + def display_canonical(self, instance): + canonical = instance.canonical_url + if canonical: + return mark_safe(f'{canonical}') + else: + return '-' + display_canonical.allow_tags = True + display_canonical.short_description = _('canonical URL') + + def get_urls(self): + return super().get_urls() + [ + path("icon//", + self.admin_site.admin_view(self.icon_view), + name=f"filer_{self.model._meta.model_name}_fileicon") + ] + + def icon_view(self, request, file_id: int, size: int) -> HttpResponse: + if size not in DEFERRED_THUMBNAIL_SIZES: + raise Http404 + file = get_object_or_404(File, pk=file_id) + if BaseImage and not isinstance(file, BaseImage): + raise Http404() + + try: + thumbnailer = get_thumbnailer(file) + thumbnail_options = ThumbnailOptions({'size': (size, size), "crop": True}) + thumbnail = thumbnailer.get_thumbnail(thumbnail_options, generate=True) + EasyThumbnail.objects.filter(name=thumbnail.name).update(modified=now()) + return HttpResponseRedirect(thumbnail.url) + except (InvalidImageFormatError, NoSourceGenerator): + return HttpResponseRedirect(staticfiles_storage.url('filer/icons/file-missing.svg')) + + FileAdmin.fieldsets = FileAdmin.build_fieldsets() diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index 92c14b8b5..482d98b44 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -1,108 +1,122 @@ -# -*- coding: utf-8 -*- -import json +import itertools +import logging import os import re -from functools import partial +from collections import OrderedDict +from urllib.parse import quote as urlquote +from urllib.parse import unquote as urlunquote -from django.conf import settings -from django.contrib.admin import helpers -from django.contrib.admin.utils import quote, unquote, capfirst +from django import VERSION as DJANGO_VERSION +from django import forms +from django.conf import settings as django_settings from django.contrib import messages -from filer.admin.patched.admin_utils import get_deleted_objects -from django.core.exceptions import PermissionDenied -from django.core.paginator import Paginator, InvalidPage, EmptyPage -from django.urls import reverse, re_path -from django.db import router -from django.db.models import Q -from django.contrib.sites.models import Site -from django.contrib.contenttypes.models import ContentType -from django.contrib.auth import get_permission_codename -from django.http import HttpResponseRedirect, Http404, HttpResponse -from django.shortcuts import render +from django.contrib.admin import helpers +from django.contrib.admin.utils import capfirst, quote, unquote +from django.core.exceptions import PermissionDenied, ValidationError +from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator +from django.db import models, router +from django.db.models import Case, F, OuterRef, Subquery, When +from django.db.models.functions import Coalesce, Lower +from django.http import HttpResponse, HttpResponseRedirect, JsonResponse +from django.shortcuts import get_object_or_404 +from django.template.response import TemplateResponse +from django.urls import path, reverse from django.utils.encoding import force_str -from django.utils.html import escape +from django.utils.html import escape, format_html from django.utils.safestring import mark_safe -from django.utils.translation import gettext as _ -from django.utils.translation import gettext_lazy -from filer.admin.forms import CopyFilesAndFoldersForm -from filer.admin.common_admin import FolderPermissionModelAdmin -from filer.views import (popup_status, popup_param, selectfolder_status, - selectfolder_param, current_site_param, - get_param_from_request) -from filer.admin.tools import (folders_available, files_available, - get_admin_sites_for_user, - has_multi_file_action_permission, - is_valid_destination,) -from filer.models import (Folder, FolderRoot, UnfiledImages, File, tools, - ImagesWithMissingData, - Archive, Image) -from filer.settings import FILER_STATICMEDIA_PREFIX, FILER_PAGINATE_BY -from filer.utils.multi_model_qs import MultiMoldelQuerysetChain -from filer.utils.is_ajax import is_ajax +from django.utils.translation import gettext_lazy as _ from django.utils.translation import ngettext_lazy +from easy_thumbnails.models import Thumbnail + +from .. import settings +from ..cache import clear_folder_permission_cache +from ..models import File, Folder, FolderPermission, FolderRoot, ImagesWithMissingData, UnsortedImages, tools +from ..settings import ( + FILER_IMAGE_MODEL, FILER_PAGINATE_BY, FILER_TABLE_ICON_SIZE, FILER_THUMBNAIL_ICON_SIZE, TABLE_LIST_TYPE, +) +from ..thumbnail_processors import normalize_subject_location +from ..utils.compatibility import get_delete_permission +from ..utils.filer_easy_thumbnails import FilerActionThumbnailer +from ..utils.loader import load_model +from . import views +from .forms import CopyFilesAndFoldersForm, RenameFilesForm, ResizeImagesForm +from .patched.admin_utils import get_deleted_objects +from .permissions import PrimitivePermissionAwareModelAdmin +from .common_admin import FolderPermissionModelAdmin +from .tools import ( + AdminContext, admin_url_params_encoded, check_files_edit_permissions, check_files_read_permissions, + check_folder_edit_permissions, check_folder_read_permissions, get_directory_listing_type, + has_multi_file_action_permission, popup_status, + userperms_for_request, +) + -ELEM_ID = re.compile(r'.*$') +Image = load_model(FILER_IMAGE_MODEL) + +logger = logging.getLogger(__name__) + +class AddFolderPopupForm(forms.ModelForm): + folder = forms.HiddenInput() + + class Meta: + model = Folder + fields = ('name',) class FolderAdmin(FolderPermissionModelAdmin): list_display = ('name',) - list_per_page = 20 - list_filter = ('owner',) - search_fields = ['name', 'files__name'] - - actions_affecting_position = [ - 'move_to_clipboard', - 'delete_files_or_folders', - 'move_files_and_folders', - ] - actions_restrictions = [ - 'disable_restriction', - 'enable_restriction', - ] if getattr(settings, 'FILER_ENABLE_RESTRICTION_ACTIONS', True) else [] - actions = actions_restrictions + [ - 'copy_files_and_folders', - 'extract_files', - ] + actions_affecting_position - - # form fields exclude = ('parent', 'owner', 'folder_type') - raw_id_fields = ('owner', ) + list_per_page = 100 + list_filter = ('owner',) + search_fields = ['name'] + autocomplete_fields = ['owner'] + save_as = True # see ImageAdmin + actions = ['delete_files_or_folders', 'move_files_and_folders', + 'copy_files_and_folders', 'resize_images', 'rename_files', + 'extract_files', + 'enable_restriction', 'disable_restriction'] + + if DJANGO_VERSION >= (5, 2): + directory_listing_template = 'admin/filer/folder/directory_listing.html' + else: # Remove this when Django 5.2 is the minimum version + directory_listing_template = 'admin/filer/folder/legacy_listing.html' + + order_by_file_fields = ['_file_size', 'original_filename', 'name', 'owner', + 'uploaded_at', 'modified_at'] def get_readonly_fields(self, request, obj=None): self.readonly_fields = [ro_field for ro_field in self.readonly_fields] self._make_restricted_field_readonly(request.user, obj) - return super(FolderAdmin, self).get_readonly_fields( - request, obj) - - def _get_sites_available_for_user(self, user): - if user.is_superuser: - return Site.objects.all() - admin_sites = [site.id - for site in get_admin_sites_for_user(user)] - return Site.objects.filter(id__in=admin_sites) + return super().get_readonly_fields(request, obj) def formfield_for_foreignkey(self, db_field, request=None, **kwargs): - """ - Filters sites available to the user based on his roles on sites - """ - formfield = super(FolderAdmin, self).formfield_for_foreignkey( + from django.contrib.sites.models import Site + formfield = super().formfield_for_foreignkey( db_field, request, **kwargs) if request and db_field.remote_field.model is Site: - formfield.queryset = self._get_sites_available_for_user( - request.user) + if request.user.is_superuser: + formfield.queryset = Site.objects.all() + else: + from filer.utils.cms_roles import get_admin_sites_for_user + admin_sites = [site.id + for site in get_admin_sites_for_user(request.user)] + formfield.queryset = Site.objects.filter(id__in=admin_sites) return formfield def formfield_for_manytomany(self, db_field, request, **kwargs): - """ - Filters sites available to the user based on his roles on sites - """ - formfield = super(FolderAdmin, self).formfield_for_manytomany( + from django.contrib.sites.models import Site + formfield = super().formfield_for_manytomany( db_field, request, **kwargs) if request and db_field.remote_field.model is Site: - formfield.queryset = self._get_sites_available_for_user( - request.user) + if request.user.is_superuser: + formfield.queryset = Site.objects.all() + else: + from filer.utils.cms_roles import get_admin_sites_for_user + admin_sites = [site.id + for site in get_admin_sites_for_user(request.user)] + formfield.queryset = Site.objects.filter(id__in=admin_sites) return formfield def get_form(self, request, obj=None, **kwargs): @@ -111,10 +125,13 @@ def get_form(self, request, obj=None, **kwargs): add_view and change_view. Sets the parent folder and owner for the folder that will be edited - in the form + in the form. """ + parent_id = request.GET.get('parent_id', None) + if not parent_id: + parent_id = request.POST.get('parent_id', None) - folder_form = super(FolderAdmin, self).get_form( + folder_form = super().get_form( request, obj=obj, **kwargs) if 'site' in folder_form.base_fields: @@ -125,70 +142,103 @@ def get_form(self, request, obj=None, **kwargs): if 'shared' in folder_form.base_fields: folder_form.base_fields['shared'].widget.can_add_related = False - # do show share sites field only for superusers + # only show shared sites field for superusers if not request.user.is_superuser: folder_form.base_fields.pop('shared', None) - # check if site field should be visible in the form or not + # check if site field should be visible in the form is_core_folder = False if obj and obj.pk: # change view - parent_id = obj.parent_id + change_parent_id = obj.parent_id is_core_folder = obj.is_core() else: # add view - parent_id = get_param_from_request(request, 'parent_id') + change_parent_id = parent_id folder_form.base_fields.pop('restricted', None) - # shouldn't show site field if has parent or is core folder - pop_site_fields = parent_id or is_core_folder + # hide site/shared for child folders or core folders + pop_site_fields = change_parent_id or is_core_folder if pop_site_fields: folder_form.base_fields.pop('site', None) folder_form.base_fields.pop('shared', None) - def clean(form_instance): + def folder_form_clean(form_obj): + cleaned_data = form_obj.cleaned_data + if 'name' not in cleaned_data: + return cleaned_data # make sure owner and parent are passed to the model clean method - current_folder = form_instance.instance + current_folder = form_obj.instance if not current_folder.owner: current_folder.owner = request.user if parent_id: current_folder.parent = Folder.objects.get(id=parent_id) - return form_instance.cleaned_data - - folder_form.clean = clean + folders_with_same_name = self.get_queryset(request).filter( + parent=form_obj.instance.parent, + name=cleaned_data['name']) + if form_obj.instance.pk: + folders_with_same_name = folders_with_same_name.exclude( + pk=form_obj.instance.pk) + if folders_with_same_name.exists(): + raise ValidationError( + 'Folder with this name already exists.') + return cleaned_data + + folder_form.clean = folder_form_clean return folder_form - def icon_img(self, xs): - return mark_safe(('') % FILER_STATICMEDIA_PREFIX) - - def get_urls(self): - urls = super(FolderAdmin, self).get_urls() - url_patterns = [ - # we override the default list view with our own directory listing - # of the root directories - re_path(r'^$', self.admin_site.admin_view(self.directory_listing), - name='filer-directory_listing-root'), - re_path(r'^(?P\d+)/list/$', - self.admin_site.admin_view(self.directory_listing), - name='filer-directory_listing'), - re_path(r'^make_folder/$', - self.admin_site.admin_view(self.make_folder), - name='filer-directory_listing-make_root_folder'), - re_path(r'^images_with_missing_data/$', - self.admin_site.admin_view(self.directory_listing), - {'viewtype': 'images_with_missing_data'}, - name='filer-directory_listing-images_with_missing_data'), - re_path(r'^unfiled_images/$', - self.admin_site.admin_view(self.directory_listing), - {'viewtype': 'unfiled_images'}, - name='filer-directory_listing-unfiled_images'), - re_path(r'^destination_folders/$', - self.admin_site.admin_view(self.destination_folders), - name='filer-destination_folders'), - ] - url_patterns.extend(urls) - return url_patterns + def save_form(self, request, form, change): + """ + Given a ModelForm return an unsaved instance. ``change`` is True if + the object is being changed, and False if it's being added. + """ + if not change: + # New folder invalidates the folder permission cache (or it will not be visible) + clear_folder_permission_cache(request.user) + r = form.save(commit=False) + parent_id = request.GET.get('parent_id', None) + if not parent_id: + parent_id = request.POST.get('parent_id', None) + if parent_id: + parent = self.get_queryset(request).get(id=parent_id) + r.parent = parent + return r + + def response_change(self, request, obj): + """ + Overrides the default to be able to forward to the directory listing + instead of the default change_list_view + """ + if ( + request.POST + and '_continue' not in request.POST + and '_saveasnew' not in request.POST + and '_addanother' not in request.POST + ): + + if obj.parent: + url = reverse('admin:filer-directory_listing', + kwargs={'folder_id': obj.parent.id}) + else: + url = reverse('admin:filer-directory_listing-root') + url = "{}{}".format( + url, + admin_url_params_encoded(request), + ) + return HttpResponseRedirect(url) + return super().response_change(request, obj) + + def render_change_form(self, request, context, add=False, change=False, + form_url='', obj=None): + info = self.model._meta.app_label, self.model._meta.model_name + extra_context = {'show_delete': True, + 'history_url': 'admin:%s_%s_history' % info, + 'is_popup': popup_status(request), + 'filer_admin_context': AdminContext(request)} + context.update(extra_context) + return super().render_change_form( + request=request, context=context, add=add, + change=change, form_url=form_url, obj=obj) def add_view(self, request, *args, **kwargs): raise PermissionDenied @@ -196,18 +246,8 @@ def add_view(self, request, *args, **kwargs): def make_folder(self, request, folder_id=None, *args, **kwargs): response = super(FolderAdmin, self).add_view(request, *args, **kwargs) - # since filer overwrites django's dismissPopup we need to make sure - # that the response from django's add_view is the - # dismiss popup response so we can overwrite it - # since only save button appears its enough to make sure that the - # request is a POST from a popup view and the response is a - # successed HttpResponse if (request.method == 'POST' and popup_status(request) and not isinstance(response, HttpResponseRedirect)): - # In Django 4.2+, a successful popup add returns status 200 with - # dismiss script. A form validation error also returns 200 but - # with a re-rendered form. Only show dismiss when there are no - # form errors (i.e. no 'errorlist' in the rendered content). if hasattr(response, 'render'): response = response.render() content = getattr(response, 'content', b'') @@ -218,83 +258,139 @@ def make_folder(self, request, folder_id=None, *args, **kwargs): return response def delete_view(self, request, object_id, extra_context=None): - # override delete view since we need to hide already trashed - # files/folders - opts = self.model._meta - obj = self.get_object(request, unquote(object_id)) - - if obj is None: - raise Http404(_('%(name)s object with primary key %(key)r ' - 'does not exist.') % { - 'name': force_str(opts.verbose_name), - 'key': escape(object_id)}) - if obj.parent: - redirect_url = reverse('admin:filer-directory_listing', - kwargs={'folder_id': obj.parent_id}) - else: - redirect_url = reverse('admin:filer-directory_listing-root') - redirect_url = "%s%s%s%s" % (redirect_url, popup_param(request), - selectfolder_param(request, "&"), - current_site_param(request),) - - setattr(request, 'current_dir_list_folder', - obj.parent or FolderRoot()) - - response = self.delete_files_or_folders( + """ + Overrides the default to enable redirecting to the directory view after + deletion of a folder. + + we need to fetch the object and find out who the parent is + before super, because super will delete the object and make it + impossible to find out the parent folder to redirect to. + + The delete_view breaks with polymorphic models if the cascade will + try delete objects that are of different polymorphic types + (AttributeError: 'File' object has no attribute 'file_ptr'). + The default implementation of the delete_view is hard to override + without just copying the whole big thing. Since we've already done + the overriding work on the delete_files_or_folders admin action, we + can re-use that here instead. + """ + try: + obj = self.get_queryset(request).get(pk=unquote(object_id)) + parent_folder = obj.parent + except self.model.DoesNotExist: + parent_folder = None + + # PBS: block deletion of core folders + if obj and not self.has_delete_permission(request, obj): + from django.http import HttpResponseForbidden + return HttpResponseForbidden("Permission denied") + + if request.POST: + self.delete_files_or_folders( + request, + files_queryset=File.objects.none(), + folders_queryset=self.get_queryset(request).filter(id=object_id) + ) + if parent_folder: + url = reverse('admin:filer-directory_listing', + kwargs={'folder_id': parent_folder.id}) + else: + url = reverse('admin:filer-directory_listing-root') + url = "{}{}".format( + url, + admin_url_params_encoded(request), + ) + return HttpResponseRedirect(url) + + return self.delete_files_or_folders( request, - File.objects.none(), - Folder.objects.filter(id=obj.id)) + files_queryset=File.objects.none(), + folders_queryset=self.get_queryset(request).filter(id=object_id) + ) - if response is None: - return HttpResponseRedirect(redirect_url) - return response + def icon_img(self, xs): + return format_html('Folder Icon', django_settings.STATIC_ROOT) + icon_img.allow_tags = True + + def get_urls(self): + return [ + # we override the default list view with our own directory listing + # of the root directories + path('', + self.admin_site.admin_view(self.directory_listing), + name='filer-directory_listing-root'), + + path('last/', + self.admin_site.admin_view(self.directory_listing), + {'viewtype': 'last'}, + name='filer-directory_listing-last'), + + path('/list/', + self.admin_site.admin_view(self.directory_listing), + name='filer-directory_listing'), + + path('/make_folder/', + self.admin_site.admin_view(self.make_folder), + name='filer-directory_listing-make_folder'), + path('make_folder/', + self.admin_site.admin_view(self.make_folder), + name='filer-directory_listing-make_root_folder'), + + path('images_with_missing_data/', + self.admin_site.admin_view(self.directory_listing), + {'viewtype': 'images_with_missing_data'}, + name='filer-directory_listing-images_with_missing_data'), + + path('unfiled_images/', + self.admin_site.admin_view(self.directory_listing), + {'viewtype': 'unfiled_images'}, + name='filer-directory_listing-unfiled_images'), + + path('destination_folders/', + self.admin_site.admin_view(self.destination_folders), + name='filer-destination_folders'), + ] + super().get_urls() # custom views def directory_listing(self, request, folder_id=None, viewtype=None): - user = request.user - clipboard = tools.get_user_clipboard(user) + if not request.user.has_perm("filer.can_use_directory_listing"): + raise PermissionDenied() file_type = request.GET.get('file_type', None) if viewtype == 'images_with_missing_data': folder = ImagesWithMissingData() - folder_file_qs = folder.files elif viewtype == 'unfiled_images': - folder = UnfiledImages() - folder_file_qs = folder.files - elif folder_id is None: - folder = FolderRoot() - folder_file_qs = File.objects.none() - else: + # pass user in the class invocation, so that we can get + # access to the current user instance in the class + folder = UnsortedImages(user=request.user) + elif viewtype == 'last': + last_folder_id = request.session.get('filer_last_folder_id') try: - folder = Folder.objects.get(id=folder_id) - if not self.can_view_folder_content(request, folder): - raise PermissionDenied - except Folder.DoesNotExist: - raise Http404 - if file_type == 'image': - folder_file_qs = Image.objects.filter(folder=folder) + self.get_queryset(request).get(id=last_folder_id) + except self.model.DoesNotExist: + url = reverse('admin:filer-directory_listing-root') + url = f"{url}{admin_url_params_encoded(request)}" else: - folder_file_qs = File.objects.filter(folder=folder) - - if file_type == 'image': - all_file_qs = Image.objects + url = reverse('admin:filer-directory_listing', kwargs={'folder_id': last_folder_id}) + url = f"{url}{admin_url_params_encoded(request)}" + return HttpResponseRedirect(url) + elif folder_id is None: + folder = FolderRoot() else: - all_file_qs = File.objects - - setattr(request, 'current_dir_list_folder', folder) - # search - q = request.GET.get('q', None) - if q: - search_terms = q.split(" ") + folder = get_object_or_404(self.get_queryset(request), id=folder_id) + request.session['filer_last_folder_id'] = folder_id + + list_type = get_directory_listing_type(request) or settings.FILER_FOLDER_ADMIN_DEFAULT_LIST_TYPE + if list_type == TABLE_LIST_TYPE: + # Prefetch thumbnails for table view + size = f"{FILER_TABLE_ICON_SIZE}x{FILER_TABLE_ICON_SIZE}" + size_x2 = f"{2 * FILER_TABLE_ICON_SIZE}x{2 * FILER_TABLE_ICON_SIZE}" else: - search_terms = [] - q = '' + # Prefetch thumbnails for thumbnail view + size = f"{FILER_THUMBNAIL_ICON_SIZE}x{FILER_THUMBNAIL_ICON_SIZE}" + size_x2 = f"{2 * FILER_THUMBNAIL_ICON_SIZE}x{2 * FILER_THUMBNAIL_ICON_SIZE}" # Check actions to see if any are available on this changelist - # do not let any actions available if we're in search view since - # there is no way to detect the current folder - actions = {} - if not search_terms: - actions = self.get_actions(request) + actions = self.get_actions(request) # Remove action checkboxes if there aren't any actions available. list_display = list(self.list_display) @@ -304,77 +400,120 @@ def directory_listing(self, request, folder_id=None, viewtype=None): except ValueError: pass + # search + q = request.GET.get('q') + if q: + search_terms = urlunquote(q).split(' ') + search_mode = True + else: + search_terms = [] + q = '' + search_mode = False + # Limit search results to current folder. limit_search_to_folder = request.GET.get('limit_search_to_folder', False) in (True, 'on') - current_site = request.GET.get('current_site', None) - _filter_folders = partial(folders_available, current_site, request.user) - _filter_files = partial(files_available, current_site, request.user) if len(search_terms) > 0: if folder and limit_search_to_folder and not folder.is_root: - descendants = folder.get_descendants( - include_self=True).filter(deleted_at__isnull=True) - folder_qs = _filter_folders(descendants.exclude(id=folder.id)) - file_qs = _filter_files(all_file_qs.filter(folder__in=descendants)) + desc_folder_ids = folder.get_descendants_ids() + # Do not include current folder itself in search results. + folder_qs = Folder.objects.filter(pk__in=desc_folder_ids) + # Limit search results to files in the current folder or any + # nested folder. + file_qs = File.objects.filter(folder_id__in=desc_folder_ids + [folder.pk]) else: - folder_qs = _filter_folders(Folder.objects.all()) - file_qs = _filter_files(all_file_qs) - - def folder_search_qs(qs, terms=[]): - for term in terms: - qs = qs.filter(Q(name__icontains=term) | - Q(owner__username__icontains=term) | - Q(owner__first_name__icontains=term) | - Q(owner__last_name__icontains=term)) - return qs - - def file_search_qs(qs, terms=[]): - for term in terms: - qs = qs.filter(Q(name__icontains=term) | - Q(description__icontains=term) | - Q(original_filename__icontains=term) | - Q(owner__username__icontains=term) | - Q(owner__first_name__icontains=term) | - Q(owner__last_name__icontains=term)) - return qs - - folder_qs = folder_search_qs(folder_qs, search_terms) - file_qs = file_search_qs(file_qs, search_terms) + folder_qs = self.get_queryset(request) + file_qs = File.objects.all() + folder_qs = self.filter_folder(folder_qs, search_terms).prefetch_related("children", "all_files") + file_qs = self.filter_file(file_qs, search_terms) + show_result_count = True else: - folder_qs = _filter_folders(folder.children.all()) - file_qs = _filter_files(folder_file_qs) + folder_qs = folder.children.all() + file_qs = folder.files.all() show_result_count = False - folder_qs = folder_qs.order_by('name') - file_qs = file_qs.order_by('name') - if show_result_count: - show_result_count = { - 'files_found': file_qs.count(), - 'folders_found': folder_qs.count(), + # PBS: filter by file_type if requested + if file_type == 'image': + file_qs = file_qs.instance_of(Image) + + folder_qs = folder_qs.order_by('name').select_related("owner") + order_by = request.GET.get('order_by', None) + order_by_annotation = None + if order_by is None: + order_by_annotation = Lower(Coalesce( + Case( + When(name__exact='', then=None), + When(name__isnull=False, then='name') + ), + 'original_filename' + )) + + order_by = order_by.split(',') if order_by else [] + order_by = [field for field in order_by + if re.sub(r'^-', '', field) in self.order_by_file_fields] + if len(order_by) > 0: + file_qs = file_qs.order_by(*order_by) + elif order_by_annotation: + file_qs = file_qs.order_by(order_by_annotation) + + if folder.is_root and not search_mode: + virtual_items = folder.virtual_folders + else: + virtual_items = [] + + perms = FolderPermission.objects.get_read_id_list(request.user) + if perms != 'All': + file_qs = file_qs.filter( + models.Q(folder__id__in=perms) + | models.Q(folder_id__isnull=True) + | models.Q(owner=request.user) + ) + folder_qs = folder_qs.filter(models.Q(id__in=perms) | models.Q(owner=request.user)) + root_exclude_kwargs = {'parent__isnull': False, 'parent__id__in': perms} + else: + root_exclude_kwargs = {'parent__isnull': False} + if folder.is_root: + folder_qs = folder_qs.exclude(**root_exclude_kwargs) + + # Annotate thumbnail status + thumbnail_qs = ( + Thumbnail.objects + .filter( + source__name=OuterRef("file"), + modified__gte=F("source__modified"), + ) + .exclude(name__contains="upscale") # TODO: Check WHY not used by directory listing + .order_by("-modified") + ) + file_qs = file_qs.annotate( + thumbnail_name=Subquery(thumbnail_qs.filter(name__contains=f"__{size}_").values_list("name")[:1]), + thumbnailx2_name=Subquery(thumbnail_qs.filter(name__contains=f"__{size_x2}_").values_list("name")[:1]) + ).select_related("owner") + + try: + permissions = { + 'has_edit_permission': folder.has_edit_permission(request), + 'has_read_permission': folder.has_read_permission(request), + 'has_add_children_permission': + folder.has_add_children_permission(request), } + except: # noqa + permissions = {} - items = MultiMoldelQuerysetChain([folder_qs, file_qs]) + items = list(itertools.chain(folder_qs, file_qs)) paginator = Paginator(items, FILER_PAGINATE_BY) - # Are we moving to clipboard? - if request.method == 'POST' and '_save' not in request.POST: - for f in file_qs: - if "move-to-clipboard-%d" % (f.id,) in request.POST: - if (f.is_readonly_for_user(user) or - f.is_restricted_for_user(user)): - raise PermissionDenied - tools.move_file_to_clipboard(request, [f], clipboard) - return HttpResponseRedirect(request.get_full_path()) selected = request.POST.getlist(helpers.ACTION_CHECKBOX_NAME) # Actions with no confirmation - if (actions and request.method == 'POST' and - 'index' in request.POST and '_save' not in request.POST): + if ( + actions and request.method == 'POST' + and 'index' in request.POST + and '_save' not in request.POST + ): if selected: - response = self.response_action(request, - files_queryset=file_qs, - folders_queryset=folder_qs) + response = self.response_action(request, files_queryset=file_qs, folders_queryset=folder_qs) if response: return response else: @@ -383,71 +522,124 @@ def file_search_qs(qs, terms=[]): self.message_user(request, msg) # Actions with confirmation - if (actions and request.method == 'POST' and - helpers.ACTION_CHECKBOX_NAME in request.POST and - 'index' not in request.POST and '_save' not in request.POST): + if ( + actions and request.method == 'POST' + and helpers.ACTION_CHECKBOX_NAME in request.POST + and 'index' not in request.POST + and '_save' not in request.POST + ): if selected: - response = self.response_action(request, - files_queryset=file_qs, - folders_queryset=folder_qs) + response = self.response_action(request, files_queryset=file_qs, folders_queryset=folder_qs) if response: return response # Build the action form and populate it with available actions. if actions: action_form = self.action_form(auto_id=None) - action_form.fields['action'].choices = \ - self.get_action_choices(request) + action_form.fields['action'].choices = self.get_action_choices(request) else: action_form = None - selection_note_all = ngettext_lazy( - '%(total_count)s selected', - 'All %(total_count)s selected', - paginator.count - ) - # Make sure page request is an int. If not, deliver first page. - try: - page = int(request.GET.get('page', '1')) - except ValueError: - page = 1 + selection_note_all = ngettext_lazy('%(total_count)s selected', + 'All %(total_count)s selected', paginator.count) # If page request (9999) is out of range, deliver last page of results. try: - paginated_items = paginator.page(page) - except (EmptyPage, InvalidPage): + paginated_items = paginator.page(request.GET.get('page', 1)) + except PageNotAnInteger: + paginated_items = paginator.page(1) + except EmptyPage: paginated_items = paginator.page(paginator.num_pages) - context = self.admin_site.each_context(request) + + context = self.admin_site.each_context(request) context.update({ - 'folder': folder, - 'user_clipboard': clipboard, - 'clipboard_files': clipboard.files.distinct(), - 'current_site': get_param_from_request(request, 'current_site'), - 'paginator': paginator, - 'paginated_items': paginated_items, - 'current_url': request.path, - 'title': 'Directory listing for %s' % folder.name, - 'search_string': ' '.join(search_terms), - 'q': q, - 'show_result_count': show_result_count, - 'limit_search_to_folder': limit_search_to_folder, - 'is_popup': popup_status(request), - 'select_folder': selectfolder_status(request), - # needed in the admin/base.html template for logout links - 'root_path': reverse('admin:index'), - 'action_form': action_form, - 'actions_on_top': self.actions_on_top, - 'actions_on_bottom': self.actions_on_bottom, - 'actions_selection_counter': self.actions_selection_counter, - 'selection_note': _('0 of %(cnt)s selected') % { - 'cnt': len(paginated_items.object_list)}, - 'selection_note_all': selection_note_all % { - 'total_count': paginator.count}, - 'media': self.media, - 'file_type': file_type, - }) - response = render(request, 'admin/filer/folder/directory_listing.html', context) - return response + 'folder': folder, + 'paginator': paginator, + 'paginated_items': paginated_items, + 'virtual_items': virtual_items, + 'uploader_connections': settings.FILER_UPLOADER_CONNECTIONS, + 'max_files': settings.FILER_UPLOADER_MAX_FILES, + 'max_filesize': settings.FILER_UPLOADER_MAX_FILE_SIZE, + 'permissions': permissions, + 'permstest': userperms_for_request(folder, request), + 'current_url': request.path, + 'title': _('Directory listing for %(folder_name)s') % {'folder_name': folder.name}, + 'search_string': ' '.join(search_terms), + 'q': urlquote(q), + 'show_result_count': show_result_count, + 'folder_children': folder_qs, + 'folder_files': file_qs, + 'thumbnail_size': FILER_TABLE_ICON_SIZE if list_type == TABLE_LIST_TYPE else FILER_THUMBNAIL_ICON_SIZE, + 'limit_search_to_folder': limit_search_to_folder, + 'is_popup': popup_status(request), + 'filer_admin_context': AdminContext(request), + # needed in the admin/base.html template for logout links + 'root_path': reverse('admin:index'), + 'action_form': action_form, + 'actions_on_top': self.actions_on_top, + 'actions_on_bottom': self.actions_on_bottom, + 'actions_selection_counter': self.actions_selection_counter, + 'selection_note': _('0 of %(cnt)s selected') % {'cnt': len(paginated_items.object_list)}, + 'selection_note_all': selection_note_all % {'total_count': paginator.count}, + 'list_type': list_type, + 'list_type_template': settings.FILER_FOLDER_ADMIN_LIST_TYPE_SWITCHER_SETTINGS[list_type]['template'], + 'media': self.media, + 'enable_permissions': settings.FILER_ENABLE_PERMISSIONS, + 'can_make_folder': request.user.is_superuser or (folder.is_root and settings.FILER_ALLOW_REGULAR_USERS_TO_ADD_ROOT_FOLDERS) or permissions.get("has_add_children_permission"), + }) + return TemplateResponse(request, self.directory_listing_template, context) + + def filter_folder(self, qs, terms=()): + # Source: https://github.com/django/django/blob/1.7.1/django/contrib/admin/options.py#L939-L947 flake8: noqa + def construct_search(field_name): + if field_name.startswith('^'): + return "%s__istartswith" % field_name[1:] + elif field_name.startswith('='): + return "%s__iexact" % field_name[1:] + elif field_name.startswith('@'): + return "%s__search" % field_name[1:] + else: + return "%s__icontains" % field_name + + for term in terms: + filters = models.Q() + for filter_ in self.search_fields: + filters |= models.Q(**{construct_search(filter_): term}) + for filter_ in self.get_owner_filter_lookups(): + filters |= models.Q(**{filter_: term}) + qs = qs.filter(filters) + return qs + + def filter_file(self, qs, terms=()): + for term in terms: + filters = (models.Q(name__icontains=term) + | models.Q(description__icontains=term) + | models.Q(original_filename__icontains=term)) + for filter_ in self.get_owner_filter_lookups(): + filters |= models.Q(**{filter_: term}) + qs = qs.filter(filters) + return qs + + @property + def owner_search_fields(self): + """ + Returns all the fields that are CharFields except for password from the + User model. For the built-in User model, that means username, + first_name, last_name, and email. + """ + from django.contrib.auth import get_user_model + User = get_user_model() + + return [ + field.name for field in User._meta.fields + if isinstance(field, models.CharField) and field.name != 'password' + ] + + def get_owner_filter_lookups(self): + return [ + f'owner__{field}__icontains' + for field in self.owner_search_fields + ] def response_action(self, request, files_queryset, folders_queryset): """ @@ -492,8 +684,8 @@ def response_action(self, request, files_queryset, folders_queryset): # the action explicitly on all objects. selected = request.POST.getlist(helpers.ACTION_CHECKBOX_NAME) if not selected and not select_across: - # Reminder that something needs to be selected or - # nothing will happen + # Reminder that something needs to be selected or nothing + # will happen msg = _("Items must be selected in order to perform " "actions on them. No items have been changed.") self.message_user(request, msg) @@ -529,162 +721,152 @@ def response_action(self, request, files_queryset, folders_queryset): return None def get_actions(self, request): - actions = super(FolderAdmin, self).get_actions(request) - - def pop_actions(*actions_to_remove): - for action in actions_to_remove: - actions.pop(action, None) - - pop_actions('delete_selected') - - if not self.has_delete_permission(request, None): - pop_actions(*self.actions_affecting_position) - - current_folder = getattr(request, 'current_dir_list_folder', None) - if not current_folder: - return actions - - if current_folder.is_root: - pop_actions('extract_files') + if settings.FILER_ENABLE_PERMISSIONS: + actions = OrderedDict() + actions['files_set_public'] = self.get_action('files_set_public') + actions['files_set_private'] = self.get_action('files_set_private') + actions.update(super().get_actions(request)) + else: + actions = super().get_actions(request) - if (not current_folder.is_root and - current_folder.is_readonly_for_user(request.user)): - return {} + if 'delete_selected' in actions: + del actions['delete_selected'] + return actions - if isinstance(current_folder, UnfiledImages): - pop_actions('enable_restriction', 'copy_files_and_folders', - 'disable_restriction') - return actions - # actions are available for descendants not for current folder - if not (current_folder.can_change_restricted(request.user) and - not current_folder.restricted): - pop_actions('enable_restriction', 'disable_restriction') + def files_set_public_or_private(self, request, set_public, files_queryset, + folders_queryset): + """ + Action which enables or disables permissions for selected files and + files in selected folders (set them private or public). + """ - if (actions and current_folder.is_restricted_for_user(request.user)): - # allow only copy - if 'copy_files_and_folders' in actions: - return {'copy_files_and_folders': - actions['copy_files_and_folders']} + if not self.has_change_permission(request): + raise PermissionDenied - return actions + permissions_enabled = settings.FILER_ENABLE_PERMISSIONS - def move_to_clipboard(self, request, files_queryset, folders_queryset): - """ - Action which moves the selected files to clipboard. - """ - if request.method != 'POST': + if request.method != 'POST' or not permissions_enabled: return None - if not has_multi_file_action_permission( - request, files_queryset, - Folder.objects.none()): - raise PermissionDenied + check_files_edit_permissions(request, files_queryset) + check_folder_edit_permissions(request, folders_queryset) - clipboard = tools.get_user_clipboard(request.user) # We define it like that so that we can modify it inside the - # move_files function + # set_files function files_count = [0] - def move_files(files): - files_count[0] += tools.move_file_to_clipboard( - request, files, clipboard) + def set_files(files): + for f in files: + if f.is_public != set_public: + f.is_public = set_public + f.save() + files_count[0] += 1 - move_files(files_queryset) - if files_count[0] > 0: - self.message_user(request, - _("Successfully moved %(count)d files to clipboard.") % { - "count": files_count[0], }) + def set_folders(folders): + for f in folders: + set_files(f.files) + set_folders(f.children.all()) + + set_files(files_queryset) + set_folders(folders_queryset) + + if set_public: + self.message_user(request, _("Successfully disabled permissions for %(count)d files.") % {"count": files_count[0], }) else: - self.message_user(request, - _("No files were moved to clipboard.")) + self.message_user(request, _("Successfully enabled permissions for %(count)d files.") % {"count": files_count[0], }) + return None - move_to_clipboard.short_description = gettext_lazy( - "Move selected files to clipboard") - - def _get_unique_items(self, deletable_items, unique_items, depth=5): - count = 0 - if depth < 0: - return count - for elem in deletable_items: - if isinstance(elem, (list, tuple)): - count += self._get_unique_items(elem, unique_items, depth-1) - elif isinstance(elem, str): - match = ELEM_ID.match(elem) - elem_id = match and match.group('file_id') - if elem_id and elem_id not in unique_items: - unique_items.append(elem_id) - count += 1 - return count - - def delete_files_or_folders(self, request, - files_queryset, folders_queryset): + def files_set_private(self, request, files_queryset, folders_queryset): + return self.files_set_public_or_private(request, False, files_queryset, + folders_queryset) + + files_set_private.short_description = _("Enable permissions for selected files") + + def files_set_public(self, request, files_queryset, folders_queryset): + return self.files_set_public_or_private(request, True, files_queryset, + folders_queryset) + + files_set_public.short_description = _("Disable permissions for selected files") + + def log_deletions(self, request, queryset): + """Log deletion for each object in the queryset.""" + for obj in queryset: + self.log_deletion(request, obj, str(obj)) + + def delete_files_or_folders(self, request, files_queryset, folders_queryset): """ Action which deletes the selected files and/or folders. This action first displays a confirmation page whichs shows all the - deleteable files and/or folders, or, if the user has no permission - on one of the related childs (foreignkeys), a "permission denied" - message. + deletable files and/or folders, or, if the user has no permission on + one of the related childs (foreignkeys), a "permission denied" message. - Next, it delets all selected files and/or folders and redirects back - to the folder. + Next, it deletes all selected files and/or folders and redirects back to + the folder. """ + opts = self.model._meta + app_label = opts.app_label # Check that the user has delete permission for the actual model if not self.has_delete_permission(request): raise PermissionDenied - if not has_multi_file_action_permission( - request, files_queryset, folders_queryset): - raise PermissionDenied - - opts = self.model._meta - app_label = opts.app_label + # PBS: block deletion of readonly/core/restricted folders/files + if not has_multi_file_action_permission(request, files_queryset, folders_queryset): + messages.error(request, _("You do not have permission to delete " + "the selected files and/or folders.")) + return None current_folder = self._get_current_action_folder( request, files_queryset, folders_queryset) all_protected = [] + # Populate deletable_objects, a data structure of all related objects + # that will also be deleted. Hopefully this also checks for necessary + # permissions. + # TODO: Check if permissions are really verified using = router.db_for_write(self.model) - deletable_files, perms_needed_files, protected_files = \ - get_deleted_objects( - files_queryset, files_queryset.model._meta, - request.user, self.admin_site, using) - files_count = self._get_unique_items(deletable_files, unique_items=[]) - deletable_folders, perms_needed_folders, protected_folders = \ - get_deleted_objects( - folders_queryset, folders_queryset.model._meta, - request.user, self.admin_site, using) - folders_count = self._get_unique_items(deletable_folders, unique_items=[]) + deletable_files, model_count_files, perms_needed_files, protected_files = get_deleted_objects(files_queryset, files_queryset.model._meta, request.user, self.admin_site, using) + deletable_folders, model_count_folder, perms_needed_folders, protected_folders = get_deleted_objects(folders_queryset, folders_queryset.model._meta, request.user, self.admin_site, using) all_protected.extend(protected_files) all_protected.extend(protected_folders) all_deletable_objects = [deletable_files, deletable_folders] all_perms_needed = perms_needed_files.union(perms_needed_folders) - # The user has already confirmed the deletion. - # Do the deletion and return a None to display the change list - # view again. + # The user has already confirmed the deletion. Do the deletion and + # return a None to display the change list view again. if request.POST.get('post'): if all_perms_needed: raise PermissionDenied - total_count = files_count + folders_count - if total_count: + n = files_queryset.count() + folders_queryset.count() + if n: # delete all explicitly selected files - for file_obj in files_queryset: - self.log_deletion(request, file_obj, force_str(file_obj)) - file_obj.delete() - # delete all folders - for file_id in folders_queryset.values_list('id', flat=True): - file_obj = Folder.objects.get(id=file_id) - self.log_deletion(request, file_obj, force_str(file_obj)) - file_obj.delete() - self.message_user(request, - _("Successfully deleted %(count)d files " - "and/or folders.") % {"count": total_count, }) + self.log_deletions(request, files_queryset) + # Still need to delete files individually (not only the database entries) + for f in files_queryset: + f.delete() + # delete all files in all selected folders and their children + # This would happen automatically by ways of the delete + # cascade, but then the individual .delete() methods won't be + # called and the files won't be deleted from the filesystem. + folder_ids = set() + for folder in folders_queryset: + folder_ids.add(folder.id) + folder_ids.update(folder.get_descendants_ids()) + qs = File.objects.filter(folder__in=folder_ids) + self.log_deletions(request, qs) + # Still need to delete files individually (not only the database entries) + for f in qs: + f.delete() + # delete all folders individually to trigger soft-delete + self.log_deletions(request, folders_queryset) + for folder in folders_queryset: + folder.delete() + self.message_user(request, _("Successfully deleted %(count)d files and/or folders.") % {"count": n, }) # Return None to display the change list page again. return None @@ -693,7 +875,8 @@ def delete_files_or_folders(self, request, else: title = _("Are you sure?") - context = { + context = self.admin_site.each_context(request) + context.update({ "title": title, "instance": current_folder, "breadcrumbs_action": _("Delete files and/or folders"), @@ -704,17 +887,20 @@ def delete_files_or_folders(self, request, "protected": all_protected, "opts": opts, 'is_popup': popup_status(request), - 'select_folder': selectfolder_status(request), + 'filer_admin_context': AdminContext(request), "root_path": reverse('admin:index'), "app_label": app_label, "action_checkbox_name": helpers.ACTION_CHECKBOX_NAME, - } - context.update(self.admin_site.each_context(request)) + }) + # Display the destination folder selection page - return render(request, "admin/filer/delete_selected_files_confirmation.html", context) + return TemplateResponse( + request, + "admin/filer/delete_selected_files_confirmation.html", + context + ) - delete_files_or_folders.short_description = gettext_lazy( - "Delete selected files and/or folders") + delete_files_or_folders.short_description = _("Delete selected files and/or folders") # Copied from django.contrib.admin.util def _format_callback(self, obj, user, admin_site, perms_needed): @@ -726,230 +912,356 @@ def _format_callback(self, obj, user, admin_site, perms_needed): opts.app_label, opts.object_name.lower()), None, (quote(obj._get_pk_val()),)) - get_permission_codename('delete', opts) - p = '%s.%s' % (opts.app_label, - get_permission_codename('delete', opts)) - # Also check permissions on individual objects - if not user.has_perm(p, obj) and not user.has_perm(p): + p = get_delete_permission(opts) + if not user.has_perm(p): perms_needed.add(opts.verbose_name) # Display a link to the admin page. - return mark_safe('%s: %s' % - (escape(capfirst(opts.verbose_name)), - admin_url, - escape(obj.actual_name))) + return format_html('{}: {}', escape(capfirst(opts.verbose_name)), admin_url, escape(obj)) else: # Don't display link to edit, because it either has no # admin or is edited inline. - return '%s: %s' % (capfirst(opts.verbose_name), - force_str(obj.actual_name)) - - def _get_current_action_folder(self, request, files_qs, folders_qs): - current_folder = getattr(request, 'current_dir_list_folder', None) - if current_folder: - return current_folder - - if files_qs: - return files_qs[0].folder - elif folders_qs: - return folders_qs[0].parent + return f'{capfirst(opts.verbose_name)}: {force_str(obj)}' + + def _check_copy_perms(self, request, files_queryset, folders_queryset): + try: + check_files_read_permissions(request, files_queryset) + check_folder_read_permissions(request, folders_queryset) + except PermissionDenied: + return True + return False + + def _check_move_perms(self, request, files_queryset, folders_queryset): + try: + check_files_read_permissions(request, files_queryset) + check_folder_read_permissions(request, folders_queryset) + check_files_edit_permissions(request, files_queryset) + check_folder_edit_permissions(request, folders_queryset) + except PermissionDenied: + return True + return False + + def _get_current_action_folder(self, request, files_queryset, + folders_queryset): + if files_queryset: + return files_queryset[0].folder + elif folders_queryset: + return folders_queryset[0].parent else: return None def _list_folders_to_copy_or_move(self, request, folders): for fo in folders: - yield self._format_callback( - fo, request.user, self.admin_site, set()) - children = list(self._list_folders_to_copy_or_move( - request, fo.children.all())) - children.extend([self._format_callback( - f, request.user, self.admin_site, set()) - for f in sorted(fo.files)]) + yield self._format_callback(fo, request.user, self.admin_site, set()) + children = list(self._list_folders_to_copy_or_move(request, fo.children.all())) + children.extend([self._format_callback(f, request.user, self.admin_site, set()) for f in sorted(fo.files)]) if children: yield children - def _list_all_to_copy_or_move(self, request, - files_queryset, folders_queryset): - to_copy_or_move = list(self._list_folders_to_copy_or_move( - request, folders_queryset)) - to_copy_or_move.extend([self._format_callback( - f, request.user, self.admin_site, set()) - for f in sorted(files_queryset)]) + def _list_all_to_copy_or_move(self, request, files_queryset, folders_queryset): + to_copy_or_move = list(self._list_folders_to_copy_or_move(request, folders_queryset)) + to_copy_or_move.extend([self._format_callback(f, request.user, self.admin_site, set()) for f in sorted(files_queryset)]) return to_copy_or_move - def _move_files_and_folders_impl(self, files_queryset, folders_queryset, - destination): - for f in files_queryset: - f.folder = destination - f.save() - for f_id in folders_queryset.values_list('id', flat=True): - f = Folder.objects.get(id=f_id) - f.parent = destination - f.save() + def _list_all_destination_folders_recursive(self, request, folders_queryset, current_folder, folders, allow_self, level): + for fo in folders: + if not allow_self and fo in folders_queryset: + # We do not allow moving to selected folders or their descendants + continue - def _as_folder(self, request_data, param): - try: - return Folder.objects.get(id=int(request_data.get(param, None))) - except (Folder.DoesNotExist, ValueError, TypeError): - return None + if not fo.has_read_permission(request): + continue - def _clean_destination(self, request, current_folder, - selected_folders): - destination = self._as_folder(request.POST, 'destination') - if not destination: - raise PermissionDenied - # check destination permissions - if not is_valid_destination(request, destination): - raise PermissionDenied - # don't allow copy/move from folder to the same folder - if (hasattr(current_folder, 'pk') and - destination.pk == current_folder.pk): - raise PermissionDenied - # don't allow selected folders to be copied/moved inside - # themselves or inside any of their descendants - for folder in selected_folders: - destination_in_selected = folder.get_descendants(include_self=True).filter(id=destination.pk).exists() - if destination_in_selected: - raise PermissionDenied - return destination + # We do not allow copying/moving back to the folder itself + enabled = (allow_self or fo != current_folder) and fo.has_add_children_permission(request) + yield (fo, (mark_safe(("  " * level) + force_str(fo)), enabled)) + yield from self._list_all_destination_folders_recursive(request, folders_queryset, current_folder, fo.children.all(), allow_self, level + 1) + + def _list_all_destination_folders(self, request, folders_queryset, current_folder, allow_self): + root_folders = self.get_queryset(request).filter(parent__isnull=True).order_by('name') + return list(self._list_all_destination_folders_recursive(request, folders_queryset, current_folder, root_folders, allow_self, 0)) def destination_folders(self, request): - all_required = all(( - request.method == 'GET', - is_ajax(request), - request.user.is_authenticated, - 'parent' in request.GET - )) - if not all_required: - raise PermissionDenied + """ + AJAX view returning JSON list of destination folders for the fancytree + widget used in move/copy operations. + PBS: Filters by site access, excludes core folders and orphaned folders. + """ + import json + selected_folders_raw = request.GET.get('selected_folders', '[]') + try: + selected_ids = json.loads(selected_folders_raw) + except (json.JSONDecodeError, TypeError): + selected_ids = [] + selected_qs = self.get_queryset(request).filter(pk__in=selected_ids) + + current_folder_id = request.GET.get('current_folder') + current_folder = None + if current_folder_id and current_folder_id != 'null': + try: + current_folder = self.get_queryset(request).get(pk=int(current_folder_id)) + except (Folder.DoesNotExist, ValueError): + pass + + parent_raw = request.GET.get('parent') + if parent_raw and parent_raw != 'null': + try: + parent_id = int(parent_raw) + folders = self.get_queryset(request).filter(parent_id=parent_id).order_by('name') + except (ValueError, TypeError): + folders = self.get_queryset(request).filter(parent__isnull=True).order_by('name') + else: + folders = self.get_queryset(request).filter(parent__isnull=True).order_by('name') - def _valid_candidates(request, candidates_qs, selected): - # exclude orphaned/core/shared/restricted or any selected folders - current_site = request.GET.get('current_site', None) - return folders_available(current_site, request.user, candidates_qs) \ - .valid_destinations(request.user) \ - .unrestricted(request.user) \ - .exclude(id__in=selected) - - current_folder = self._as_folder(request.GET, 'current_folder') - parent = self._as_folder(request.GET, 'parent') - selected_ids = [_f for _f in [f_id or None for f_id in json.loads(request.GET.get('selected_folders') or '[]')] if _f] - candidates = Folder.objects.filter(parent=parent) - fancytree_candidates = [] - for folder in _valid_candidates(request, candidates, selected_ids): - has_children = _valid_candidates( - request, Folder.objects.filter(parent=folder), selected_ids - ).exists() - # don't allow move/copy files&folders to itself - disabled = current_folder and current_folder.pk == folder.pk - fancytree_candidates.append({ - 'title': folder.name, - 'key': "%d" % folder.pk, - 'folder': has_children, + result = [] + for fo in folders: + if fo in selected_qs: + continue + if not fo.has_read_permission(request): + continue + # PBS: exclude core folders and orphaned folders (no site) as destinations + if fo.is_core(): + continue + if fo.parent is None and not fo.site: + continue + is_selectable = (fo != current_folder) and fo.has_add_children_permission(request) + has_children = fo.children.exists() + result.append({ + 'key': fo.pk, + 'title': fo.name, + 'folder': True, 'lazy': has_children, - 'hideCheckbox': disabled, - 'unselectable': disabled, - 'icon': folder.icons.get('32', '') + 'unselectable': not is_selectable, }) + return JsonResponse(result, safe=False) - return HttpResponse( - json.dumps(fancytree_candidates), content_type="application/json") + def _move_files_and_folders_impl(self, files_queryset, folders_queryset, destination): + for f in files_queryset: + f.folder = destination + f.save() + for f_id in folders_queryset.values_list('id', flat=True): + f = Folder.objects.get(id=f_id) + f.parent = destination + f.save() + + def _validate_destination(self, request, destination, folders_queryset, current_folder, allow_self=False): + """ + Validate that destination is a legitimate target for copy/move without + recursively traversing the entire folder tree. Returns True if valid. + """ + if not destination.has_read_permission(request): + return False + if not destination.has_add_children_permission(request): + return False + if not allow_self and destination == current_folder: + return False + # Cannot move/copy into one of the selected folders or their descendants + selected_pks = set(folders_queryset.values_list('pk', flat=True)) + if destination.pk in selected_pks: + return False + # Check that destination is not a descendant of any selected folder + ancestor = destination.parent + while ancestor is not None: + if ancestor.pk in selected_pks: + return False + ancestor = ancestor.parent + return True - def move_files_and_folders(self, request, - selected_files, selected_folders): + def move_files_and_folders(self, request, files_queryset, folders_queryset): opts = self.model._meta app_label = opts.app_label - if not has_multi_file_action_permission(request, selected_files, selected_folders): - messages.error(request, "You are not allowed to move some of the "\ - "files and folders you selected.") - return - - if selected_folders.filter(parent=None).exists(): + # PBS: prevent moving root folders + if folders_queryset.filter(parent=None).exists(): messages.error(request, "To prevent potential problems, users " "are not allowed to move root folders. You may copy folders " "and files.") return - current_folder = self._get_current_action_folder( - request, selected_files, selected_folders) - to_move = self._list_all_to_copy_or_move( - request, selected_files, selected_folders) + current_folder = self._get_current_action_folder(request, files_queryset, folders_queryset) + perms_needed = self._check_move_perms(request, files_queryset, folders_queryset) + to_move = self._list_all_to_copy_or_move(request, files_queryset, folders_queryset) if request.method == 'POST' and request.POST.get('post'): + if perms_needed: + raise PermissionDenied try: - destination = self._clean_destination( - request, current_folder, selected_folders) - except PermissionDenied: - messages.error(request, "The destination was not valid so the selected "\ - "files and folders were not moved. Please try again.") - return + destination = self.get_queryset(request).get(pk=request.POST.get('destination')) + except self.model.DoesNotExist: + raise PermissionDenied + if not self._validate_destination(request, destination, folders_queryset, current_folder): + raise PermissionDenied + + # PBS: validate destination is not a core folder + if destination.is_core(): + messages.error(request, "You cannot move files/folders into a core folder.") + return None - # all folders need to belong to the same site as the - # destination site folder + # PBS: site consistency checks sites_from_folders = \ - set(selected_folders.values_list('site_id', flat=True)) | \ - set(selected_files.exclude(folder__isnull=True).\ + set(folders_queryset.values_list('site_id', flat=True)) | \ + set(files_queryset.exclude(folder__isnull=True).\ values_list('folder__site_id', flat=True)) - if (sites_from_folders and - None in sites_from_folders): + if sites_from_folders and None in sites_from_folders: messages.error(request, "Some of the selected files/folders " "do not belong to any site. Folders need to be assigned " "to a site before you can move files/folders from it.") return + elif not destination.site: + messages.error(request, "The destination folder does not " + "belong to any site.") + return elif len(sites_from_folders) > 1: - # it gets here if selection is made through a search view messages.error(request, "You cannot move files/folders that " "belong to several sites. Select files/folders that " "belong to only one site.") return - elif (sites_from_folders and + elif (sites_from_folders and destination.site and sites_from_folders.pop() != destination.site.id): messages.error(request, "Selected files/folders need to " "belong to the same site as the destination folder.") return - if not self._are_candidate_names_valid( - request, selected_files, selected_folders, destination): - return - # We count only topmost files and folders here - n = selected_files.count() + selected_folders.count() - if n: - self._move_files_and_folders_impl( - selected_files, selected_folders, destination) - self.message_user(request, - _("Successfully moved %(count)d files and/or " - "folders to folder '%(destination)s'.") % { - "count": n, - "destination": destination, - }) + n = files_queryset.count() + folders_queryset.count() + conflicting_names = [folder.name for folder in self.get_queryset(request).filter(parent=destination, name__in=folders_queryset.values('name'))] + if conflicting_names: + messages.error(request, _("Folders with names %s already exist at the selected " + "destination") % ", ".join(conflicting_names)) + elif n: + self._move_files_and_folders_impl(files_queryset, folders_queryset, destination) + self.message_user(request, _("Successfully moved %(count)d files and/or folders to folder '%(destination)s'.") % { + "count": n, + "destination": destination, + }) return None - context = { + context = self.admin_site.each_context(request) + context.update({ "title": _("Move files and/or folders"), "instance": current_folder, "breadcrumbs_action": _("Move files and/or folders"), "to_move": to_move, - "files_queryset": selected_files, - "folders_queryset": selected_folders, + "destination_folders": [], + "files_queryset": files_queryset, + "folders_queryset": folders_queryset, + "perms_lacking": perms_needed, "opts": opts, "root_path": reverse('admin:index'), "app_label": app_label, "action_checkbox_name": helpers.ACTION_CHECKBOX_NAME, - } - context.update(self.admin_site.each_context(request)) + }) + # Display the destination folder selection page - return render(request, "admin/filer/folder/choose_move_destination.html", context) + return TemplateResponse(request, "admin/filer/folder/choose_move_destination.html", context) + + move_files_and_folders.short_description = _("Move selected files and/or folders") + + def _rename_file(self, file_obj, form_data, counter, global_counter): + original_basename, original_extension = os.path.splitext(file_obj.original_filename) + if file_obj.name: + current_basename, current_extension = os.path.splitext(file_obj.name) + else: + current_basename = "" + current_extension = "" + file_obj.name = form_data['rename_format'] % { + 'original_filename': file_obj.original_filename, + 'original_basename': original_basename, + 'original_extension': original_extension, + 'current_filename': file_obj.name or "", + 'current_basename': current_basename, + 'current_extension': current_extension, + 'current_folder': getattr(file_obj.folder, 'name', ''), + 'counter': counter + 1, # 1-based + 'global_counter': global_counter + 1, # 1-based + } + file_obj.save() - move_files_and_folders.short_description = gettext_lazy( - "Move selected files and/or folders") + def _rename_files(self, files, form_data, global_counter): + n = 0 + for f in sorted(files): + self._rename_file(f, form_data, n, global_counter + n) + n += 1 + return n + + def _rename_folder(self, folder, form_data, global_counter): + return self._rename_files_impl(folder.files.all(), folder.children.all(), form_data, global_counter) + + def _rename_files_impl(self, files_queryset, folders_queryset, form_data, global_counter): + n = 0 + + for f in folders_queryset: + n += self._rename_folder(f, form_data, global_counter + n) + + n += self._rename_files(files_queryset, form_data, global_counter + n) + + return n + + def rename_files(self, request, files_queryset, folders_queryset): + opts = self.model._meta + app_label = opts.app_label + + current_folder = self._get_current_action_folder(request, files_queryset, folders_queryset) + perms_needed = self._check_move_perms(request, files_queryset, folders_queryset) + to_rename = self._list_all_to_copy_or_move(request, files_queryset, folders_queryset) + + if request.method == 'POST' and request.POST.get('post'): + if perms_needed: + raise PermissionDenied + form = RenameFilesForm(request.POST) + if form.is_valid(): + if files_queryset.count() + folders_queryset.count(): + n = self._rename_files_impl(files_queryset, folders_queryset, form.cleaned_data, 0) + self.message_user(request, _("Successfully renamed %(count)d files.") % { + "count": n, + }) + return None + else: + form = RenameFilesForm() - def extract_files(self, request, files_queryset, folder_queryset): + context = self.admin_site.each_context(request) + context.update({ + "title": _("Rename files"), + "instance": current_folder, + "breadcrumbs_action": _("Rename files"), + "to_rename": to_rename, + "rename_form": form, + "files_queryset": files_queryset, + "folders_queryset": folders_queryset, + "perms_lacking": perms_needed, + "opts": opts, + "root_path": reverse('admin:index'), + "app_label": app_label, + "action_checkbox_name": helpers.ACTION_CHECKBOX_NAME, + }) + + # Display the rename format selection page + return TemplateResponse(request, "admin/filer/folder/choose_rename_format.html", context) + + rename_files.short_description = _("Rename files") + + def extract_files(self, request, files_queryset, folders_queryset): + if request.method != 'POST': + return None + + from ..models import Archive success_format = "Successfully extracted archive {}." - files_queryset = files_queryset.filter( - polymorphic_ctype=ContentType.objects.get_for_model(Archive).id) + # Filter by zip file extension rather than polymorphic_ctype, + # because zip files may have been uploaded as plain File instances + zip_extensions = Archive._filename_extensions # ['.zip'] + from django.db.models import Q + extension_filter = Q() + for ext in zip_extensions: + extension_filter |= Q(original_filename__iendswith=ext) + extension_filter |= Q(file__iendswith=ext) + files_queryset = files_queryset.filter(extension_filter) + + if not files_queryset.exists(): + self.message_user(request, _("No archive files were selected."), + level=messages.WARNING) + return None + # cannot extract in unfiled files folder if files_queryset.filter(folder__isnull=True).exists(): raise PermissionDenied @@ -958,6 +1270,15 @@ def extract_files(self, request, files_queryset, folder_queryset): Folder.objects.none()): raise PermissionDenied + def _as_archive(filer_file): + """Convert a File instance to Archive so extract methods work.""" + if isinstance(filer_file, Archive): + return filer_file + archive = Archive() + archive.__dict__.update(filer_file.__dict__) + archive.extract_errors = [] + return archive + def is_valid_archive(filer_file): is_valid = filer_file.is_valid() if not is_valid: @@ -981,180 +1302,24 @@ def has_collisions(filer_file): return len(collisions) > 0 for f in files_queryset: + f = _as_archive(f) if not is_valid_archive(f) or has_collisions(f): continue - f.extract() - message = success_format.format(f.actual_name) - self.message_user(request, _(message)) - for err_msg in f.extract_errors: - messages.warning( - request, - _("%s: %s" % (f.actual_name, err_msg)) - ) - - extract_files.short_description = gettext_lazy( - "Extract selected zip files") - - def _copy_file(self, file_obj, destination, suffix, overwrite): - if overwrite: - # Not yet implemented as we have to find a portable - # (for different storage backends) way to overwrite files - raise NotImplementedError - - # We are assuming here that we are operating on an already saved - # database objects with current database state available - - # Due to how inheritance works, we have to set both pk and id to None - file_obj.pk = None - file_obj.id = None - file_obj.restricted = False - file_obj.folder = destination - # add suffix to actual name - if file_obj.name in ('', None): - file_obj.original_filename = self._generate_name( - file_obj.original_filename, suffix) - else: - file_obj.name = self._generate_name(file_obj.name, suffix) - new_path = file_obj.file.field.upload_to(file_obj, file_obj.actual_name) - file_obj.file = file_obj._copy_file(new_path) - file_obj.save() - - def _copy_files(self, files, destination, suffix, overwrite): - for f in files: - self._copy_file(f, destination, suffix, overwrite) - return len(files) - - def _copy_folder(self, folder, destination, suffix, overwrite): - if overwrite: - # Not yet implemented as we have to find a portable - # (for different storage backends) way to overwrite files - raise NotImplementedError - - foldername = self._generate_name(folder.name, suffix) - old_folder = Folder.objects.get(pk=folder.pk) - - # Due to how inheritance works, we have to set both pk and id to None - # lft and rght need to be reset since otherwise will see this node - # as 'already set up for insertion' and will not recalculate tree - # values - folder.pk = folder.id = folder.lft = folder.rght = None - folder.restricted = False - folder.name = foldername - folder.parent = destination - folder.save() - - return 1 + self._copy_files_and_folders_impl( - old_folder.files.all(), old_folder.children.all(), - folder, suffix, overwrite) - - def _copy_files_and_folders_impl(self, files_queryset, folders_queryset, - destination, suffix, overwrite): - - n = self._copy_files(files_queryset, destination, suffix, overwrite) - - for f_id in folders_queryset.values_list('id', flat=True): - f = Folder.objects.get(id=f_id) - destination = Folder.objects.get(id=destination.id) - n += self._copy_folder(f, destination, suffix, overwrite) - - return n - - def _generate_name(self, filename, suffix): - if not suffix: - return filename - basename, extension = os.path.splitext(filename) - return basename + suffix + extension - - def _are_candidate_names_valid( - self, request, file_qs, folder_qs, destination, suffix=None): - candidate_folder_names = [self._generate_name(name, suffix) - for name in folder_qs.values_list( - 'name', flat=True)] - candidate_file_names = [ - self._generate_name(file_obj.actual_name, suffix) - for file_obj in file_qs] - - existing_names = [f.actual_name - for f in destination.entries_with_names( - candidate_folder_names + candidate_file_names)] - - if existing_names: - messages.error(request, - _("File or folders with names %s already exist at the " - "selected destination") % ", ".join(existing_names)) - return False - return True - - def copy_files_and_folders(self, request, - files_queryset, folders_queryset): - opts = self.model._meta - app_label = opts.app_label - - current_folder = self._get_current_action_folder( - request, files_queryset, folders_queryset) - to_copy = self._list_all_to_copy_or_move( - request, files_queryset, folders_queryset) - - if request.method == 'POST' and request.POST.get('post'): - form = CopyFilesAndFoldersForm(request.POST) - if form.is_valid(): - try: - destination = self._clean_destination( - request, current_folder, folders_queryset) - except PermissionDenied: - messages.error(request, - _("The selected destination was not valid, so the selected "\ - "files and folders were not copied. Please try again.")) - return None - - suffix = form.cleaned_data['suffix'] - if not self._are_candidate_names_valid( - request, files_queryset, folders_queryset, - destination, suffix): return - - if files_queryset.count() + folders_queryset.count(): - # We count all files and folders here (recursivelly) - n = self._copy_files_and_folders_impl( - files_queryset, folders_queryset, destination, - suffix, False) - self.message_user(request, - _("Successfully copied %(count)d files and/or " - "folders to folder '%(destination)s'.") % { - "count": n, - "destination": destination, - }) - return None - else: - form = CopyFilesAndFoldersForm() - - try: - selected_destination_folder = \ - int(request.POST.get('destination', 0)) - except ValueError: - if current_folder: - selected_destination_folder = current_folder.pk - else: - selected_destination_folder = 0 - context = { - "title": _("Copy files and/or folders"), - "instance": current_folder, - "breadcrumbs_action": _("Copy files and/or folders"), - "to_copy": to_copy, - "selected_destination_folder": selected_destination_folder, - "copy_form": form, - "files_queryset": files_queryset, - "folders_queryset": folders_queryset, - "opts": opts, - "root_path": reverse('admin:index'), - "app_label": app_label, - "action_checkbox_name": helpers.ACTION_CHECKBOX_NAME, - } - context.update(self.admin_site.each_context(request)) - # Display the destination folder selection page - return render(request, "admin/filer/folder/choose_copy_destination.html", context) + try: + f.extract() + message = success_format.format(f.actual_name) + self.message_user(request, _(message)) + for err_msg in f.extract_errors: + messages.warning( + request, + _("%s: %s" % (f.actual_name, err_msg)) + ) + except Exception as e: + logger.exception("Exception extracting file pk=%s: %s", f.pk, e) + messages.error(request, _("Error extracting %s: %s" % (f.actual_name, str(e)))) + return None - copy_files_and_folders.short_description = gettext_lazy( - "Copy selected files and/or folders") + extract_files.short_description = _("Extract selected zip files") def files_toggle_restriction(self, request, restriction, files_qs, folders_qs): @@ -1172,7 +1337,7 @@ def files_toggle_restriction(self, request, restriction, return None if not has_multi_file_action_permission(request, files_qs, folders_qs): - messages.warning(request, _("You are not allowed to modify the restrictions on "\ + messages.warning(request, _("You are not allowed to modify the restrictions on " "the selected files and folders.")) return None @@ -1197,158 +1362,217 @@ def set_files_or_folders(filer_obj): _("Successfully disabled restriction for %(count)d files " "and/or folders.") % {"count": count,}) - return None - def enable_restriction(self, request, files_qs, folders_qs): return self.files_toggle_restriction( request, True, files_qs, folders_qs) - enable_restriction.short_description = gettext_lazy( - "Enable restriction for selected and/or folders") + enable_restriction.short_description = _("Enable role restriction for selected files and/or folders") def disable_restriction(self, request, files_qs, folders_qs): return self.files_toggle_restriction( request, False, files_qs, folders_qs) - disable_restriction.short_description = gettext_lazy( - "Disable restriction for selected and/or folders") + disable_restriction.short_description = _("Disable role restriction for selected files and/or folders") -''' - def _rename_file(self, file_obj, form_data, counter, global_counter): - original_basename, original_extension = os.path.splitext( - file_obj.original_filename) - if file_obj.name: - current_basename, current_extension = os.path.splitext( - file_obj.name) - else: - current_basename = "" - current_extension = "" - file_obj.name = form_data['rename_format'] % { - 'original_filename': file_obj.original_filename, - 'original_basename': original_basename, - 'original_extension': original_extension, - 'current_filename': file_obj.name or "", - 'current_basename': current_basename, - 'current_extension': current_extension, - 'current_folder': file_obj.folder.name, - 'counter': counter + 1, # 1-based - 'global_counter': global_counter + 1, # 1-based - } + def _generate_new_filename(self, filename, suffix): + basename, extension = os.path.splitext(filename) + return basename + suffix + extension + + def _copy_file(self, file_obj, destination, suffix, overwrite): + if overwrite: + # Not yet implemented as we have to find a portable (for different storage backends) way to overwrite files + raise NotImplementedError + + # We are assuming here that we are operating on an already saved database objects with current database state available + + filename = self._generate_new_filename(file_obj.file.name, suffix) + + # Due to how inheritance works, we have to set both pk and id to None + file_obj.pk = None + file_obj.id = None + file_obj.save() + file_obj.folder = destination + file_obj._file_data_changed_hint = False # no need to update size, sha1, etc. + file_obj.file = file_obj._copy_file(filename) + file_obj.original_filename = self._generate_new_filename(file_obj.original_filename, suffix) file_obj.save() - def _rename_files(self, files, form_data, global_counter): - n = 0 - for f in sorted(files): - self._rename_file(f, form_data, n, global_counter + n) - n += 1 - return n + def _copy_files(self, files, destination, suffix, overwrite): + for f in files: + self._copy_file(f, destination, suffix, overwrite) + return len(files) - def _rename_folder(self, folder, form_data, global_counter): - return self._rename_files_impl( - folder.files.all(), folder.children.all(), - form_data, global_counter) + def _get_available_name(self, destination, name): + count = itertools.count(1) + original = name + while destination.contains_folder(name): + name = f"{original}_{next(count)}" + return name - def _rename_files_impl(self, files_queryset, folders_queryset, - form_data, global_counter): - n = 0 + def _copy_folder(self, folder, destination, suffix, overwrite): + if overwrite: + # Not yet implemented as we have to find a portable (for different storage backends) way to overwrite files + raise NotImplementedError - for f in folders_queryset: - n += self._rename_folder(f, form_data, global_counter + n) + # TODO: Should we also allow not to overwrite the folder if it exists, but just copy into it? - n += self._rename_files(files_queryset, form_data, global_counter + n) + # TODO: Is this a race-condition? Would this be a problem? + foldername = self._get_available_name(destination, folder.name) + + old_folder = Folder.objects.get(pk=folder.pk) + + folder, _ = Folder.objects.get_or_create( + name=foldername, + owner=old_folder.owner, + parent=destination, + ) + + for perm in FolderPermission.objects.filter(folder=old_folder): + perm.pk = None + perm.id = None + perm.folder = folder + perm.save() + + return 1 + self._copy_files_and_folders_impl(old_folder.files.all(), old_folder.children.all(), folder, suffix, overwrite) + + def _copy_files_and_folders_impl(self, files_queryset, folders_queryset, destination, suffix, overwrite): + n = self._copy_files(files_queryset, destination, suffix, overwrite) + + for f in folders_queryset: + n += self._copy_folder(f, destination, suffix, overwrite) return n - def rename_files(self, request, files_queryset, folders_queryset): - # this logic needs to be suplimented with folder type permission layer + def copy_files_and_folders(self, request, files_queryset, folders_queryset): opts = self.model._meta app_label = opts.app_label - current_folder = self._get_current_action_folder( - request, files_queryset, folders_queryset) - to_rename = self._list_all_to_copy_or_move( - request, files_queryset, folders_queryset) + current_folder = self._get_current_action_folder(request, files_queryset, folders_queryset) + perms_needed = self._check_copy_perms(request, files_queryset, folders_queryset) + to_copy = self._list_all_to_copy_or_move(request, files_queryset, folders_queryset) if request.method == 'POST' and request.POST.get('post'): - form = RenameFilesForm(request.POST) + if perms_needed: + raise PermissionDenied + form = CopyFilesAndFoldersForm(request.POST) if form.is_valid(): + try: + destination = self.get_queryset(request).get(pk=request.POST.get('destination')) + except self.model.DoesNotExist: + raise PermissionDenied + if not self._validate_destination(request, destination, folders_queryset, current_folder): + raise PermissionDenied + + # PBS: validate destination is not a core folder + if destination.is_core(): + messages.warning(request, _("The selected destination was not valid. " + "You cannot copy files/folders into a core folder.")) + return None + + # PBS: site consistency checks (same as move) + sites_from_folders = \ + set(folders_queryset.values_list('site_id', flat=True)) | \ + set(files_queryset.exclude(folder__isnull=True).\ + values_list('folder__site_id', flat=True)) + if sites_from_folders and destination.site and \ + any(s != destination.site_id for s in sites_from_folders if s is not None): + messages.warning(request, _("The selected destination was not valid. " + "Selected files/folders need to belong to the same site as the destination folder.")) + return None + if files_queryset.count() + folders_queryset.count(): - n = self._rename_files_impl( - files_queryset, folders_queryset, - form.cleaned_data, 0) - self.message_user(request, - _("Successfully renamed %(count)d files.") % { - "count": n, - }) + # We count all files and folders here (recursively) + n = self._copy_files_and_folders_impl(files_queryset, folders_queryset, destination, form.cleaned_data['suffix'], False) + self.message_user(request, _("Successfully copied %(count)d files and/or folders to folder '%(destination)s'.") % { + "count": n, + "destination": destination, + }) return None else: - form = RenameFilesForm() + form = CopyFilesAndFoldersForm() - context = { - "title": _("Rename files"), + try: + selected_destination_folder = int(request.POST.get('destination', 0)) + except ValueError: + if current_folder: + selected_destination_folder = current_folder.pk + else: + selected_destination_folder = 0 + + context = self.admin_site.each_context(request) + context.update({ + "title": _("Copy files and/or folders"), "instance": current_folder, - "breadcrumbs_action": _("Rename files"), - "to_rename": to_rename, - "rename_form": form, + "breadcrumbs_action": _("Copy files and/or folders"), + "to_copy": to_copy, + "destination_folders": [], + "selected_destination_folder": selected_destination_folder, + "copy_form": form, "files_queryset": files_queryset, "folders_queryset": folders_queryset, + "perms_lacking": perms_needed, "opts": opts, "root_path": reverse('admin:index'), "app_label": app_label, "action_checkbox_name": helpers.ACTION_CHECKBOX_NAME, - } + }) - # Display the rename format selection page - return render(request, "admin/filer/folder/choose_rename_format.html", context=context) + # Display the destination folder selection page + return TemplateResponse(request, "admin/filer/folder/choose_copy_destination.html", context) - rename_files.short_description = gettext_lazy("Rename files") + copy_files_and_folders.short_description = _("Copy selected files and/or folders") + + def _check_resize_perms(self, request, files_queryset, folders_queryset): + try: + check_files_read_permissions(request, files_queryset) + check_folder_read_permissions(request, folders_queryset) + check_files_edit_permissions(request, files_queryset) + except PermissionDenied: + return True + return False def _list_folders_to_resize(self, request, folders): for fo in folders: - children = list(self._list_folders_to_resize( - request, fo.children.all())) - children.extend([self._format_callback( - f, request.user, self.admin_site, set()) - for f in sorted(fo.files) - if isinstance(f, Image)]) + children = list(self._list_folders_to_resize(request, fo.children.all())) + children.extend([self._format_callback(f, request.user, self.admin_site, set()) for f in sorted(fo.files) if isinstance(f, Image)]) if children: - yield self._format_callback( - fo, request.user, self.admin_site, set()) + yield self._format_callback(fo, request.user, self.admin_site, set()) yield children def _list_all_to_resize(self, request, files_queryset, folders_queryset): - to_resize = list(self._list_folders_to_resize( - request, folders_queryset)) - to_resize.extend([self._format_callback( - f, request.user, self.admin_site, set()) - for f in sorted(files_queryset) - if isinstance(f, Image)]) + to_resize = list(self._list_folders_to_resize(request, folders_queryset)) + to_resize.extend([self._format_callback(f, request.user, self.admin_site, set()) for f in sorted(files_queryset) if isinstance(f, Image)]) return to_resize - def _new_subject_location(self, original_width, original_height, - new_width, new_height, x, y, crop): - # TODO: We could probably do better - return (round(new_width / 2), round(new_height / 2)) + def _new_subject_location(self, original_width, original_height, new_width, new_height, x, y, crop): + # TODO: We could probably do even better, but this method knows nothing + # about actual thumbnailing algorithm details. + # It's better to reset subject location to the central point of the new + # image if the image is being cropped. The originally specified subject + # location could be outside of the new image. + if crop: + return int(new_width / 2), int(new_height / 2) + else: + # Calculate scaling factor of the new image compared to old. + scale = min(new_width / original_width, new_height / original_height) + return int(scale * x), int(scale * y) def _resize_image(self, image, form_data): original_width = float(image.width) original_height = float(image.height) - thumbnailer = FilerActionThumbnailer( - file=image.file.file, - name=image.file.name, - source_storage=image.file.source_storage, - thumbnail_storage=image.file.source_storage) + thumbnailer = FilerActionThumbnailer(file=image.file, name=image.file.name, source_storage=image.file.source_storage, thumbnail_storage=image.file.source_storage) # This should overwrite the original image new_image = thumbnailer.get_thumbnail({ - 'size': (form_data['width'], form_data['height']), + 'size': tuple(int(form_data[d] or 0) for d in ('width', 'height')), 'crop': form_data['crop'], 'upscale': form_data['upscale'], 'subject_location': image.subject_location, }) - from django.db.models.fields.files import ImageFieldFile image.file.file = new_image.file - image.generate_sha1() - image.save() # Also gets new width and height + # Since only file data was changed, there is no way for file field to know about the change. + # To update size, sha1, width and height fields let's call file_data_changed callback directly. + image.file_data_changed() + image.save() subject_location = normalize_subject_location(image.subject_location) if subject_location: @@ -1357,9 +1581,7 @@ def _resize_image(self, image, form_data): y = float(y) new_width = float(image.width) new_height = float(image.height) - (new_x, new_y) = self._new_subject_location( - original_width, original_height, new_width, new_height, - x, y, form_data['crop']) + (new_x, new_y) = self._new_subject_location(original_width, original_height, new_width, new_height, x, y, form_data['crop']) image.subject_location = "%d,%d" % (new_x, new_y) image.save() @@ -1372,11 +1594,9 @@ def _resize_images(self, files, form_data): return n def _resize_folder(self, folder, form_data): - return self._resize_images_impl( - folder.files.all(), folder.children.all(), form_data) + return self._resize_images_impl(folder.files.all(), folder.children.all(), form_data) - def _resize_images_impl(self, files_queryset, - folders_queryset, form_data): + def _resize_images_impl(self, files_queryset, folders_queryset, form_data): n = self._resize_images(files_queryset, form_data) for f in folders_queryset: @@ -1388,115 +1608,45 @@ def resize_images(self, request, files_queryset, folders_queryset): opts = self.model._meta app_label = opts.app_label - current_folder = self._get_current_action_folder( - request, files_queryset, folders_queryset) - to_resize = self._list_all_to_resize( - request, files_queryset, folders_queryset) + current_folder = self._get_current_action_folder(request, files_queryset, folders_queryset) + perms_needed = self._check_resize_perms(request, files_queryset, folders_queryset) + to_resize = self._list_all_to_resize(request, files_queryset, folders_queryset) if request.method == 'POST' and request.POST.get('post'): + if perms_needed: + raise PermissionDenied form = ResizeImagesForm(request.POST) if form.is_valid(): if form.cleaned_data.get('thumbnail_option'): - form.cleaned_data['width'] = \ - form.cleaned_data['thumbnail_option'].width - form.cleaned_data['height'] = \ - form.cleaned_data['thumbnail_option'].height - form.cleaned_data['crop'] = \ - form.cleaned_data['thumbnail_option'].crop - form.cleaned_data['upscale'] = \ - form.cleaned_data['thumbnail_option'].upscale + form.cleaned_data['width'] = form.cleaned_data['thumbnail_option'].width + form.cleaned_data['height'] = form.cleaned_data['thumbnail_option'].height + form.cleaned_data['crop'] = form.cleaned_data['thumbnail_option'].crop + form.cleaned_data['upscale'] = form.cleaned_data['thumbnail_option'].upscale if files_queryset.count() + folders_queryset.count(): - # We count all files here (recursivelly) - n = self._resize_images_impl( - files_queryset, folders_queryset, form.cleaned_data) - self.message_user(request, - _("Successfully resized %(count)d images.") % { - "count": n, - }) + # We count all files here (recursively) + n = self._resize_images_impl(files_queryset, folders_queryset, form.cleaned_data) + self.message_user(request, _("Successfully resized %(count)d images.") % {"count": n, }) return None else: form = ResizeImagesForm() - context = { + context = self.admin_site.each_context(request) + context.update({ "title": _("Resize images"), "instance": current_folder, "breadcrumbs_action": _("Resize images"), "to_resize": to_resize, "resize_form": form, - "cmsplugin_enabled": ('cmsplugin_filer_image' - in django_settings.INSTALLED_APPS), "files_queryset": files_queryset, "folders_queryset": folders_queryset, + "perms_lacking": perms_needed, "opts": opts, "root_path": reverse('admin:index'), "app_label": app_label, "action_checkbox_name": helpers.ACTION_CHECKBOX_NAME, - } + }) # Display the resize options page - return render( - request, - "admin/filer/folder/choose_images_resize_options.html", - context=context, - ) - - resize_images.short_description = gettext_lazy("Resize selected images") - - def files_set_public_or_private(self, request, set_public, - files_queryset, folders_queryset): - """ - Action which enables or disables permissions for selected - files and files in selected folders to clipboard - (set them private or public). - """ - - if not self.has_change_permission(request): - raise PermissionDenied - - if request.method != 'POST': - return None - - # We define it like that so that we can modify it inside the - # set_files function - files_count = [0] - - def set_files(files): - for f in files: - if f.is_public != set_public: - f.is_public = set_public - f.save() - files_count[0] += 1 - - def set_folders(folders): - for f in folders: - set_files(f.files) - set_folders(f.children.all()) - - set_files(files_queryset) - set_folders(folders_queryset) - - if set_public: - self.message_user(request, - _("Successfully disabled permissions for %(count)d files.") % { - "count": files_count[0], }) - else: - self.message_user(request, - _("Successfully enabled permissions for %(count)d files.") % { - "count": files_count[0], }) - - return None - - def files_set_private(self, request, files_queryset, folders_queryset): - return self.files_set_public_or_private( - request, False, files_queryset, folders_queryset) - - files_set_private.short_description = gettext_lazy( - "Enable permissions for selected files") - - def files_set_public(self, request, files_queryset, folders_queryset): - return self.files_set_public_or_private( - request, True, files_queryset, folders_queryset) + return TemplateResponse(request, "admin/filer/folder/choose_images_resize_options.html", context) - files_set_public.short_description = gettext_lazy( - "Disable permissions for selected files") -''' + resize_images.short_description = _("Resize selected images") diff --git a/filer/admin/forms.py b/filer/admin/forms.py index bc7e8cff1..a6c876719 100644 --- a/filer/admin/forms.py +++ b/filer/admin/forms.py @@ -1,14 +1,23 @@ from django import forms -from django.db import models from django.contrib.admin import widgets -from filer.utils.files import get_valid_filename -from django.utils.translation import gettext as _ +from django.contrib.admin.helpers import AdminForm from django.core.exceptions import ValidationError -from django.conf import settings +from django.db import models +from django.utils.translation import gettext as _ +from ..models import ThumbnailOption +from ..utils.files import get_valid_filename -if 'cmsplugin_filer_image' in settings.INSTALLED_APPS: - from cmsplugin_filer_image.models import ThumbnailOption + +class WithFieldsetMixin: + def get_fieldsets(self): + return getattr(self, "fieldsets", [ + (None, {"fields": [field for field in self.fields]}) + ]) + + def admin_form(self): + "Returns a class contains the Admin fieldset to show form as admin form" + return AdminForm(self, self.get_fieldsets(), {}) class AsPWithHelpMixin(object): @@ -58,16 +67,16 @@ def as_p_with_help(self): class CopyFilesAndFoldersForm(forms.Form, AsPWithHelpMixin): suffix = forms.CharField(required=False, help_text=_("Suffix which will be appended to filenames of copied files.")) # TODO: We have to find a way to overwrite files with different storage backends first. - #overwrite_files = forms.BooleanField(required=False, help_text=_("Overwrite a file if there already exists a file with the same filename?")) + # overwrite_files = forms.BooleanField(required=False, help_text=_("Overwrite a file if there already exists a file with the same filename?")) def clean_suffix(self): - valid = get_valid_filename(self.cleaned_data['suffix']) + valid = get_valid_filename(self.cleaned_data['suffix']) if self.cleaned_data['suffix'] else "" if valid != self.cleaned_data['suffix']: raise forms.ValidationError(_('Suffix should be a valid, simple and lowercase filename part, like "%(valid)s".') % {'valid': valid}) return self.cleaned_data['suffix'] -class RenameFilesForm(forms.Form, AsPWithHelpMixin): +class RenameFilesForm(WithFieldsetMixin, forms.Form): rename_format = forms.CharField(required=True) def clean_rename_format(self): @@ -90,9 +99,20 @@ def clean_rename_format(self): return self.cleaned_data['rename_format'] -class ResizeImagesForm(forms.Form, AsPWithHelpMixin): - if 'cmsplugin_filer_image' in settings.INSTALLED_APPS: - thumbnail_option = models.ForeignKey(ThumbnailOption, null=True, blank=True, verbose_name=_("thumbnail option")).formfield() +class ResizeImagesForm(WithFieldsetMixin, forms.Form): + fieldsets = ((None, {"fields": ( + "thumbnail_option", + ("width", "height"), + ("crop", "upscale"))}),) + + thumbnail_option = models.ForeignKey( + ThumbnailOption, + null=True, + blank=True, + verbose_name=_("thumbnail option"), + on_delete=models.CASCADE, + ).formfield() + width = models.PositiveIntegerField(_("width"), null=True, blank=True).formfield(widget=widgets.AdminIntegerFieldWidget) height = models.PositiveIntegerField(_("height"), null=True, blank=True).formfield(widget=widgets.AdminIntegerFieldWidget) crop = models.BooleanField(_("crop"), default=True).formfield() @@ -100,8 +120,5 @@ class ResizeImagesForm(forms.Form, AsPWithHelpMixin): def clean(self): if not (self.cleaned_data.get('thumbnail_option') or ((self.cleaned_data.get('width') or 0) + (self.cleaned_data.get('height') or 0))): - if 'cmsplugin_filer_image' in settings.INSTALLED_APPS: - raise ValidationError(_('Thumbnail option or resize parameters must be choosen.')) - else: - raise ValidationError(_('Resize parameters must be choosen.')) + raise ValidationError(_('Thumbnail option or resize parameters must be choosen.')) return self.cleaned_data diff --git a/filer/admin/imageadmin.py b/filer/admin/imageadmin.py index 96fd494f3..aec3d41f9 100644 --- a/filer/admin/imageadmin.py +++ b/filer/admin/imageadmin.py @@ -1,63 +1,121 @@ -#-*- coding: utf-8 -*- from django import forms -from django.utils.translation import gettext as _ -from django.shortcuts import render -from django.http import Http404 -from django.urls import re_path -from filer.admin.fileadmin import FileAdmin -from filer.models import Image -from filer.views import (popup_status, selectfolder_status) +from django.shortcuts import get_object_or_404 +from django.template.response import TemplateResponse +from django.urls import path +from django.utils.translation import gettext as _ +from django.utils.translation import gettext_lazy +from ..settings import FILER_IMAGE_MODEL +from ..thumbnail_processors import normalize_subject_location +from ..utils.compatibility import string_concat +from ..utils.loader import load_model +from .fileadmin import FileAdmin, FileAdminChangeFrom -class ImageAdminForm(forms.ModelForm): + +Image = load_model(FILER_IMAGE_MODEL) + + +class ImageAdminForm(FileAdminChangeFrom): subject_location = forms.CharField( - max_length=64, required=False, - label=_('Subject location'), - help_text=_('Location of the main subject of the scene.')) + max_length=64, required=False, + label=_('Subject location'), + help_text=_('Location of the main subject of the scene. ' + 'Format: "x,y".')) def sidebar_image_ratio(self): if self.instance: # this is very important. It forces the value to be returned as a - # string and always with a "." as seperator. If the conversion + # string and always with a "." as separator. If the conversion # from float to string is done in the template, the locale will # be used and in some cases there would be a "," instead of ".". # javascript would parse that to an integer. - return "%.6F" % self.instance.sidebar_image_ratio() + return '%.6F' % self.instance.sidebar_image_ratio() else: return '' + def _set_previous_subject_location(self, cleaned_data): + subject_location = self.instance.subject_location + cleaned_data['subject_location'] = subject_location + self.data = self.data.copy() + self.data['subject_location'] = subject_location + + def clean_subject_location(self): + """ + Validate subject_location preserving last saved value. + + Last valid value of the subject_location field is shown to the user + for subject location widget to receive valid coordinates on field + validation errors. + """ + subject_location = self.cleaned_data['subject_location'] + if not subject_location: + # if supplied subject location is empty, do not check it + return subject_location + + # use thumbnail's helper function to check the format + coordinates = normalize_subject_location(subject_location) + + if not coordinates: + err_msg = gettext_lazy('Invalid subject location format. ') + err_code = 'invalid_subject_format' + + elif ( + coordinates[0] > self.instance.width > 0 + or coordinates[1] > self.instance.height > 0 + ): + err_msg = gettext_lazy( + 'Subject location is outside of the image. ') + err_code = 'subject_out_of_bounds' + else: + return subject_location + + self._set_previous_subject_location(self.cleaned_data) + raise forms.ValidationError( + string_concat( + err_msg, + gettext_lazy('Your input: "{subject_location}". '.format( + subject_location=subject_location)), + 'Previous value is restored.'), + code=err_code) + class Meta: model = Image exclude = () class ImageAdmin(FileAdmin): + change_form_template = 'admin/filer/image/change_form.html' form = ImageAdminForm def get_urls(self): - urls = super(ImageAdmin, self).get_urls() - url_patterns = [ - re_path(r'^(?P\d+)/full_size_preview/$', - self.admin_site.admin_view(self.full_size_preview), - name='filer-image-preview'), + return super().get_urls() + [ + path("expand/", + self.admin_site.admin_view(self.expand_view), + name=f"{self.opts.app_label}_{self.opts.model_name}_expand") ] - url_patterns.extend(urls) - return url_patterns - - def full_size_preview(self, request, file_id): - try: - image = Image.objects.get(id=file_id) - except Image.DoesNotExist: - raise Http404 - - return render(request, 'admin/filer/image/full_size_preview.html', { - 'image': image, - 'current_site': request.GET.get('current_site', None), - 'is_popup': popup_status(request), - 'select_folder': selectfolder_status(request), - }) + + def expand_view(self, request, file_id): + image = get_object_or_404(self.model, pk=file_id) + return TemplateResponse( + request, + "admin/filer/image/expand.html", + context={ + "original_url": image.url + }, + ) + + +if FILER_IMAGE_MODEL == 'filer.Image': + extra_main_fields = ('author', 'default_alt_text', 'default_caption',) +else: + extra_main_fields = ('default_alt_text', 'default_caption',) ImageAdmin.fieldsets = ImageAdmin.build_fieldsets( - extra_main_fields=('default_alt_text', 'default_caption', 'default_credit'), - extra_fieldsets=() + extra_main_fields=extra_main_fields, + extra_fieldsets=( + (_('Subject location'), { + 'fields': ('subject_location',), + 'classes': ('collapse',), + }), + ) ) diff --git a/filer/admin/patched/__init__.py b/filer/admin/patched/__init__.py index 53f7f2286..e69de29bb 100644 --- a/filer/admin/patched/__init__.py +++ b/filer/admin/patched/__init__.py @@ -1,2 +0,0 @@ -#-*- coding: utf-8 -*- - diff --git a/filer/admin/patched/admin_utils.py b/filer/admin/patched/admin_utils.py index ec986f68a..84602d5e5 100644 --- a/filer/admin/patched/admin_utils.py +++ b/filer/admin/patched/admin_utils.py @@ -1,31 +1,34 @@ -# -*- coding: utf-8 -*- """ Copy of ``django.contrib.admin.utils.get_deleted_objects`` and a subclass of -``django.contrib.admin.utils.NestedObjects`` that work with djongo_polymorphic querysets. -Ultimatly these should go directly into django_polymorphic or, in a more generic way, into django itself. +``django.contrib.admin.utils.NestedObjects`` that work with django-polymorphic +querysets. +Ultimately these should go directly into django-polymorphic or, in a more +generic way, into Django itself. -This code has been copied from -django 1.4. ``get_deleted_objects`` and ``NestedObjects`` have not changed compared to 1.3.1. +This code has been copied from Django 1.9.4. -At all locations where something has been changed, there are inline comments in the code. +At all locations where something has been changed, there are inline comments +in the code. """ -from django.contrib.admin.utils import NestedObjects, quote +from collections import defaultdict + +from django import VERSION as DJANGO_VERSION +from django.contrib.admin.utils import quote from django.contrib.auth import get_permission_codename -from django.utils.text import capfirst -from django.utils.html import format_html +from django.db import models +from django.db.models.deletion import Collector from django.urls import NoReverseMatch, reverse from django.utils.encoding import force_str - +from django.utils.html import format_html +from django.utils.text import capfirst def get_deleted_objects(objs, opts, user, admin_site, using): """ Find all objects related to ``objs`` that should also be deleted. ``objs`` - must be a homogenous iterable of objects (e.g. a QuerySet). - + must be a homogeneous iterable of objects (e.g. a QuerySet). Returns a nested list of strings suitable for display in the template with the ``unordered_list`` filter. - """ # --- begin patch --- collector = PolymorphicAwareNestedObjects(using=using) @@ -53,8 +56,7 @@ def format_callback(obj): p = '%s.%s' % (opts.app_label, get_permission_codename('delete', opts)) - # Additional change: also check for individual object permission - if not user.has_perm(p, obj) and not user.has_perm(p): + if not user.has_perm(p): perms_needed.add(opts.verbose_name) # Display a link to the admin page. return format_html('{}: {}', @@ -69,11 +71,45 @@ def format_callback(obj): to_delete = collector.nested(format_callback) protected = [format_callback(obj) for obj in collector.protected] + model_count = {model._meta.verbose_name_plural: len(objs) for model, objs in collector.model_objs.items()} - return to_delete, perms_needed, protected + return to_delete, model_count, perms_needed, protected -class PolymorphicAwareNestedObjects(NestedObjects): +class NestedObjects(Collector): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.edges = {} # {from_instance: [to_instances]} + self.protected = set() + self.model_objs = defaultdict(set) + + def add_edge(self, source, target): + self.edges.setdefault(source, []).append(target) + + def collect(self, objs, source=None, source_attr=None, **kwargs): + for obj in objs: + if source_attr and not source_attr.endswith('+'): + related_name = source_attr % { + 'class': source._meta.model_name, + 'app_label': source._meta.app_label, + } + self.add_edge(getattr(obj, related_name), obj) + else: + self.add_edge(None, obj) + self.model_objs[obj._meta.model].add(obj) + try: + return super().collect(objs, source_attr=source_attr, **kwargs) + except models.ProtectedError as e: + self.protected.update(e.protected_objects) + + if DJANGO_VERSION >= (3, 1): + def related_objects(self, related_model, related_fields, objs): + qs = super().related_objects(related_model, related_fields, objs) + return qs.select_related(*[related.name for related in related_fields]) + else: + def related_objects(self, related, objs): + qs = super().related_objects(related, objs) + return qs.select_related(related.field.name) def _nested(self, obj, seen, format_callback): if obj in seen: @@ -82,21 +118,37 @@ def _nested(self, obj, seen, format_callback): children = [] for child in self.edges.get(obj, ()): children.extend(self._nested(child, seen, format_callback)) - if hasattr(obj, 'is_in_trash') and obj.is_in_trash(): - ret = [] + if format_callback: + ret = [format_callback(obj)] else: - if format_callback: - ret = [format_callback(obj)] - else: - ret = [obj] + ret = [obj] if children: ret.append(children) return ret + def nested(self, format_callback=None): + """ + Return the graph as a nested list. + """ + seen = set() + roots = [] + for root in self.edges.get(None, ()): + roots.extend(self._nested(root, seen, format_callback)) + return roots + + def can_fast_delete(self, *args, **kwargs): + """ + We always want to load the objects into memory so that we can display + them to the user in confirm page. + """ + return False + + +class PolymorphicAwareNestedObjects(NestedObjects): def collect(self, objs, source_attr=None, **kwargs): if hasattr(objs, 'non_polymorphic'): - # .filter() is needed, because there may already be - # cached polymorphic results in the queryset + # .filter() is needed, because there may already be cached + # polymorphic results in the queryset objs = objs.non_polymorphic().filter() - return super(PolymorphicAwareNestedObjects, self).collect( + return super().collect( objs, source_attr=source_attr, **kwargs) diff --git a/filer/admin/permissionadmin.py b/filer/admin/permissionadmin.py new file mode 100644 index 000000000..f3b03bd36 --- /dev/null +++ b/filer/admin/permissionadmin.py @@ -0,0 +1,56 @@ +from django import VERSION as django_version +from django.contrib import admin +from django.contrib.auth import get_user_model +from django.utils.translation import gettext_lazy as _ + +from .. import settings +from ..cache import clear_folder_permission_cache + + +class PermissionAdmin(admin.ModelAdmin): + fieldsets = [ + (None, {'fields': ['type', 'folder']}), + (_("Who"), {'fields': ['user', 'group', 'everybody']}), + (_("What"), {'fields': ['can_edit', 'can_read', 'can_add_children']}), + ] + list_filter = ['group'] + list_display = ['pretty_logical_path', 'who', 'what'] + search_fields = ['user__username', 'group__name', 'folder__name'] + autocomplete_fields = ['user', 'group', 'folder'] + + class Media: + css = {'all': ['filer/css/admin_folderpermissions.css']} + + def get_autocomplete_fields(self, request): + """Remove "owner" from autocomplete_fields if User model has no search_fields""" + + autocomplete_fields = super().get_autocomplete_fields(request) + if django_version >= (5, 0): + user_admin = self.admin_site.get_model_admin(get_user_model()) + else: + user_admin = self.admin_site._registry[get_user_model()] + if not user_admin.get_search_fields(request): + autocomplete_fields.remove('user') + return autocomplete_fields + + def get_queryset(self, request): + qs = super().get_queryset(request) + return qs.prefetch_related("group", "folder") + + def get_model_perms(self, request): + # don't display the permissions admin if permissions are disabled. + # This method is easier for testing than not registering the admin at all at import time + enable_permissions = settings.FILER_ENABLE_PERMISSIONS and request.user.has_perm('filer.add_folderpermission') + return { + 'add': enable_permissions, + 'change': enable_permissions, + 'delete': enable_permissions, + } + + def save_model(self, request, obj, form, change): + clear_folder_permission_cache(request.user) + super().save_model(request, obj, form, change) + + def delete_model(self, request, obj): + clear_folder_permission_cache(request.user) + super().delete_model(request, obj) diff --git a/filer/admin/permissions.py b/filer/admin/permissions.py new file mode 100644 index 000000000..a747990bc --- /dev/null +++ b/filer/admin/permissions.py @@ -0,0 +1,48 @@ +from django import VERSION as django_version +from django.contrib import admin +from django.contrib.auth import get_user_model +from django.urls import reverse + + +class PrimitivePermissionAwareModelAdmin(admin.ModelAdmin): + def get_autocomplete_fields(self, request): + """Remove "owner" from autocomplete_fields if User model has no search_fields""" + + autocomplete_fields = super().get_autocomplete_fields(request) + if django_version >= (5, 0): + user_admin = self.admin_site.get_model_admin(get_user_model()) + else: + user_admin = self.admin_site._registry[get_user_model()] + if not user_admin.get_search_fields(request) and 'owner' in autocomplete_fields: + autocomplete_fields.remove('owner') + return autocomplete_fields + + def has_add_permission(self, request): + # we don't have a "add" permission... but all adding is handled + # by special methods that go around these permissions anyway + # TODO: reactivate return False + return False + + def has_change_permission(self, request, obj=None): + if hasattr(obj, 'has_edit_permission'): + if obj.has_edit_permission(request): + return True + else: + return False + else: + return True + + def has_delete_permission(self, request, obj=None): + # we don't have a specific delete permission... so we use change + return self.has_change_permission(request, obj) + + def _get_post_url(self, obj): + """ + Needed to retrieve the changelist url as Folder/File can be extended + and admin url may change + """ + # Code from django ModelAdmin to determine changelist on the fly + opts = obj._meta + return reverse('admin:%s_%s_changelist' % + (opts.app_label, opts.model_name), + current_app=self.admin_site.name) diff --git a/filer/admin/thumbnailoptionadmin.py b/filer/admin/thumbnailoptionadmin.py new file mode 100644 index 000000000..9bdf5ff26 --- /dev/null +++ b/filer/admin/thumbnailoptionadmin.py @@ -0,0 +1,5 @@ +from django.contrib import admin + + +class ThumbnailOptionAdmin(admin.ModelAdmin): + list_display = ('name', 'width', 'height') diff --git a/filer/admin/tools.py b/filer/admin/tools.py index 1995b905b..66a75dd8c 100644 --- a/filer/admin/tools.py +++ b/filer/admin/tools.py @@ -1,9 +1,128 @@ -#-*- coding: utf-8 -*- -from django.conf import settings +from django.conf import settings as django_settings +from django.contrib.admin.options import IS_POPUP_VAR +from django.core.exceptions import PermissionDenied from django.db.models import Q -from filer.utils.cms_roles import * -from filer.models.foldermodels import Folder +from django.utils.http import urlencode +from .. import settings +from ..utils.cms_roles import get_sites_for_user +from ..models.foldermodels import Folder + + +ALLOWED_PICK_TYPES = ('folder', 'file') + + +def check_files_edit_permissions(request, files): + for f in files: + if not f.has_edit_permission(request): + raise PermissionDenied + + +def check_folder_edit_permissions(request, folders): + for f in folders: + if not f.has_edit_permission(request): + raise PermissionDenied + check_files_edit_permissions(request, f.files) + check_folder_edit_permissions(request, f.children.all()) + + +def check_files_read_permissions(request, files): + for f in files: + if not f.has_read_permission(request): + raise PermissionDenied + + +def check_folder_read_permissions(request, folders): + for f in folders: + if not f.has_read_permission(request): + raise PermissionDenied + check_files_read_permissions(request, f.files) + check_folder_read_permissions(request, f.children.all()) + + +def userperms_for_request(item, request): + r = [] + ps = ['read', 'edit', 'add_children'] + for p in ps: + attr = "has_%s_permission" % p + if hasattr(item, attr): + x = getattr(item, attr)(request) + if x: + r.append(p) + return r + + +def popup_status(request): + return ( + IS_POPUP_VAR in request.GET + or 'pop' in request.GET + or IS_POPUP_VAR in request.POST + or 'pop' in request.POST + ) + + +def popup_pick_type(request): + pick_type = request.GET.get('_pick', request.POST.get('_pick')) + if pick_type in ALLOWED_PICK_TYPES: + return pick_type + return None + + +def edit_from_widget(request): + return request.GET.get('_edit_from_widget') == '1' + + +def get_directory_listing_type(request): + list_type = request.GET.get('_list_type', None) + if list_type not in settings.FILER_FOLDER_ADMIN_LIST_TYPE_CHOICES: + return + return list_type + + +def admin_url_params(request, params=None): + params = params or {} + if popup_status(request): + params[IS_POPUP_VAR] = '1' + pick_type = popup_pick_type(request) + if pick_type: + params['_pick'] = pick_type + if edit_from_widget(request): + params['_edit_from_widget'] = '1' + list_type = get_directory_listing_type(request) + if list_type and '_list_type' not in params.keys(): + params['_list_type'] = list_type + return params + + +def admin_url_params_encoded(request, first_separator='?', params=None): + params = urlencode( + sorted(admin_url_params(request, params=params).items()) + ) + if not params: + return '' + return f'{first_separator}{params}' + + +class AdminContext(dict): + def __init__(self, request): + super().__init__() + self.update(admin_url_params(request)) + + def __missing__(self, key): + if key == 'popup': + return self.get(IS_POPUP_VAR, False) == '1' + elif key == 'pick': + return self.get('_pick', '') + elif key.startswith('pick_'): + return self.get('_pick', '') == key.split('pick_')[1] + + def __getattr__(self, name): + if name in ('popup', 'pick') or name.startswith('pick_'): + return self.get(name) + raise AttributeError + + +# --- PBS-specific functions --- def is_valid_destination(request, folder): user = request.user @@ -33,73 +152,35 @@ def _filter_available_sites(current_site, user): def folders_available(current_site, user, folders_qs): """ - Returns a queryset with folders that current user can see - * core folders - * shared folders - * only site folders with sites available to the user - * site admins can also see site folder files with no site assigned - - * current_site param is passed only with cms plugin change form so this - will restrict visible files/folder for the ones that belong to that - site for all users, even superusers - """ - if user.is_superuser and not current_site: - return folders_qs.distinct() - - available_sites = _filter_available_sites(current_site, user) - - sites_q = Q(Q(folder_type=Folder.CORE_FOLDER) | - Q(site__in=available_sites) | - Q(shared__in=available_sites)) - - if (getattr(settings, 'FILER_INCLUDE_SITELESS_FOLDERS', True) and - has_admin_role(user) and not current_site): - sites_q |= Q(site__pk__isnull=True) - - return folders_qs.filter(sites_q).distinct() - - -def files_available(current_site, user, files_qs): - """ - Returns a queryset with files that current user can see: - * core folder files - * shared folder files - * files from 'unfiled files' - * only site folder files with sites available to the user - * site admins can also see site folder files with no site assigned - - * current_site param is passed only with cms plugin change form so this - will restrict visible files/folder for the ones that belong to that - site for all users, even superusers + Returns a queryset with folders that current user can see. """ - # never show unfiled files from other users clipboard - unfiled_in_clipboard = Q(Q(folder__isnull=True) & - ~Q(clipboarditem__isnull=True)) - - if user.is_superuser and not current_site: - return files_qs.exclude(unfiled_in_clipboard).distinct() - available_sites = _filter_available_sites(current_site, user) + if not available_sites: + return folders_qs.none() - sites_q = Q(Q(folder__folder_type=Folder.CORE_FOLDER) | - Q(folder__site__in=available_sites) | - Q(folder__shared__in=available_sites)) + core_folders = Q(folder_type=Folder.CORE_FOLDER) + shared_folders = Q(shared__in=available_sites) + accessible_site_folders = Q(site__in=available_sites) - if not current_site: - sites_q |= Q(folder__isnull=True) - if (getattr(settings, 'FILER_INCLUDE_SITELESS_FOLDERS', True) and - has_admin_role(user)): - sites_q |= Q(folder__site__isnull=True) + if user.is_superuser: + # superusers can also see folders with no site assigned + no_site_folders = Q(site__isnull=True) & ~core_folders + visible = (core_folders | shared_folders | + accessible_site_folders | no_site_folders) else: - # never show unfiled in popup - sites_q &= Q(folder__isnull=False) + visible = core_folders | shared_folders | accessible_site_folders - return files_qs.exclude(unfiled_in_clipboard).filter(sites_q).distinct() + return folders_qs.filter(visible).distinct() def has_multi_file_action_permission(request, files, folders): + """PBS: Check permissions for multi-file actions (move/copy/delete).""" + from ..utils.cms_roles import ( + has_admin_role, + get_admin_sites_for_user, + get_sites_for_user, + ) # unfiled files can be moved/deleted so better to just exclude them - # from checking permissions for them files = files.exclude(folder__isnull=True) user = request.user @@ -123,8 +204,6 @@ def has_multi_file_action_permission(request, files, folders): if _exists_root_folders: if not has_admin_role(user): return False - # allow site admins to move/delete root files/folders that belong - # to the site where is admin sites_allowed = [s.id for s in get_admin_sites_for_user(user)] else: sites_allowed = get_sites_for_user(user) diff --git a/filer/admin/views.py b/filer/admin/views.py new file mode 100644 index 000000000..265950ab1 --- /dev/null +++ b/filer/admin/views.py @@ -0,0 +1,155 @@ +from django import forms +from django.contrib import admin +from django.contrib.admin import widgets +from django.contrib.auth.decorators import login_required +from django.core.exceptions import PermissionDenied +from django.http import HttpResponseRedirect +from django.http.response import HttpResponseBadRequest +from django.template.response import TemplateResponse +from django.utils.translation import gettext_lazy as _ + +from .. import settings as filer_settings +from ..models import Clipboard, Folder, FolderRoot, tools +from ..admin.tools import AdminContext, admin_url_params_encoded, is_valid_destination, popup_status + + +class NewFolderForm(forms.ModelForm): + class Meta: + model = Folder + fields = ('name', 'site') + widgets = { + 'name': widgets.AdminTextInputWidget, + } + + def __init__(self, *args, **kwargs): + self.is_root_folder = kwargs.pop('is_root_folder', True) + super().__init__(*args, **kwargs) + if self.is_root_folder: + self.fields['site'].required = True + else: + # Hide site field for child folders + if 'site' in self.fields: + del self.fields['site'] + + def clean(self): + cleaned_data = super().clean() + if self.is_root_folder and not cleaned_data.get('site'): + raise forms.ValidationError('Site is required') + return cleaned_data + + +@login_required +def make_folder(request, folder_id=None): + if not folder_id: + folder_id = request.GET.get('parent_id') + if not folder_id: + folder_id = request.POST.get('parent_id') + if folder_id: + try: + folder = Folder.objects.get(id=folder_id) + except Folder.DoesNotExist: + raise PermissionDenied + else: + folder = None + + if folder and not folder.has_add_permission(request.user): + raise PermissionDenied + elif request.user.is_superuser: + pass + elif folder is None: + # regular users may not add root folders unless configured otherwise + if not filer_settings.FILER_ALLOW_REGULAR_USERS_TO_ADD_ROOT_FOLDERS: + raise PermissionDenied + elif not folder.has_add_children_permission(request): + # the user does not have the permission to add subfolders + raise PermissionDenied + + if request.method == 'POST': + new_folder_form = NewFolderForm(request.POST, is_root_folder=(folder is None)) + # Set parent on the instance before validation so model clean() works correctly + new_folder_form.instance.parent = folder + new_folder_form.instance.owner = request.user + if new_folder_form.is_valid(): + new_folder = new_folder_form.save(commit=False) + if (folder or FolderRoot()).contains_folder(new_folder.name): + new_folder_form._errors['name'] = new_folder_form.error_class( + [_('Folder with this name already exists.')]) + else: + new_folder.parent = folder + new_folder.owner = request.user + new_folder.save() + if popup_status(request): + context = admin.site.each_context(request) + return TemplateResponse(request, 'admin/filer/dismiss_popup.html', context) + else: + from django.urls import reverse + if folder: + url = reverse('admin:filer-directory_listing', kwargs={'folder_id': folder.id}) + else: + url = reverse('admin:filer-directory_listing-root') + return HttpResponseRedirect(url) + else: + new_folder_form = NewFolderForm(is_root_folder=(folder is None)) + + context = admin.site.each_context(request) + context.update({ + 'opts': Folder._meta, + 'new_folder_form': new_folder_form, + 'is_popup': popup_status(request), + 'filer_admin_context': AdminContext(request), + }) + return TemplateResponse(request, 'admin/filer/folder/new_folder_form.html', context) + + +@login_required +def paste_clipboard_to_folder(request): + + if request.method == 'POST': + folder_id = request.POST.get('folder_id') + if not folder_id: + raise PermissionDenied + try: + folder = Folder.objects.get(id=folder_id) + except Folder.DoesNotExist: + raise PermissionDenied + if not is_valid_destination(request, folder): + raise PermissionDenied + clipboard = Clipboard.objects.get(id=request.POST.get('clipboard_id')) + files_moved = tools.move_files_from_clipboard_to_folder(request, clipboard, folder) + tools.discard_clipboard_files(clipboard, files_moved) + redirect = request.GET.get('redirect_to', '') + if not redirect: + redirect = request.POST.get('redirect_to', '') + return HttpResponseRedirect( + '{}?order_by=-modified_at{}'.format( + redirect, + admin_url_params_encoded(request, first_separator='&'), + ) + ) + + +@login_required +def discard_clipboard(request): + if request.method == 'POST': + clipboard = Clipboard.objects.get(id=request.POST.get('clipboard_id')) + tools.discard_clipboard(clipboard) + return HttpResponseRedirect( + '{}{}'.format( + request.POST.get('redirect_to', ''), + admin_url_params_encoded(request, first_separator='&'), + ) + ) + + +@login_required +def delete_clipboard(request): + + if request.method == 'POST': + clipboard = Clipboard.objects.get(id=request.POST.get('clipboard_id')) + tools.delete_clipboard(clipboard) + return HttpResponseRedirect( + '{}{}'.format( + request.POST.get('redirect_to', ''), + admin_url_params_encoded(request, first_separator='&'), + ) + ) diff --git a/filer/apps.py b/filer/apps.py index f92cd7939..ce0dc38a1 100644 --- a/filer/apps.py +++ b/filer/apps.py @@ -1,8 +1,69 @@ +import mimetypes + from django.apps import AppConfig +from django.core.exceptions import ImproperlyConfigured from django.utils.translation import gettext_lazy as _ + from filer import __version__ as filer_version class FilerConfig(AppConfig): + default_auto_field = 'django.db.models.AutoField' name = 'filer' verbose_name = _(f"Filer ({filer_version})") + + def register_optional_heif_supprt(self): + try: # pragma: no cover + from pillow_heif import register_heif_opener + + from .settings import IMAGE_EXTENSIONS, IMAGE_MIME_TYPES + + # Register with easy_thumbnails + register_heif_opener() + HEIF_EXTENSIONS = [".heic", ".heics", ".heif", ".heifs", ".hif"] + # Add extensions to python mimetypes which filer uses + for ext in HEIF_EXTENSIONS: + mimetypes.add_type("image/heic", ext) + # Mark them as images + IMAGE_EXTENSIONS += HEIF_EXTENSIONS + IMAGE_MIME_TYPES.append("heic") + except (ModuleNotFoundError, ImportError): + # No heif support installed + pass + + def resolve_validators(self): + """Resolve dotted path file validators""" + + import importlib + + from filer.settings import FILE_VALIDATORS, FILER_MIME_TYPE_WHITELIST + + if ( + not isinstance(FILER_MIME_TYPE_WHITELIST, (list, tuple)) or # noqa W504 + any(map(lambda x: not isinstance(x, str), FILER_MIME_TYPE_WHITELIST)) + ): # pragma: no cover + raise ImproperlyConfigured( + "filer: setting FILER_MIME_TYPE_WHITELIST needs to be a list or tuple of strings" + ) + self.MIME_TYPE_WHITELIST = FILER_MIME_TYPE_WHITELIST + self.FILE_VALIDATORS = {} + for mime_type, validators in FILE_VALIDATORS.items(): + functions = [] + for item in validators: + if callable(item): # pragma: no cover + functions.append(item) + else: + split = item.rsplit(".", 1) + try: + module = importlib.import_module(split[0]) + functions.append(getattr(module, split[-1])) + except (ImportError, ModuleNotFoundError, AttributeError): + raise ImproperlyConfigured(f"""filer: could not import validator "{item}".""") + self.FILE_VALIDATORS[mime_type] = functions + + def ready(self): + # Make webp mime type known to python (needed for python < 3.11) + mimetypes.add_type("image/webp", ".webp") + # + self.resolve_validators() + self.register_optional_heif_supprt() diff --git a/filer/cache.py b/filer/cache.py new file mode 100644 index 000000000..d9861ac60 --- /dev/null +++ b/filer/cache.py @@ -0,0 +1,91 @@ +import typing + +from django.core.cache import cache +from django.db.models import Model + + +UserModel = typing.TypeVar('UserModel', bound=Model) + + +def get_folder_perm_cache_key(user: UserModel, permission: str) -> str: + """ + Generates a unique cache key for a given user and permission. + + The key is a string in the format "filer:perm:", i.e. it does not + contain the user id. This will be sufficient for most use cases. + + Patch this method to include the user id in the cache key if necessary, e.g., + for far more than 1,000 admin users to make the cached unit require less memory. + + Parameters: + user (UserModel): The user for whom the cache key is being generated. + The `user` can be an instance of the default `django.contrib.auth.models.User` + or any custom user model specified by `AUTH_USER_MODEL` in the settings. + permission (str): The permission for which the cache key is being generated. + + Returns: + str: The generated cache key. + """ + return f"filer:perm:{permission}" + + +def get_folder_permission_cache(user: UserModel, permission: str) -> typing.Optional[typing.Set[int]]: + """ + Retrieves the cached folder permissions for a given user and permission. + + If the cache value exists, it returns the permissions for the user. + If the cache value does not exist, it returns None. + + Parameters: + user (UserModel): The user for whom the permissions are being retrieved. + The `user` can be an instance of the default `django.contrib.auth.models.User` + or any custom user model specified by `AUTH_USER_MODEL` in the settings. + permission (str): The permission for which the permissions are being retrieved. + + Returns: + set or None: The permissions for the user, or None if no cache value exists. + """ + cache_value = cache.get(get_folder_perm_cache_key(user, permission)) + if cache_value: + return cache_value.get(user.pk, None) + return None + + +def clear_folder_permission_cache(user: UserModel, permission: typing.Optional[str] = None) -> None: + """ + Clears the cached folder permissions for a given user. + + If a specific permission is provided, it clears the cache for that permission only. + If no specific permission is provided, it clears the cache for all permissions. + + Parameters: + user (UserModel): The user for whom the permissions are being cleared. + The `user` can be an instance of the default `django.contrib.auth.models.User` + or any custom user model specified by `AUTH_USER_MODEL` in the settings. + permission (str, optional): The specific permission to clear. Defaults to None. + """ + if permission is None: + for perm in ['can_read', 'can_edit', 'can_add_children']: + cache.delete(get_folder_perm_cache_key(user, perm)) + else: + cache.delete(get_folder_perm_cache_key(user, permission)) + + +def update_folder_permission_cache(user: UserModel, permission: str, id_list: typing.Set[int]) -> None: + """ + Updates the cached folder permissions for a given user and permission. + + It first retrieves the current permissions from the cache (or an empty dictionary if none exist). + Then it updates the permissions for the user with the provided list of IDs. + Finally, it sets the updated permissions back into the cache. + + Parameters: + user (UserModel): The user for whom the permissions are being updated. + The `user` can be an instance of the default `django.contrib.auth.models.User` + or any custom user model specified by `AUTH_USER_MODEL` in the settings. + permission (str): The permission to update. + id_list (set): The set of IDs to set as the new permissions. + """ + perms = cache.get(get_folder_perm_cache_key(user, permission)) or {} + perms[user.pk] = set(id_list) + cache.set(get_folder_perm_cache_key(user, permission), perms) diff --git a/filer/contrib/__init__.py b/filer/contrib/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/filer/contrib/clamav/__init__.py b/filer/contrib/clamav/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/filer/contrib/django_cms/__init__.py b/filer/contrib/django_cms/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/filer/contrib/django_cms/cms_toolbars.py b/filer/contrib/django_cms/cms_toolbars.py new file mode 100644 index 000000000..a42928dd2 --- /dev/null +++ b/filer/contrib/django_cms/cms_toolbars.py @@ -0,0 +1,51 @@ +from django.urls import reverse +from django.utils.encoding import force_str +from django.utils.translation import gettext_lazy as _ + +from cms.cms_toolbars import ADMIN_MENU_IDENTIFIER, ADMINISTRATION_BREAK +from cms.toolbar.items import Break +from cms.toolbar_base import CMSToolbar +from cms.toolbar_pool import toolbar_pool + + +SHORTCUTS_BREAK = 'Shortcuts Break' + + +@toolbar_pool.register +class FilerToolbar(CMSToolbar): + """ + Adds a Filer menu-item into django CMS's "ADMIN" (first) menu. + """ + @staticmethod + def get_insert_position(admin_menu, item_name): + """ + Ensures that there is a SHORTCUTS_BREAK and returns a position for an + alphabetical position against all items between SHORTCUTS_BREAK, and + the ADMINISTRATION_BREAK. + """ + start = admin_menu.find_first(Break, identifier=SHORTCUTS_BREAK) + if not start: + end = admin_menu.find_first(Break, identifier=ADMINISTRATION_BREAK) + admin_menu.add_break(SHORTCUTS_BREAK, position=end.index) + start = admin_menu.find_first(Break, identifier=SHORTCUTS_BREAK) + end = admin_menu.find_first(Break, identifier=ADMINISTRATION_BREAK) + + items = admin_menu.get_items()[start.index + 1: end.index] + for idx, item in enumerate(items): + try: + if force_str(item_name.lower()) < force_str(item.name.lower()): + return idx + start.index + 1 + except AttributeError: + # Some item types do not have a 'name' attribute. + pass + return end.index + + def populate(self): + media_library = _('Media library') + + admin_menu = self.toolbar.get_or_create_menu(ADMIN_MENU_IDENTIFIER) + admin_menu.add_sideframe_item( + media_library, + url=reverse('admin:filer_folder_changelist'), + position=self.get_insert_position(admin_menu, media_library) + ) diff --git a/filer/fields/file.py b/filer/fields/file.py index e43b56871..7fb4bf6b8 100644 --- a/filer/fields/file.py +++ b/filer/fields/file.py @@ -1,121 +1,101 @@ -#-*- coding: utf-8 -*- +import logging +import warnings + from django import forms -from django.contrib.admin.widgets import ForeignKeyRawIdWidget -from django.contrib.admin import widgets as django_widgets from django.contrib.admin.sites import site -from django.urls import reverse +from django.contrib.admin.widgets import ForeignKeyRawIdWidget +from django.core.exceptions import ObjectDoesNotExist from django.db import models from django.template.loader import render_to_string +from django.urls import reverse +from django.utils.http import urlencode from django.utils.safestring import mark_safe -from filer.models import File -from filer import settings as filer_settings -from filer.utils.model_label import get_model_label -try: - from django.utils.text import truncate_words -except ImportError: - from django.template.defaultfilters import truncatewords as truncate_words +from .. import settings as filer_settings +from ..models import File +from ..settings import ICON_CSS_LIB +from ..utils.compatibility import truncate_words +from ..utils.model_label import get_model_label + -import logging logger = logging.getLogger(__name__) + class AdminFileWidget(ForeignKeyRawIdWidget): choices = None - def __init__(self, *args, **kwargs): - super(AdminFileWidget, self).__init__(*args, **kwargs) - self.set_defaults() - - def set_defaults(self): - self.custom_preview_width = None - self.search_label = None - self.remove_label = None - - def render(self, name, value, attrs=None): + def render(self, name, value, attrs=None, renderer=None): obj = self.obj_for_value(value) - css_id = attrs.get('id', 'id_image_x') - css_id_thumbnail_img = "%s_thumbnail_img" % css_id - css_id_description_txt = "%s_description_txt" % css_id - css_id_link_to_file = "%s_link_to_file" % css_id + css_id = attrs.get("id", "id_image_x") related_url = None + change_url = "" if value: try: file_obj = File.objects.get(pk=value) - related_url = file_obj.logical_folder.\ - get_admin_directory_listing_url_path() + related_url = ( + file_obj.logical_folder.get_admin_directory_listing_url_path() + ) + change_url = file_obj.get_admin_change_url() except Exception as e: # catch exception and manage it. We can re-raise it for debugging # purposes and/or just logging it, provided user configured # proper logging configuration if filer_settings.FILER_ENABLE_LOGGING: - logger.error('Error while rendering file widget: %s',e) + logger.error("Error while rendering file widget: %s", e) if filer_settings.FILER_DEBUG: - raise e + raise if not related_url: - related_url = reverse('admin:filer-directory_listing-root') + related_url = reverse("admin:filer-directory_listing-last") params = self.url_parameters() + params["_pick"] = "file" if params: - lookup_url = '?' + '&'.join( - ['%s=%s' % (k, v) for k, v in list(params.items())]) + lookup_url = "?" + urlencode(sorted(params.items())) else: - lookup_url = '' - if not 'class' in attrs: + lookup_url = "" + # Filer image is never autocomplete widget; Django's popup js fails if it finds "data-context="available-source" + self.attrs.pop("data-context", None) + if "class" not in attrs: # The JavaScript looks for this hook. - attrs['class'] = 'vForeignKeyRawIdAdminField' + attrs["class"] = "vForeignKeyRawIdAdminField" # rendering the super for ForeignKeyRawIdWidget on purpose here because # we only need the input and none of the other stuff that # ForeignKeyRawIdWidget adds hidden_input = super(ForeignKeyRawIdWidget, self).render( - name, value, attrs) - filer_static_prefix = filer_settings.FILER_STATICMEDIA_PREFIX - if not filer_static_prefix[-1] == '/': - filer_static_prefix += '/' + name, value, attrs + ) # grandparent super context = { - 'hidden_input': hidden_input, - 'lookup_url': '%s%s' % (related_url, lookup_url), - 'thumb_id': css_id_thumbnail_img, - 'span_id': css_id_description_txt, - 'link_id': css_id_link_to_file, - 'object': obj, - 'lookup_name': name, - 'filer_static_prefix': filer_static_prefix, - 'clear_id': '%s_clear' % css_id, - 'id': css_id, - 'search_label': self.search_label, - 'remove_label': self.remove_label, + "hidden_input": hidden_input, + "lookup_url": f"{related_url}{lookup_url}", + "change_url": change_url, + "object": obj, + "lookup_name": name, + "id": css_id, + "admin_icon_delete": ("admin/img/icon-deletelink.svg"), } - - template = 'admin/filer/widgets/admin_file.html' - if self.custom_preview_width: - self.update_context_for_custom_preview(context, obj) - template = 'admin/filer/widgets/admin_file_custom.html' - - html = render_to_string(template, context) + html = render_to_string("admin/filer/widgets/admin_file.html", context) return mark_safe(html) def label_for_value(self, value): obj = self.obj_for_value(value) - return ' %s' % truncate_words(obj, 14) + return " %s" % truncate_words(obj, 14) def obj_for_value(self, value): - try: - key = self.remote_field.get_related_field().name - obj = self.remote_field.model.objects.get(**{key: value}) - except: + if value: + try: + # the next line may never bee reached + key = self.rel.get_related_field().name + obj = self.rel.model._default_manager.get(**{key: value}) + except ObjectDoesNotExist: + obj = None + else: obj = None return obj - def update_context_for_custom_preview(self, context, obj): - context['custom_preview'] = True - context['custom_preview_width'] = self.custom_preview_width - context['custom_preview_image'] = self.get_custom_preview_image(obj=obj) - return context - - def get_custom_preview_image(self, obj): - return obj.icons['32'] if obj else None - class Media: - js = (filer_settings.FILER_STATICMEDIA_PREFIX + 'js/popup_handling.js',) + css = { + "all": ("filer/css/admin_filer.css",) + ICON_CSS_LIB, + } + js = ("filer/js/dist/admin-file-widget.bundle.js",) class AdminFileFormField(forms.ModelChoiceField): @@ -127,8 +107,8 @@ def __init__(self, rel, queryset, to_field_name, *args, **kwargs): self.to_field_name = to_field_name self.max_value = None self.min_value = None - kwargs.pop('widget', None) - super(AdminFileFormField, self).__init__(queryset, widget=self.widget(rel, site), *args, **kwargs) + kwargs.pop("widget", None) + super().__init__(queryset, widget=self.widget(rel, site), *args, **kwargs) def widget_attrs(self, widget): widget.required = self.required @@ -139,28 +119,26 @@ class FilerFileField(models.ForeignKey): default_form_class = AdminFileFormField default_model_class = File - def __init__(self, to=None, *args, **kwargs): - kwargs['to'] = get_model_label(self.default_model_class) - super(FilerFileField, self).__init__(*args, **kwargs) + def __init__(self, **kwargs): + to = kwargs.pop("to", None) + dfl = get_model_label(self.default_model_class) + if to and get_model_label(to).lower() != dfl.lower(): + msg = "In {}: ForeignKey must point to {}; instead passed {}" + warnings.warn(msg.format(self.__class__.__name__, dfl, to), SyntaxWarning) + kwargs["to"] = dfl # hard-code `to` to model `filer.File` + super().__init__(**kwargs) def formfield(self, **kwargs): - # This is a fairly standard way to set up some defaults - # while letting the caller override them. defaults = { - 'form_class': self.default_form_class, - 'rel': self.remote_field, + "form_class": self.default_form_class, + "rel": self.remote_field, } defaults.update(kwargs) - return super(FilerFileField, self).formfield(**defaults) - - def south_field_triple(self): - "Returns a suitable description of this field for South." - # We'll just introspect ourselves, since we inherit. - from south.modelsinspector import introspector - field_class = "django.db.models.fields.related.ForeignKey" - args, kwargs = introspector(self) - # That's our definition! - return (field_class, args, kwargs) + return super().formfield(**defaults) + + +# PBS-specific: widget that doesn't show clear checkbox +from django.contrib.admin import widgets as django_widgets class NonClearableFileInput(django_widgets.AdminFileWidget): diff --git a/filer/fields/folder.py b/filer/fields/folder.py index a1bf9f88a..5a6dc450a 100644 --- a/filer/fields/folder.py +++ b/filer/fields/folder.py @@ -1,35 +1,35 @@ -#-*- coding: utf-8 -*- -from django.template.loader import render_to_string +import warnings from django import forms -from django.contrib.admin.widgets import ForeignKeyRawIdWidget from django.contrib.admin.sites import site -from django.urls import reverse +from django.contrib.admin.widgets import ForeignKeyRawIdWidget +from django.core.exceptions import ObjectDoesNotExist from django.db import models +from django.template.loader import render_to_string +from django.urls import reverse +from django.utils.http import urlencode from django.utils.safestring import mark_safe -from filer.models import Folder -from filer.settings import FILER_STATICMEDIA_PREFIX -from filer.utils.model_label import get_model_label -try: - from django.utils.text import truncate_words -except ImportError: - from django.template.defaultfilters import truncatewords as truncate_words +from ..models import Folder +from ..settings import ICON_CSS_LIB +from ..utils.compatibility import truncate_words +from ..utils.model_label import get_model_label class AdminFolderWidget(ForeignKeyRawIdWidget): choices = None + input_type = "hidden" + is_hidden = False - - def render(self, name, value, attrs=None): + def render(self, name, value, attrs=None, renderer=None): obj = self.obj_for_value(value) - css_id = attrs.get('id') + css_id = attrs.get("id") css_id_folder = "%s_folder" % css_id css_id_description_txt = "%s_description_txt" % css_id - required = self.attrs if attrs is None: attrs = {} related_url = None + if value: try: folder = Folder.objects.get(pk=value) @@ -37,52 +37,57 @@ def render(self, name, value, attrs=None): except Exception: pass if not related_url: - related_url = reverse('admin:filer-directory_listing-root') + related_url = reverse("admin:filer-directory_listing-last") params = self.url_parameters() - params['select_folder'] = 1 + params["_pick"] = "folder" if params: - url = '?' + '&'.join( - ['%s=%s' % (k, v) for k, v in list(params.items())]) + url = "?" + urlencode(sorted(params.items())) else: - url = '' - if not 'class' in attrs: + url = "" + if "class" not in attrs: # The JavaScript looks for this hook. - attrs['class'] = 'vForeignKeyRawIdAdminField' + attrs["class"] = "vForeignKeyRawIdAdminField" super_attrs = attrs.copy() hidden_input = super(ForeignKeyRawIdWidget, self).render( - name, value, super_attrs) + name, value, super_attrs + ) # grandparent super # TODO: "id_" is hard-coded here. This should instead use the correct # API to determine the ID dynamically. context = { - 'hidden_input': hidden_input, - 'lookup_url': '%s%s' % (related_url, url), - 'lookup_name': name, - 'span_id': css_id_description_txt, - 'object': obj, - 'clear_id': '%s_clear' % css_id, - 'descid': css_id_description_txt, - 'noimg': '%sicons/nofile_32x32.png' % FILER_STATICMEDIA_PREFIX, - 'foldid': css_id_folder, - 'id': css_id, - } - html = render_to_string('admin/filer/widgets/admin_folder.html', context) + "hidden_input": hidden_input, + "lookup_url": f"{related_url}{url}", + "lookup_name": name, + "span_id": css_id_description_txt, + "object": obj, + "clear_id": "%s_clear" % css_id, + "descid": css_id_description_txt, + "foldid": css_id_folder, + "id": css_id, + } + html = render_to_string("admin/filer/widgets/admin_folder.html", context) return mark_safe(html) def label_for_value(self, value): obj = self.obj_for_value(value) - return ' %s' % truncate_words(obj, 14) + return " %s" % truncate_words(obj, 14) def obj_for_value(self, value): + if not value: + return None try: - key = self.remote_field.get_related_field().name - obj = self.remote_field.model.objects.get(**{key: value}) - except: + key = self.rel.get_related_field().name + obj = self.rel.model._default_manager.get(**{key: value}) + except ObjectDoesNotExist: obj = None return obj class Media: - js = (FILER_STATICMEDIA_PREFIX + 'js/popup_handling.js',) + css = {"all": ("filer/css/admin_filer.css",) + ICON_CSS_LIB} + js = ( + "filer/js/addons/popup_handling.js", + "filer/js/widgets/admin-folder-widget.js", + ) class AdminFolderFormField(forms.ModelChoiceField): @@ -91,11 +96,13 @@ class AdminFolderFormField(forms.ModelChoiceField): def __init__(self, rel, queryset, to_field_name, *args, **kwargs): self.rel = rel self.queryset = queryset + self.limit_choices_to = kwargs.pop("limit_choices_to", None) self.to_field_name = to_field_name self.max_value = None self.min_value = None - kwargs.pop('widget', None) - super(AdminFolderFormField, self).__init__(queryset, widget=self.widget(rel, site), *args, **kwargs) + kwargs.pop("widget", None) + kwargs.pop("blank", None) + forms.Field.__init__(self, widget=self.widget(rel, site), *args, **kwargs) def widget_attrs(self, widget): widget.required = self.required @@ -107,24 +114,22 @@ class FilerFolderField(models.ForeignKey): default_model_class = Folder def __init__(self, **kwargs): - kwargs['to'] = get_model_label(self.default_model_class) - super(FilerFolderField, self).__init__(**kwargs) + # We hard-code the `to` argument for ForeignKey.__init__ + dfl = get_model_label(self.default_model_class) + if "to" in kwargs.keys(): # pragma: no cover + old_to = get_model_label(kwargs.pop("to")) + if old_to.lower() != dfl.lower(): + msg = "{} can only be a ForeignKey to {}; {} passed".format( + self.__class__.__name__, dfl, old_to + ) + warnings.warn(msg, SyntaxWarning) + kwargs["to"] = dfl + super().__init__(**kwargs) def formfield(self, **kwargs): - # This is a fairly standard way to set up some defaults - # while letting the caller override them. defaults = { - 'form_class': self.default_form_class, - 'rel': self.remote_field, + "form_class": self.default_form_class, + "rel": self.remote_field, } defaults.update(kwargs) - return super(FilerFolderField, self).formfield(**defaults) - - def south_field_triple(self): - "Returns a suitable description of this field for South." - # We'll just introspect ourselves, since we inherit. - from south.modelsinspector import introspector - field_class = "django.db.models.fields.related.ForeignKey" - args, kwargs = introspector(self) - # That's our definition! - return (field_class, args, kwargs) + return super().formfield(**defaults) diff --git a/filer/fields/image.py b/filer/fields/image.py index c9eabe90d..d1ff162bb 100644 --- a/filer/fields/image.py +++ b/filer/fields/image.py @@ -1,13 +1,9 @@ -#-*- coding: utf-8 -*- -from filer.fields.file import AdminFileWidget, AdminFileFormField, \ - FilerFileField -from filer.models import Image +from .. import settings +from .file import AdminFileFormField, AdminFileWidget, FilerFileField class AdminImageWidget(AdminFileWidget): - - def get_custom_preview_image(self, obj): - return obj.url if obj else None + pass class AdminImageFormField(AdminFileFormField): @@ -16,4 +12,4 @@ class AdminImageFormField(AdminFileFormField): class FilerImageField(FilerFileField): default_form_class = AdminImageFormField - default_model_class = Image + default_model_class = settings.FILER_IMAGE_MODEL diff --git a/filer/fields/multistorage_file.py b/filer/fields/multistorage_file.py index 9be171cdf..83e73b5c9 100644 --- a/filer/fields/multistorage_file.py +++ b/filer/fields/multistorage_file.py @@ -1,10 +1,16 @@ -#-*- coding: utf-8 -*- -from easy_thumbnails import fields as easy_thumbnails_fields, \ - files as easy_thumbnails_files +import base64 +import hashlib +import warnings +from io import BytesIO -from filer import settings as filer_settings -from filer.utils.filer_easy_thumbnails import ThumbnailerNameMixin -from filer.utils.cdn import get_cdn_url +from django.core.files.base import ContentFile +from django.db.models.fields.files import FileDescriptor + +from easy_thumbnails import fields as easy_thumbnails_fields +from easy_thumbnails import files as easy_thumbnails_files + +from .. import settings as filer_settings +from ..utils.filer_easy_thumbnails import ThumbnailerNameMixin STORAGES = { @@ -33,18 +39,30 @@ def generate_filename_multistorage(instance, filename): return upload_to -class CdnAwareThumbnailFile(object): - - def __init__(self, thumbnail_file, filer_file): - self._thumbnail_file = thumbnail_file - self._filer_file = filer_file - - def __getattr__(self, attr_name): - return getattr(self._thumbnail_file, attr_name) - - @property - def url(self): - return get_cdn_url(self._filer_file, self._thumbnail_file.url) +class MultiStorageFileDescriptor(FileDescriptor): + """ + This is rather similar to Django's ImageFileDescriptor. + It calls _data_changed on model instance when new + value is set. The callback is supposed to update fields which + are related to file data (like size, checksum, etc.). + When this is called from model __init__ (prev_assigned=False), + it does nothing because related fields might not have values yet. + In such case data_changed callback should be called at the end of model __init__ + (File.__init__ in this case). + """ + def __set__(self, instance, value): + prev_assigned = self.field.name in instance.__dict__ + previous_file = instance.__dict__.get(self.field.name) + super().__set__(instance, value) + + # To prevent recalculating file data related attributes when we are instantiating + # an object from the database, update only if the field had a value before this assignment. + # To prevent recalculating upon reassignment of the same file, update only if value is + # different from the previous one. + if prev_assigned and value != previous_file: + callback_attr = f'{self.field.name}_data_changed' + if hasattr(instance, callback_attr): + getattr(instance, callback_attr)() class MultiStorageFieldFile(ThumbnailerNameMixin, @@ -52,7 +70,7 @@ class MultiStorageFieldFile(ThumbnailerNameMixin, def __init__(self, instance, field, name): """ This is a little weird, but I couldn't find a better solution. - Thumbnailer.__init__ is called first for proper object inizialization. + Thumbnailer.__init__ is called first for proper object initialisation. Then we override some attributes defined at runtime with properties. We cannot simply call super().__init__ because filer Field objects doesn't have a storage attribute. @@ -97,41 +115,69 @@ def _thumbnail_base_dir(self): else: return self.thumbnail_options['private'].get('base_dir', '') - def _get_url(self): - if self.instance.is_in_trash(): - return '' - url = super(MultiStorageFieldFile, self).url - return get_cdn_url(self.instance, url) - url = property(_get_url) + def get_thumbnail(self, thumbnail_options, save=True, generate=None): + # PBS: prevent thumbnail generation for soft-deleted (trashed) files + if hasattr(self.instance, 'is_in_trash') and self.instance.is_in_trash(): + return None + return super().get_thumbnail(thumbnail_options, save=save, generate=generate) def save(self, name, content, save=True): - content.seek(0) # Ensure we upload the whole file - super(MultiStorageFieldFile, self).save(name, content, save) - - def get_thumbnail(self, opts, save=True, generate=None): - if self.instance.is_in_trash(): - return None - thumbnail = super(MultiStorageFieldFile, self).get_thumbnail(opts, save, generate) - return CdnAwareThumbnailFile(thumbnail, self.instance) + content.seek(0) # Ensure we upload the whole file + super().save(name, content, save) - def get_thumbnails(self, *args, **kwargs): - if self.instance.is_in_trash(): - return [] - return super(MultiStorageFieldFile, self).get_thumbnails( - *args, **kwargs) + def exists(self): + """ + Returns ``True`` if underlying file exists in storage. + """ + return self.name and self.storage.exists(self.name) class MultiStorageFileField(easy_thumbnails_fields.ThumbnailerField): attr_class = MultiStorageFieldFile + descriptor_class = MultiStorageFileDescriptor def __init__(self, verbose_name=None, name=None, storages=None, thumbnail_storages=None, thumbnail_options=None, **kwargs): - # fix for makemigrations - kwargs.pop("upload_to", None) + if 'upload_to' in kwargs: # pragma: no cover + upload_to = kwargs.pop("upload_to") + if upload_to != generate_filename_multistorage: + warnings.warn("MultiStorageFileField can handle only File objects;" + "%s passed" % upload_to, SyntaxWarning) self.storages = storages or STORAGES self.thumbnail_storages = thumbnail_storages or THUMBNAIL_STORAGES self.thumbnail_options = thumbnail_options or THUMBNAIL_OPTIONS super(easy_thumbnails_fields.ThumbnailerField, self).__init__( - verbose_name=verbose_name, name=name, - upload_to=generate_filename_multistorage, - storage=None, **kwargs) + verbose_name=verbose_name, name=name, + upload_to=generate_filename_multistorage, + storage=None, **kwargs) # grandparent super + + def value_to_string(self, obj): + value = super().value_to_string(obj) + if not filer_settings.FILER_DUMP_PAYLOAD: + return value + try: + payload_file = BytesIO(self.storage.open(value).read()) + sha = hashlib.sha1() + sha.update(payload_file.read()) + if sha.hexdigest() != obj.sha1: + warnings.warn('The checksum for "%s" diverges. Check for file consistency!' % obj.original_filename) + payload_file.seek(0) + encoded_string = base64.b64encode(payload_file.read()).decode('utf-8') + return value, encoded_string + except OSError: + warnings.warn(f'The payload for "{obj.original_filename}" is missing. No such file on disk: {self.storage.location}!') + return value + + def to_python(self, value): + if isinstance(value, list) and len(value) == 2 and isinstance(value[0], str): + filename, payload = value + try: + payload = base64.b64decode(payload) + except TypeError: + pass + else: + if self.storage.exists(filename): + self.storage.delete(filename) + self.storage.save(filename, ContentFile(payload)) + return filename + return value diff --git a/filer/locale/ar/LC_MESSAGES/django.mo b/filer/locale/ar/LC_MESSAGES/django.mo new file mode 100644 index 000000000..ec06f66ea Binary files /dev/null and b/filer/locale/ar/LC_MESSAGES/django.mo differ diff --git a/filer/locale/ar/LC_MESSAGES/django.po b/filer/locale/ar/LC_MESSAGES/django.po new file mode 100644 index 000000000..5469f0334 --- /dev/null +++ b/filer/locale/ar/LC_MESSAGES/django.po @@ -0,0 +1,1245 @@ +# 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: +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django Filer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: Angelo Dini \n" +"Language-Team: Arabic (http://app.transifex.com/divio/django-filer/language/" +"ar/)\n" +"Language: ar\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " +"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +#: admin/clipboardadmin.py:17 +msgid "You do not have permission to upload files." +msgstr "" + +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "" + +#: admin/clipboardadmin.py:20 +msgid "Can't use this folder, Permission Denied. Please select another folder." +msgstr "" + +#: admin/fileadmin.py:73 +msgid "Advanced" +msgstr "" + +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" + +#: admin/folderadmin.py:434 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "" + +#: admin/folderadmin.py:475 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "" + +#: admin/folderadmin.py:612 +msgid "No action selected." +msgstr "" + +#: admin/folderadmin.py:664 +#, python-format +msgid "Successfully moved %(count)d files to clipboard." +msgstr "" + +#: admin/folderadmin.py:669 +msgid "Move selected files to clipboard" +msgstr "" + +#: admin/folderadmin.py:709 +#, python-format +msgid "Successfully disabled permissions for %(count)d files." +msgstr "" + +#: admin/folderadmin.py:711 +#, python-format +msgid "Successfully enabled permissions for %(count)d files." +msgstr "" + +#: admin/folderadmin.py:719 +msgid "Enable permissions for selected files" +msgstr "" + +#: admin/folderadmin.py:725 +msgid "Disable permissions for selected files" +msgstr "" + +#: admin/folderadmin.py:789 +#, python-format +msgid "Successfully deleted %(count)d files and/or folders." +msgstr "" + +#: admin/folderadmin.py:794 +msgid "Cannot delete files and/or folders" +msgstr "" + +#: admin/folderadmin.py:796 +msgid "Are you sure?" +msgstr "" + +#: admin/folderadmin.py:802 +msgid "Delete files and/or folders" +msgstr "" + +#: admin/folderadmin.py:823 +msgid "Delete selected files and/or folders" +msgstr "" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "" + +#: admin/folderadmin.py:934 +#, python-format +msgid "" +"Successfully moved %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" + +#: admin/folderadmin.py:942 admin/folderadmin.py:944 +msgid "Move files and/or folders" +msgstr "" + +#: admin/folderadmin.py:959 +msgid "Move selected files and/or folders" +msgstr "" + +#: admin/folderadmin.py:1016 +#, python-format +msgid "Successfully renamed %(count)d files." +msgstr "" + +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 +msgid "Rename files" +msgstr "" + +#: admin/folderadmin.py:1137 +#, python-format +msgid "" +"Successfully copied %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" + +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 +msgid "Copy files and/or folders" +msgstr "" + +#: admin/folderadmin.py:1174 +msgid "Copy selected files and/or folders" +msgstr "" + +#: admin/folderadmin.py:1279 +#, python-format +msgid "Successfully resized %(count)d images." +msgstr "" + +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 +msgid "Resize images" +msgstr "" + +#: admin/folderadmin.py:1303 +msgid "Resize selected images" +msgstr "" + +#: admin/forms.py:24 +msgid "Suffix which will be appended to filenames of copied files." +msgstr "" + +#: admin/forms.py:31 +#, python-format +msgid "" +"Suffix should be a valid, simple and lowercase filename part, like " +"\"%(valid)s\"." +msgstr "" + +#: admin/forms.py:52 +#, python-format +msgid "Unknown rename format value key \"%(key)s\"." +msgstr "" + +#: admin/forms.py:54 +#, python-format +msgid "Invalid rename format: %(error)s." +msgstr "" + +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 +msgid "thumbnail option" +msgstr "" + +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 +msgid "width" +msgstr "" + +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 +msgid "height" +msgstr "" + +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 +msgid "crop" +msgstr "" + +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 +msgid "upscale" +msgstr "" + +#: admin/forms.py:79 +msgid "Thumbnail option or resize parameters must be choosen." +msgstr "" + +#: admin/imageadmin.py:20 admin/imageadmin.py:112 +msgid "Subject location" +msgstr "" + +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "" + +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "" + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "" + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "" + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" +msgstr "" + +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" +msgstr "" + +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "" + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "" + +#: models/abstract.py:62 +msgid "default alt text" +msgstr "" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "" + +#: models/abstract.py:76 +msgid "subject location" +msgstr "" + +#: models/abstract.py:91 +msgid "image" +msgstr "" + +#: models/abstract.py:92 +msgid "images" +msgstr "" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "" + +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." +msgstr "" + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 +msgid "user" +msgstr "" + +#: models/clipboardmodels.py:17 models/filemodels.py:157 +msgid "files" +msgstr "" + +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 +msgid "clipboard" +msgstr "" + +#: models/clipboardmodels.py:25 +msgid "clipboards" +msgstr "" + +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 +msgid "file" +msgstr "" + +#: models/clipboardmodels.py:56 +msgid "clipboard item" +msgstr "" + +#: models/clipboardmodels.py:57 +msgid "clipboard items" +msgstr "" + +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "folder" +msgstr "" + +#: models/filemodels.py:81 +msgid "file size" +msgstr "" + +#: models/filemodels.py:87 +msgid "sha1" +msgstr "" + +#: models/filemodels.py:94 +msgid "has all mandatory data" +msgstr "" + +#: models/filemodels.py:100 +msgid "original filename" +msgstr "" + +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 +msgid "name" +msgstr "" + +#: models/filemodels.py:116 +msgid "description" +msgstr "" + +#: models/filemodels.py:125 models/foldermodels.py:108 +msgid "owner" +msgstr "" + +#: models/filemodels.py:129 models/foldermodels.py:116 +msgid "uploaded at" +msgstr "" + +#: models/filemodels.py:134 models/foldermodels.py:126 +msgid "modified at" +msgstr "" + +#: models/filemodels.py:140 +msgid "Permissions disabled" +msgstr "" + +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "" + +#: models/foldermodels.py:94 +msgid "parent" +msgstr "" + +#: models/foldermodels.py:121 +msgid "created at" +msgstr "" + +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Folder" +msgstr "" + +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 +msgid "Folders" +msgstr "" + +#: models/foldermodels.py:260 +msgid "all items" +msgstr "" + +#: models/foldermodels.py:261 +msgid "this item only" +msgstr "" + +#: models/foldermodels.py:262 +msgid "this item and all children" +msgstr "" + +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "" + +#: models/foldermodels.py:280 +msgid "type" +msgstr "" + +#: models/foldermodels.py:297 +msgid "group" +msgstr "" + +#: models/foldermodels.py:304 +msgid "everybody" +msgstr "" + +#: models/foldermodels.py:309 +msgid "can read" +msgstr "" + +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "" + +#: models/foldermodels.py:325 +msgid "can add children" +msgstr "" + +#: models/foldermodels.py:333 +msgid "folder permission" +msgstr "" + +#: models/foldermodels.py:334 +msgid "folder permissions" +msgstr "" + +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." +msgstr "" + +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." +msgstr "" + +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." +msgstr "" + +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." +msgstr "" + +#: models/foldermodels.py:360 +msgid "All Folders" +msgstr "" + +#: models/foldermodels.py:362 +msgid "Logical Path" +msgstr "" + +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" +msgstr "" + +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" +msgstr "" + +#: models/foldermodels.py:375 +msgid "Everybody" +msgstr "" + +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "" + +#: models/foldermodels.py:389 +msgid "Read" +msgstr "" + +#: models/foldermodels.py:390 +msgid "Add children" +msgstr "" + +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "" + +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "" + +#: models/virtualitems.py:73 +msgid "files with missing metadata" +msgstr "" + +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "root" +msgstr "" + +#: settings.py:273 +msgid "Show table view" +msgstr "" + +#: settings.py:278 +msgid "Show thumbnail view" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Run the selected action" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Go" +msgstr "" + +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +msgid "Click here to select the objects across all pages" +msgstr "" + +#: templates/admin/filer/actions.html:14 +#, python-format +msgid "Select all %(total_count)s files and/or folders" +msgstr "" + +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 +msgid "Clear selection" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 +msgid "Go back to admin homepage" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 +msgid "Home" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 +msgid "Go back to Filer app" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Go back to root folder" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:8 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 +#, python-format +msgid "Go back to '%(folder_name)s' folder" +msgstr "" + +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:11 +msgid "" +"Deleting the selected files and/or folders would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:19 +msgid "" +"Deleting the selected files and/or folders would require deleting the " +"following protected related objects:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:27 +msgid "" +"Are you sure you want to delete the selected files and/or folders? All of " +"the following objects and their related items will be deleted:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "" + +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 +msgid "History" +msgstr "" + +#: templates/admin/filer/file/change_form.html:37 +#: templates/admin/filer/folder/change_form.html:23 +#: templates/admin/filer/image/change_form.html:37 +msgid "View on site" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 +msgid "Folder Icon" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:23 +msgid "" +"Your account doesn't have permissions to copy all of the selected files and/" +"or folders." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 +msgid "There are no destination folders available." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:35 +msgid "There are no files and/or folders available to copy." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:40 +msgid "" +"The following files and/or folders will be copied to a destination folder " +"(retaining their tree structure):" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 +msgid "Destination folder:" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 +msgid "Copy" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 +msgid "" +"Your account doesn't have permissions to resize all of the selected images." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:18 +msgid "There are no images available to resize." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:20 +msgid "The following images will be resized:" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:32 +msgid "Choose an existing thumbnail option or enter resize parameters:" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:36 +msgid "" +"Warning: Images will be resized in-place and originals will be lost. Maybe " +"first make a copy of them to retain the originals." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:39 +msgid "Resize" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:35 +msgid "" +"Your account doesn't have permissions to move all of the selected files and/" +"or folders." +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:47 +msgid "There are no files and/or folders available to move." +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:52 +msgid "" +"The following files and/or folders will be moved to a destination folder " +"(retaining their tree structure):" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 +msgid "Move" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:15 +msgid "" +"Your account doesn't have permissions to rename all of the selected files." +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:18 +msgid "There are no files available to rename." +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:20 +msgid "" +"The following files will be renamed (they will stay in their folders and " +"keep original filename, only displayed filename will be changed):" +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:59 +msgid "Rename" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:16 +msgid "Name" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 +#, python-format +msgid "Change '%(item_label)s' folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 +msgid "Select this file" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 +#, python-format +msgid "Change '%(item_label)s' details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "Permissions" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "disabled" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "enabled" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:144 +msgid "URL copied to clipboard" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:147 +#, python-format +msgid "Canonical url '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:151 +#, python-format +msgid "Download '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 +msgid "previous" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 +#, python-format +msgid "Page %(number)s of %(num_pages)s." +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 +msgid "next" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +msgid "Select all" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +msgid "Files" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +msgid "Add new" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:15 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: templates/admin/filer/folder/new_folder_form.html:30 +msgid "Save" +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +msgid "File is missing" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "found" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "and" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:7 +msgid "cancel search" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "" + +#: templates/admin/filer/widgets/admin_folder.html:16 +msgid "Choose Folder" +msgstr "" + +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" +msgstr "" + +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" +msgstr "" + +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" +msgstr "" + +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" +msgstr "" + +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" +msgstr "" + +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." + +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" + +#~ msgid "Open file" +#~ msgstr "Open file" + +#~ msgid "Full size preview" +#~ msgstr "Full size preview" + +#~ msgid "Add Description" +#~ msgstr "Add Description" + +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" + +#~ msgid "none selected" +#~ msgstr "none selected" + +#~ msgid "Add Folder" +#~ msgstr "Add Folder" + +#~ msgid "Subject Location" +#~ msgstr "Subject location" + +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" +#~ msgstr[1] "15c0f2d28d6dab1af1f6d94906beb627_pl_1" +#~ msgstr[2] "15c0f2d28d6dab1af1f6d94906beb627_pl_2" +#~ msgstr[3] "15c0f2d28d6dab1af1f6d94906beb627_pl_3" +#~ msgstr[4] "15c0f2d28d6dab1af1f6d94906beb627_pl_4" +#~ msgstr[5] "15c0f2d28d6dab1af1f6d94906beb627_pl_5" + +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/bg/LC_MESSAGES/django.mo b/filer/locale/bg/LC_MESSAGES/django.mo new file mode 100644 index 000000000..24974f0a5 Binary files /dev/null and b/filer/locale/bg/LC_MESSAGES/django.mo differ diff --git a/filer/locale/bg/LC_MESSAGES/django.po b/filer/locale/bg/LC_MESSAGES/django.po new file mode 100644 index 000000000..88b4a3899 --- /dev/null +++ b/filer/locale/bg/LC_MESSAGES/django.po @@ -0,0 +1,1224 @@ +# 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: +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django Filer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: Angelo Dini \n" +"Language-Team: Bulgarian (http://app.transifex.com/divio/django-filer/" +"language/bg/)\n" +"Language: bg\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: admin/clipboardadmin.py:17 +msgid "You do not have permission to upload files." +msgstr "" + +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "" + +#: admin/clipboardadmin.py:20 +msgid "Can't use this folder, Permission Denied. Please select another folder." +msgstr "" + +#: admin/fileadmin.py:73 +msgid "Advanced" +msgstr "" + +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" + +#: admin/folderadmin.py:434 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "" +msgstr[1] "" + +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "" + +#: admin/folderadmin.py:475 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "" + +#: admin/folderadmin.py:612 +msgid "No action selected." +msgstr "" + +#: admin/folderadmin.py:664 +#, python-format +msgid "Successfully moved %(count)d files to clipboard." +msgstr "" + +#: admin/folderadmin.py:669 +msgid "Move selected files to clipboard" +msgstr "" + +#: admin/folderadmin.py:709 +#, python-format +msgid "Successfully disabled permissions for %(count)d files." +msgstr "" + +#: admin/folderadmin.py:711 +#, python-format +msgid "Successfully enabled permissions for %(count)d files." +msgstr "" + +#: admin/folderadmin.py:719 +msgid "Enable permissions for selected files" +msgstr "" + +#: admin/folderadmin.py:725 +msgid "Disable permissions for selected files" +msgstr "" + +#: admin/folderadmin.py:789 +#, python-format +msgid "Successfully deleted %(count)d files and/or folders." +msgstr "" + +#: admin/folderadmin.py:794 +msgid "Cannot delete files and/or folders" +msgstr "" + +#: admin/folderadmin.py:796 +msgid "Are you sure?" +msgstr "" + +#: admin/folderadmin.py:802 +msgid "Delete files and/or folders" +msgstr "" + +#: admin/folderadmin.py:823 +msgid "Delete selected files and/or folders" +msgstr "" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "" + +#: admin/folderadmin.py:934 +#, python-format +msgid "" +"Successfully moved %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" + +#: admin/folderadmin.py:942 admin/folderadmin.py:944 +msgid "Move files and/or folders" +msgstr "" + +#: admin/folderadmin.py:959 +msgid "Move selected files and/or folders" +msgstr "" + +#: admin/folderadmin.py:1016 +#, python-format +msgid "Successfully renamed %(count)d files." +msgstr "" + +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 +msgid "Rename files" +msgstr "" + +#: admin/folderadmin.py:1137 +#, python-format +msgid "" +"Successfully copied %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" + +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 +msgid "Copy files and/or folders" +msgstr "" + +#: admin/folderadmin.py:1174 +msgid "Copy selected files and/or folders" +msgstr "" + +#: admin/folderadmin.py:1279 +#, python-format +msgid "Successfully resized %(count)d images." +msgstr "" + +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 +msgid "Resize images" +msgstr "" + +#: admin/folderadmin.py:1303 +msgid "Resize selected images" +msgstr "" + +#: admin/forms.py:24 +msgid "Suffix which will be appended to filenames of copied files." +msgstr "" + +#: admin/forms.py:31 +#, python-format +msgid "" +"Suffix should be a valid, simple and lowercase filename part, like " +"\"%(valid)s\"." +msgstr "" + +#: admin/forms.py:52 +#, python-format +msgid "Unknown rename format value key \"%(key)s\"." +msgstr "" + +#: admin/forms.py:54 +#, python-format +msgid "Invalid rename format: %(error)s." +msgstr "" + +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 +msgid "thumbnail option" +msgstr "" + +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 +msgid "width" +msgstr "" + +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 +msgid "height" +msgstr "" + +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 +msgid "crop" +msgstr "" + +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 +msgid "upscale" +msgstr "" + +#: admin/forms.py:79 +msgid "Thumbnail option or resize parameters must be choosen." +msgstr "" + +#: admin/imageadmin.py:20 admin/imageadmin.py:112 +msgid "Subject location" +msgstr "" + +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "" + +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "" + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "" + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "" + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" +msgstr "" + +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" +msgstr "" + +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "" + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "" + +#: models/abstract.py:62 +msgid "default alt text" +msgstr "" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "" + +#: models/abstract.py:76 +msgid "subject location" +msgstr "" + +#: models/abstract.py:91 +msgid "image" +msgstr "" + +#: models/abstract.py:92 +msgid "images" +msgstr "" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "" + +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." +msgstr "" + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 +msgid "user" +msgstr "" + +#: models/clipboardmodels.py:17 models/filemodels.py:157 +msgid "files" +msgstr "" + +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 +msgid "clipboard" +msgstr "" + +#: models/clipboardmodels.py:25 +msgid "clipboards" +msgstr "" + +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 +msgid "file" +msgstr "" + +#: models/clipboardmodels.py:56 +msgid "clipboard item" +msgstr "" + +#: models/clipboardmodels.py:57 +msgid "clipboard items" +msgstr "" + +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "folder" +msgstr "" + +#: models/filemodels.py:81 +msgid "file size" +msgstr "" + +#: models/filemodels.py:87 +msgid "sha1" +msgstr "" + +#: models/filemodels.py:94 +msgid "has all mandatory data" +msgstr "" + +#: models/filemodels.py:100 +msgid "original filename" +msgstr "" + +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 +msgid "name" +msgstr "" + +#: models/filemodels.py:116 +msgid "description" +msgstr "" + +#: models/filemodels.py:125 models/foldermodels.py:108 +msgid "owner" +msgstr "" + +#: models/filemodels.py:129 models/foldermodels.py:116 +msgid "uploaded at" +msgstr "" + +#: models/filemodels.py:134 models/foldermodels.py:126 +msgid "modified at" +msgstr "" + +#: models/filemodels.py:140 +msgid "Permissions disabled" +msgstr "" + +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "" + +#: models/foldermodels.py:94 +msgid "parent" +msgstr "" + +#: models/foldermodels.py:121 +msgid "created at" +msgstr "" + +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Folder" +msgstr "" + +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 +msgid "Folders" +msgstr "" + +#: models/foldermodels.py:260 +msgid "all items" +msgstr "" + +#: models/foldermodels.py:261 +msgid "this item only" +msgstr "" + +#: models/foldermodels.py:262 +msgid "this item and all children" +msgstr "" + +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "" + +#: models/foldermodels.py:280 +msgid "type" +msgstr "" + +#: models/foldermodels.py:297 +msgid "group" +msgstr "" + +#: models/foldermodels.py:304 +msgid "everybody" +msgstr "" + +#: models/foldermodels.py:309 +msgid "can read" +msgstr "" + +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "" + +#: models/foldermodels.py:325 +msgid "can add children" +msgstr "" + +#: models/foldermodels.py:333 +msgid "folder permission" +msgstr "" + +#: models/foldermodels.py:334 +msgid "folder permissions" +msgstr "" + +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." +msgstr "" + +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." +msgstr "" + +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." +msgstr "" + +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." +msgstr "" + +#: models/foldermodels.py:360 +msgid "All Folders" +msgstr "" + +#: models/foldermodels.py:362 +msgid "Logical Path" +msgstr "" + +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" +msgstr "" + +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" +msgstr "" + +#: models/foldermodels.py:375 +msgid "Everybody" +msgstr "" + +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "" + +#: models/foldermodels.py:389 +msgid "Read" +msgstr "" + +#: models/foldermodels.py:390 +msgid "Add children" +msgstr "" + +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "" + +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "" + +#: models/virtualitems.py:73 +msgid "files with missing metadata" +msgstr "" + +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "root" +msgstr "" + +#: settings.py:273 +msgid "Show table view" +msgstr "" + +#: settings.py:278 +msgid "Show thumbnail view" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Run the selected action" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Go" +msgstr "" + +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +msgid "Click here to select the objects across all pages" +msgstr "" + +#: templates/admin/filer/actions.html:14 +#, python-format +msgid "Select all %(total_count)s files and/or folders" +msgstr "" + +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 +msgid "Clear selection" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 +msgid "Go back to admin homepage" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 +msgid "Home" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 +msgid "Go back to Filer app" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Go back to root folder" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:8 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 +#, python-format +msgid "Go back to '%(folder_name)s' folder" +msgstr "" + +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:11 +msgid "" +"Deleting the selected files and/or folders would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:19 +msgid "" +"Deleting the selected files and/or folders would require deleting the " +"following protected related objects:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:27 +msgid "" +"Are you sure you want to delete the selected files and/or folders? All of " +"the following objects and their related items will be deleted:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "" + +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 +msgid "History" +msgstr "" + +#: templates/admin/filer/file/change_form.html:37 +#: templates/admin/filer/folder/change_form.html:23 +#: templates/admin/filer/image/change_form.html:37 +msgid "View on site" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 +msgid "Folder Icon" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:23 +msgid "" +"Your account doesn't have permissions to copy all of the selected files and/" +"or folders." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 +msgid "There are no destination folders available." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:35 +msgid "There are no files and/or folders available to copy." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:40 +msgid "" +"The following files and/or folders will be copied to a destination folder " +"(retaining their tree structure):" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 +msgid "Destination folder:" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 +msgid "Copy" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 +msgid "" +"Your account doesn't have permissions to resize all of the selected images." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:18 +msgid "There are no images available to resize." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:20 +msgid "The following images will be resized:" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:32 +msgid "Choose an existing thumbnail option or enter resize parameters:" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:36 +msgid "" +"Warning: Images will be resized in-place and originals will be lost. Maybe " +"first make a copy of them to retain the originals." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:39 +msgid "Resize" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:35 +msgid "" +"Your account doesn't have permissions to move all of the selected files and/" +"or folders." +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:47 +msgid "There are no files and/or folders available to move." +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:52 +msgid "" +"The following files and/or folders will be moved to a destination folder " +"(retaining their tree structure):" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 +msgid "Move" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:15 +msgid "" +"Your account doesn't have permissions to rename all of the selected files." +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:18 +msgid "There are no files available to rename." +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:20 +msgid "" +"The following files will be renamed (they will stay in their folders and " +"keep original filename, only displayed filename will be changed):" +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:59 +msgid "Rename" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:16 +msgid "Name" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 +#, python-format +msgid "Change '%(item_label)s' folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "" +msgstr[1] "" + +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "" +msgstr[1] "" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 +msgid "Select this file" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 +#, python-format +msgid "Change '%(item_label)s' details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "Permissions" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "disabled" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "enabled" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:144 +msgid "URL copied to clipboard" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:147 +#, python-format +msgid "Canonical url '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:151 +#, python-format +msgid "Download '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 +msgid "previous" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 +#, python-format +msgid "Page %(number)s of %(num_pages)s." +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 +msgid "next" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +msgid "Select all" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +msgid "Files" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +msgid "Add new" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:15 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "" +msgstr[1] "" + +#: templates/admin/filer/folder/new_folder_form.html:30 +msgid "Save" +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +msgid "File is missing" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "found" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "and" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:7 +msgid "cancel search" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "" + +#: templates/admin/filer/widgets/admin_folder.html:16 +msgid "Choose Folder" +msgstr "" + +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" +msgstr "" + +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" +msgstr "" + +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" +msgstr "" + +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" +msgstr "" + +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" +msgstr "" + +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." + +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" + +#~ msgid "Open file" +#~ msgstr "Open file" + +#~ msgid "Full size preview" +#~ msgstr "Full size preview" + +#~ msgid "Add Description" +#~ msgstr "Add Description" + +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" + +#~ msgid "none selected" +#~ msgstr "none selected" + +#~ msgid "Add Folder" +#~ msgstr "Add Folder" + +#~ msgid "Subject Location" +#~ msgstr "Subject location" + +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" +#~ msgstr[1] "15c0f2d28d6dab1af1f6d94906beb627_pl_1" + +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/ca/LC_MESSAGES/django.mo b/filer/locale/ca/LC_MESSAGES/django.mo new file mode 100644 index 000000000..abddc6195 Binary files /dev/null and b/filer/locale/ca/LC_MESSAGES/django.mo differ diff --git a/filer/locale/ca/LC_MESSAGES/django.po b/filer/locale/ca/LC_MESSAGES/django.po new file mode 100644 index 000000000..4ba43842f --- /dev/null +++ b/filer/locale/ca/LC_MESSAGES/django.po @@ -0,0 +1,1261 @@ +# 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: +# Translators: +# Roger Pons , 2013-2014,2016 +msgid "" +msgstr "" +"Project-Id-Version: django Filer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: Roger Pons , 2013-2014,2016\n" +"Language-Team: Catalan (http://app.transifex.com/divio/django-filer/language/" +"ca/)\n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: admin/clipboardadmin.py:17 +msgid "You do not have permission to upload files." +msgstr "" + +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "" + +#: admin/clipboardadmin.py:20 +msgid "Can't use this folder, Permission Denied. Please select another folder." +msgstr "" + +#: admin/fileadmin.py:73 +msgid "Advanced" +msgstr "Avançat" + +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "URL canònica" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Cal seleccionar els elements en ordre per tal de realitzar accions sobre " +"ells. No s'ha modificat cap element." + +#: admin/folderadmin.py:434 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s seleccionat" +msgstr[1] "Tots %(total_count)s seleccionats" + +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "" + +#: admin/folderadmin.py:475 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 de %(cnt)s seleccionats" + +#: admin/folderadmin.py:612 +msgid "No action selected." +msgstr "No s'ha seleccionat cap acció." + +#: admin/folderadmin.py:664 +#, python-format +msgid "Successfully moved %(count)d files to clipboard." +msgstr "S'han mogut %(count)d fitxers al portapapers." + +#: admin/folderadmin.py:669 +msgid "Move selected files to clipboard" +msgstr "Moure els fitxers seleccionats al portapapers." + +#: admin/folderadmin.py:709 +#, python-format +msgid "Successfully disabled permissions for %(count)d files." +msgstr "S'han desactivat els permisos de %(count)d fitxers." + +#: admin/folderadmin.py:711 +#, python-format +msgid "Successfully enabled permissions for %(count)d files." +msgstr "S'han activat els permisos de %(count)d fitxers." + +#: admin/folderadmin.py:719 +msgid "Enable permissions for selected files" +msgstr "Activar els permisos dels fitxers seleccionats" + +#: admin/folderadmin.py:725 +msgid "Disable permissions for selected files" +msgstr "Desactivaer els permisos dels fitxers seleccionats" + +#: admin/folderadmin.py:789 +#, python-format +msgid "Successfully deleted %(count)d files and/or folders." +msgstr "S'han esborrat %(count)d fitxers i/o carpetes." + +#: admin/folderadmin.py:794 +msgid "Cannot delete files and/or folders" +msgstr "No es poden esborrar els fitxers i/o carpetes" + +#: admin/folderadmin.py:796 +msgid "Are you sure?" +msgstr "Esteu segur?" + +#: admin/folderadmin.py:802 +msgid "Delete files and/or folders" +msgstr "Esborrar fitxers i/o carpetes" + +#: admin/folderadmin.py:823 +msgid "Delete selected files and/or folders" +msgstr "Esborrar els fitxers i/o carpetes seleccionats" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "Ja existeixen carpetes amb els noms %s a la destinació seleccionada" + +#: admin/folderadmin.py:934 +#, python-format +msgid "" +"Successfully moved %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" +"S'han mogut %(count)d fitxers i/o carpetes a la carpeta '%(destination)s'" + +#: admin/folderadmin.py:942 admin/folderadmin.py:944 +msgid "Move files and/or folders" +msgstr "Moure fitxers i/o carpetes" + +#: admin/folderadmin.py:959 +msgid "Move selected files and/or folders" +msgstr "Moure els fitxers i/o carpetes seleccionats" + +#: admin/folderadmin.py:1016 +#, python-format +msgid "Successfully renamed %(count)d files." +msgstr "S'ha canviat el nom de %(count)d fitxers." + +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 +msgid "Rename files" +msgstr "Canviar el nom a fitxers" + +#: admin/folderadmin.py:1137 +#, python-format +msgid "" +"Successfully copied %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" +"S'han copiat %(count)d fitxeres i/o carpetes a la carpeta '%(destination)s'." + +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 +msgid "Copy files and/or folders" +msgstr "Copiar fitxers i/o carpetes" + +#: admin/folderadmin.py:1174 +msgid "Copy selected files and/or folders" +msgstr "Copiar els fitxers i/o carpetes seleccionats" + +#: admin/folderadmin.py:1279 +#, python-format +msgid "Successfully resized %(count)d images." +msgstr "S'han redimensionat %(count)d imatges." + +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 +msgid "Resize images" +msgstr "Redimensionar imatges" + +#: admin/folderadmin.py:1303 +msgid "Resize selected images" +msgstr "Redimensionar les imatges seleccionades" + +#: admin/forms.py:24 +msgid "Suffix which will be appended to filenames of copied files." +msgstr "Sufix que serà afegit als noms de fitxer dels fitxers copiats" + +#: admin/forms.py:31 +#, python-format +msgid "" +"Suffix should be a valid, simple and lowercase filename part, like " +"\"%(valid)s\"." +msgstr "" +"El sufix ha de ser una part de nom de fitxer vàlida, simple i en minúscules, " +"com ara \"%(valid)s\"." + +#: admin/forms.py:52 +#, python-format +msgid "Unknown rename format value key \"%(key)s\"." +msgstr "Format de renombrat amb valor de clau \"%(key)s\" desconegut." + +#: admin/forms.py:54 +#, python-format +msgid "Invalid rename format: %(error)s." +msgstr "Format de renombrat no vàlid: %(error)s" + +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 +msgid "thumbnail option" +msgstr "opció de miniatures" + +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 +msgid "width" +msgstr "ample" + +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 +msgid "height" +msgstr "alçada" + +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 +msgid "crop" +msgstr "retallar" + +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 +msgid "upscale" +msgstr "ampliar" + +#: admin/forms.py:79 +msgid "Thumbnail option or resize parameters must be choosen." +msgstr "Heu de triar una opció de miniatura o paràmetres de redimensionat." + +#: admin/imageadmin.py:20 admin/imageadmin.py:112 +msgid "Subject location" +msgstr "Lloc del subjecte." + +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "Ubicació del subjecte principal de l'escena. Format: \"x,y\"." + +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "Foirmat erroni de la ubicació del subjecte." + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "La ubicació del subjecte està fora de la imatge." + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "La teva entrada: \"{subject_location}\"." + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" +msgstr "" + +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" +msgstr "" + +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "Ja existeix una carpeta amb aquest nom." + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "Filer" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "Biblioteca de medis." + +#: models/abstract.py:62 +msgid "default alt text" +msgstr "text alternatiu per defecte" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "títol per defecte" + +#: models/abstract.py:76 +msgid "subject location" +msgstr "lloc del subjecte" + +#: models/abstract.py:91 +msgid "image" +msgstr "imatge" + +#: models/abstract.py:92 +msgid "images" +msgstr "imatges" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "" + +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." +msgstr "" + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 +msgid "user" +msgstr "usuari" + +#: models/clipboardmodels.py:17 models/filemodels.py:157 +msgid "files" +msgstr "fitxers" + +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 +msgid "clipboard" +msgstr "portapapers" + +#: models/clipboardmodels.py:25 +msgid "clipboards" +msgstr "portapapers" + +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 +msgid "file" +msgstr "fitxer" + +#: models/clipboardmodels.py:56 +msgid "clipboard item" +msgstr "element del portapapers" + +#: models/clipboardmodels.py:57 +msgid "clipboard items" +msgstr "elements del portapapers" + +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "folder" +msgstr "carpeta" + +#: models/filemodels.py:81 +msgid "file size" +msgstr "tamany del fitxer" + +#: models/filemodels.py:87 +msgid "sha1" +msgstr "sha1" + +#: models/filemodels.py:94 +msgid "has all mandatory data" +msgstr "té totes les dades obligatòries" + +#: models/filemodels.py:100 +msgid "original filename" +msgstr "nom de fitxer original" + +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 +msgid "name" +msgstr "nom" + +#: models/filemodels.py:116 +msgid "description" +msgstr "descripció" + +#: models/filemodels.py:125 models/foldermodels.py:108 +msgid "owner" +msgstr "propietari" + +#: models/filemodels.py:129 models/foldermodels.py:116 +msgid "uploaded at" +msgstr "pujat a" + +#: models/filemodels.py:134 models/foldermodels.py:126 +msgid "modified at" +msgstr "modificat a" + +#: models/filemodels.py:140 +msgid "Permissions disabled" +msgstr "Permisos desactivats" + +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "" +"Desactiveu tots els permisos d'aquest fitxer. Aquest serà accessible de " +"forma pública per a tothom." + +#: models/foldermodels.py:94 +msgid "parent" +msgstr "" + +#: models/foldermodels.py:121 +msgid "created at" +msgstr "creat a" + +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Folder" +msgstr "Carpeta" + +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 +msgid "Folders" +msgstr "Carpetes" + +#: models/foldermodels.py:260 +msgid "all items" +msgstr "tots els elements" + +#: models/foldermodels.py:261 +msgid "this item only" +msgstr "només aquest element" + +#: models/foldermodels.py:262 +msgid "this item and all children" +msgstr "aquest elements i els seus fills" + +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "permetre" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "denegar" + +#: models/foldermodels.py:280 +msgid "type" +msgstr "tipus" + +#: models/foldermodels.py:297 +msgid "group" +msgstr "group" + +#: models/foldermodels.py:304 +msgid "everybody" +msgstr "tothom" + +#: models/foldermodels.py:309 +msgid "can read" +msgstr "pot llegir" + +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "pot editar" + +#: models/foldermodels.py:325 +msgid "can add children" +msgstr "pot afegir fills" + +#: models/foldermodels.py:333 +msgid "folder permission" +msgstr "permís de carpeta" + +#: models/foldermodels.py:334 +msgid "folder permissions" +msgstr "permisos de carpeta" + +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." +msgstr "" + +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." +msgstr "" + +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." +msgstr "" + +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." +msgstr "" + +#: models/foldermodels.py:360 +msgid "All Folders" +msgstr "" + +#: models/foldermodels.py:362 +msgid "Logical Path" +msgstr "" + +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" +msgstr "" + +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" +msgstr "" + +#: models/foldermodels.py:375 +msgid "Everybody" +msgstr "" + +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "" + +#: models/foldermodels.py:389 +msgid "Read" +msgstr "" + +#: models/foldermodels.py:390 +msgid "Add children" +msgstr "" + +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "data agafada" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "autor" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "cal publicar sempre crèdits d'autor" + +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "cal publicar sempre els drets d'autor" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "ample en píxels." + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "alt en píxels" + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "opcions de miniatura" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "Pujades sense ordre" + +#: models/virtualitems.py:73 +msgid "files with missing metadata" +msgstr "fitxer als que els falten metadades" + +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "root" +msgstr "arrel" + +#: settings.py:273 +msgid "Show table view" +msgstr "" + +#: settings.py:278 +msgid "Show thumbnail view" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Run the selected action" +msgstr "Executar l'acció seleccionada" + +#: templates/admin/filer/actions.html:5 +msgid "Go" +msgstr "Anar" + +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +msgid "Click here to select the objects across all pages" +msgstr "" +"Cliqueu aquí per seleccionar els objectes a través de totes les pàgines" + +#: templates/admin/filer/actions.html:14 +#, python-format +msgid "Select all %(total_count)s files and/or folders" +msgstr "Seleccionar tots els %(total_count)s fitixers i/o carpetes" + +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 +msgid "Clear selection" +msgstr "Netejar la selecció" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 +msgid "Go back to admin homepage" +msgstr "Tornar a la pàgina principal d'administració" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 +msgid "Home" +msgstr "Inici" + +#: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 +msgid "Go back to Filer app" +msgstr "Tornar a l'aplicació Filer" + +#: templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Go back to root folder" +msgstr "Tornar a la carpeta arrel" + +#: templates/admin/filer/breadcrumbs.html:8 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 +#, python-format +msgid "Go back to '%(folder_name)s' folder" +msgstr "Tornar a la carpeta '%(folder_name)s'" + +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "Duplicats" + +#: templates/admin/filer/delete_selected_files_confirmation.html:11 +msgid "" +"Deleting the selected files and/or folders would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Esborrar els fitxers seleccionats provocarà l'esborrar d'objectes " +"relacionats, però el teu compte no té permisos per esborrar els següents " +"tipus d'objectes:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:19 +msgid "" +"Deleting the selected files and/or folders would require deleting the " +"following protected related objects:" +msgstr "" +"Esborrer els fitxers i/o carpetes seleccionades provocarà l'esborrat dels " +"següents objectes protegits relacionats:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:27 +msgid "" +"Are you sure you want to delete the selected files and/or folders? All of " +"the following objects and their related items will be deleted:" +msgstr "" +"Segur que voleu esborrar els fitxers i/o carpetes seleccionades? Els " +"següents objectes i els seus elements relacionats seran esborrats:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "No, porta'm enrere." + +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "Sí, estic segur" + +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 +msgid "History" +msgstr "Història" + +#: templates/admin/filer/file/change_form.html:37 +#: templates/admin/filer/folder/change_form.html:23 +#: templates/admin/filer/image/change_form.html:37 +msgid "View on site" +msgstr "Veure al lloc" + +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "Tornar a" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "pàgina principal d'administració" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 +msgid "Folder Icon" +msgstr "Icona de la carpeta" + +#: templates/admin/filer/folder/choose_copy_destination.html:23 +msgid "" +"Your account doesn't have permissions to copy all of the selected files and/" +"or folders." +msgstr "Sense permisos per copiar tots els fitxers i/o carpetes seleccionats." + +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "Porta'm enrere" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 +msgid "There are no destination folders available." +msgstr "No hi ha carpetes de destí disponibles." + +#: templates/admin/filer/folder/choose_copy_destination.html:35 +msgid "There are no files and/or folders available to copy." +msgstr "No hi ha fitxers i/o carpetes disponibles." + +#: templates/admin/filer/folder/choose_copy_destination.html:40 +msgid "" +"The following files and/or folders will be copied to a destination folder " +"(retaining their tree structure):" +msgstr "" +"Els següents fitxers i/o carpetes seran copiats a una carpeta de destí " +"(mantenint la seva estructura d'arbre):" + +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 +msgid "Destination folder:" +msgstr "Carpeta de destí:" + +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 +msgid "Copy" +msgstr "Copiar" + +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "No està permès copiar fitxers a la mateixa carpeta" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 +msgid "" +"Your account doesn't have permissions to resize all of the selected images." +msgstr "" +"El vostre compte no té permisos per redimensionar totes les imatges " +"seleccionades." + +#: templates/admin/filer/folder/choose_images_resize_options.html:18 +msgid "There are no images available to resize." +msgstr "No hi ha imatges disponibles per redimensionar." + +#: templates/admin/filer/folder/choose_images_resize_options.html:20 +msgid "The following images will be resized:" +msgstr "Les següents imatges seran redimensionades:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:32 +msgid "Choose an existing thumbnail option or enter resize parameters:" +msgstr "" +"Trieu una opció de miniatura existent o especifiqueu paràmetres de " +"redimensionat:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:36 +msgid "" +"Warning: Images will be resized in-place and originals will be lost. Maybe " +"first make a copy of them to retain the originals." +msgstr "" +"Avís: les imatges seran redimensionades al mateix lloc i les originals es " +"perdran. Considereu realitzar abans una còpia d'aquestes per mantenir els " +"originals." + +#: templates/admin/filer/folder/choose_images_resize_options.html:39 +msgid "Resize" +msgstr "Redimensionar" + +#: templates/admin/filer/folder/choose_move_destination.html:35 +msgid "" +"Your account doesn't have permissions to move all of the selected files and/" +"or folders." +msgstr "" +"El vostre compte no té permisos per moure tots els fitxers i/o carpetes " +"seleccionats." + +#: templates/admin/filer/folder/choose_move_destination.html:47 +msgid "There are no files and/or folders available to move." +msgstr "No hi ha fitxers i/o carpetes disponibles per moure." + +#: templates/admin/filer/folder/choose_move_destination.html:52 +msgid "" +"The following files and/or folders will be moved to a destination folder " +"(retaining their tree structure):" +msgstr "" +"Els següents fitxers i/o carpetes seran moguts a una carpeta de destí " +"(mantenint la seva estructura d'arbre):" + +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 +msgid "Move" +msgstr "Moure" + +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "No està permès moure fitxers a la mateixa carpeta" + +#: templates/admin/filer/folder/choose_rename_format.html:15 +msgid "" +"Your account doesn't have permissions to rename all of the selected files." +msgstr "" +"El vostre compte no té permisos per canviar el nom de tots els fitxers " +"seleccionats." + +#: templates/admin/filer/folder/choose_rename_format.html:18 +msgid "There are no files available to rename." +msgstr "No hi ha fitxers per canviar el nom disponibles." + +#: templates/admin/filer/folder/choose_rename_format.html:20 +msgid "" +"The following files will be renamed (they will stay in their folders and " +"keep original filename, only displayed filename will be changed):" +msgstr "" +"En canviarà el nom dels següents fitxers (seguiran estant a les seves " +"carpetes i mantindran el seu nom de fitxers original, només serà modificat " +"el nom que es mostrarà):" + +#: templates/admin/filer/folder/choose_rename_format.html:59 +msgid "Rename" +msgstr "Canviar el nom" + +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "Tornar a la carpeta pare" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "Modificar els detalls de la carpeta actual" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "Modificar" + +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "Cliqueu aquí per cercar la frase introduïda" + +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "Cercar" + +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "Tancar" + +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "Limitar" + +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "Marqueu per limitar la cercar a la carpeta actual" + +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "Limitar la cerca a la carpeta actual" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "Esborrar" + +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "Afegir una Carpeta nova" + +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "Carpeta nova" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "Pujar Arxius" + +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "Cal que abans seleccioneu una carpeta" + +#: templates/admin/filer/folder/directory_table_list.html:16 +msgid "Name" +msgstr "Nom" + +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "Propietari" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "Mida" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "Acció" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 +#, python-format +msgid "Change '%(item_label)s' folder details" +msgstr "Modificar els detalls de la carpeta '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "%(counter)s fitxer" +msgstr[1] "%(counter)s fitxers" + +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "%(counter)s fitxer" +msgstr[1] "%(counter)s fitxers" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "Modifcar detalls de carpeta" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "Esborrar carpeta" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 +msgid "Select this file" +msgstr "Seleccionar aquest fitxer" + +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 +#, python-format +msgid "Change '%(item_label)s' details" +msgstr "Modificar els detalls de '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "Permissions" +msgstr "Permisos" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "disabled" +msgstr "desactivat" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "enabled" +msgstr "activat" + +#: templates/admin/filer/folder/directory_table_list.html:144 +#, fuzzy +#| msgid "Move selected files to clipboard" +msgid "URL copied to clipboard" +msgstr "Moure els fitxers seleccionats al portapapers." + +#: templates/admin/filer/folder/directory_table_list.html:147 +#, python-format +msgid "Canonical url '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:151 +#, python-format +msgid "Download '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "Esborrar fitxer" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "Deixeu anar fitxers aquí o utilitzeu el botó \"Pujar Fitxers\"" + +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "Deixeu anar el fitxer a pujar a:" + +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "Pujar" + +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "cancel·lar" + +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "Pujada correcta!" + +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "Pujada cancel·lada!" + +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 +msgid "previous" +msgstr "anterior" + +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 +#, python-format +msgid "Page %(number)s of %(num_pages)s." +msgstr "Pàgina %(number)s de %(num_pages)s." + +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 +msgid "next" +msgstr "següent" + +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "Seleccionar tots/es %(total_count)s" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +msgid "Select all" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +msgid "Files" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +msgid "Add new" +msgstr "Afegir nou" + +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:15 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Corregiu el següent error." +msgstr[1] "Corregiu els següents errors." + +#: templates/admin/filer/folder/new_folder_form.html:30 +msgid "Save" +msgstr "Desar" + +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "Portapapers" + +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "Enganxar aquí tots els elements" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "Moure tots els fitxer del portapapers a" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "Buidar Porta-retalls" + +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "el portapapers és buït" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "ha fallat la pujada" + +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +msgid "File is missing" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "Tipus" + +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "MIda de fitxer" + +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "Modificat" + +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "Creat" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "found" +msgstr "trobat" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "and" +msgstr "i" + +#: templates/admin/filer/tools/search_form.html:7 +msgid "cancel search" +msgstr "cancel·lar la cerca" + +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "Netejar" + +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "o deixar anar aquí el fitxer" + +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "no s'ha seleccionat cap fitxer" + +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "Cercar" + +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "Escollir Fitxer" + +#: templates/admin/filer/widgets/admin_folder.html:16 +msgid "Choose Folder" +msgstr "" + +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" +msgstr "" + +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" +msgstr "" + +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" +msgstr "" + +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" +msgstr "" + +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" +msgstr "" + +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." + +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" + +#~ msgid "Open file" +#~ msgstr "Open file" + +#~ msgid "Full size preview" +#~ msgstr "Full size preview" + +#~ msgid "Add Description" +#~ msgstr "Add Description" + +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" + +#~ msgid "none selected" +#~ msgstr "none selected" + +#~ msgid "Add Folder" +#~ msgstr "Add Folder" + +#~ msgid "Subject Location" +#~ msgstr "Subject location" + +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" +#~ msgstr[1] "15c0f2d28d6dab1af1f6d94906beb627_pl_1" + +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/cs/LC_MESSAGES/django.mo b/filer/locale/cs/LC_MESSAGES/django.mo new file mode 100644 index 000000000..c73f2c7d9 Binary files /dev/null and b/filer/locale/cs/LC_MESSAGES/django.mo differ diff --git a/filer/locale/cs/LC_MESSAGES/django.po b/filer/locale/cs/LC_MESSAGES/django.po new file mode 100644 index 000000000..e56d59634 --- /dev/null +++ b/filer/locale/cs/LC_MESSAGES/django.po @@ -0,0 +1,1265 @@ +# 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: +# Translators: +# Jakub Dorňák , 2020 +# Mirek Simek , 2016 +msgid "" +msgstr "" +"Project-Id-Version: django Filer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: Jakub Dorňák , 2020\n" +"Language-Team: Czech (http://app.transifex.com/divio/django-filer/language/" +"cs/)\n" +"Language: cs\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n " +"<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" + +#: admin/clipboardadmin.py:17 +msgid "You do not have permission to upload files." +msgstr "" + +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "" + +#: admin/clipboardadmin.py:20 +msgid "Can't use this folder, Permission Denied. Please select another folder." +msgstr "" + +#: admin/fileadmin.py:73 +msgid "Advanced" +msgstr "Pokročilé" + +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "kanonický odkaz" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "Nejdříve vyberte položku, která má být změněna." + +#: admin/folderadmin.py:434 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "Výpis složky %(folder_name)s" + +#: admin/folderadmin.py:475 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "žádná položka z %(cnt)s není vybrána" + +#: admin/folderadmin.py:612 +msgid "No action selected." +msgstr "Nebyla vybrána žádná operace." + +#: admin/folderadmin.py:664 +#, python-format +msgid "Successfully moved %(count)d files to clipboard." +msgstr "Soubory (%(count)d) byly přesunuty do schránky." + +#: admin/folderadmin.py:669 +msgid "Move selected files to clipboard" +msgstr "Přesunout vybrané soubory do schránky" + +#: admin/folderadmin.py:709 +#, python-format +msgid "Successfully disabled permissions for %(count)d files." +msgstr "Pro vybrané soubory (%(count)d) byla deaktivována oprávnění." + +#: admin/folderadmin.py:711 +#, python-format +msgid "Successfully enabled permissions for %(count)d files." +msgstr "Pro vybrané soubory (%(count)d) byla aktivována oprávnění." + +#: admin/folderadmin.py:719 +msgid "Enable permissions for selected files" +msgstr "Aktivovat oprávnění pro vybrané soubory" + +#: admin/folderadmin.py:725 +msgid "Disable permissions for selected files" +msgstr "Deaktivovat oprávnění pro vybrané soubory" + +#: admin/folderadmin.py:789 +#, python-format +msgid "Successfully deleted %(count)d files and/or folders." +msgstr "Vybrané soubory a/nebo složky (%(count)d) byly smazány." + +#: admin/folderadmin.py:794 +msgid "Cannot delete files and/or folders" +msgstr "Nemohu smazat soubory a/nebo složky" + +#: admin/folderadmin.py:796 +msgid "Are you sure?" +msgstr "Opravdu provést?" + +#: admin/folderadmin.py:802 +msgid "Delete files and/or folders" +msgstr "Smazat soubory a/nebo složky" + +#: admin/folderadmin.py:823 +msgid "Delete selected files and/or folders" +msgstr "Smazat vybrané soubory a/nebo složky" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "Složky pojmenované %s již v cílové složce existují" + +#: admin/folderadmin.py:934 +#, python-format +msgid "" +"Successfully moved %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" +"Vybrané soubory a/nebo složky (%(count)d) byly přesunuty do složky " +"'%(destination)s'." + +#: admin/folderadmin.py:942 admin/folderadmin.py:944 +msgid "Move files and/or folders" +msgstr "Přesunout soubory a/nebo složky" + +#: admin/folderadmin.py:959 +msgid "Move selected files and/or folders" +msgstr "Přesunout vybrané soubory a/nebo složky" + +#: admin/folderadmin.py:1016 +#, python-format +msgid "Successfully renamed %(count)d files." +msgstr "Soubory (%(count)d) vyly přejmenovány." + +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 +msgid "Rename files" +msgstr "Přejmenovat soubory" + +#: admin/folderadmin.py:1137 +#, python-format +msgid "" +"Successfully copied %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" +"Soubory a/nebo složky (%(count)d) byly zkopírovány do složky " +"'%(destination)s'." + +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 +msgid "Copy files and/or folders" +msgstr "Kopírovat soubory a/nebo složky" + +#: admin/folderadmin.py:1174 +msgid "Copy selected files and/or folders" +msgstr "Kopírovat vybrané soubory a/nebo složky" + +#: admin/folderadmin.py:1279 +#, python-format +msgid "Successfully resized %(count)d images." +msgstr "Velikost obrázků (%(count)d) byla změněna." + +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 +msgid "Resize images" +msgstr "Změnit velikost obrázků" + +#: admin/folderadmin.py:1303 +msgid "Resize selected images" +msgstr "Změnit velikost vybraných obrázků" + +#: admin/forms.py:24 +msgid "Suffix which will be appended to filenames of copied files." +msgstr "Koncovka, která bude přidána ke jménům kopírovaných souborů." + +#: admin/forms.py:31 +#, python-format +msgid "" +"Suffix should be a valid, simple and lowercase filename part, like " +"\"%(valid)s\"." +msgstr "" +"Koncovka by měla být jednoduchá součást názvu souboru malými písmeny, " +"například \"%(valid)s\"." + +#: admin/forms.py:52 +#, python-format +msgid "Unknown rename format value key \"%(key)s\"." +msgstr "Neznámý formát klíče pro přejmenování \"%(key)s\"." + +#: admin/forms.py:54 +#, python-format +msgid "Invalid rename format: %(error)s." +msgstr "Špatný formát přejmenování: %(error)s." + +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 +msgid "thumbnail option" +msgstr "volby náhledu" + +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 +msgid "width" +msgstr "šířka" + +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 +msgid "height" +msgstr "výška" + +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 +msgid "crop" +msgstr "oříznout" + +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 +msgid "upscale" +msgstr "zvětšit" + +#: admin/forms.py:79 +msgid "Thumbnail option or resize parameters must be choosen." +msgstr "" +"Musíte vybrat předdefinované volby náhledu nebo nastavit jednotlivé " +"parametry." + +#: admin/imageadmin.py:20 admin/imageadmin.py:112 +msgid "Subject location" +msgstr "Pozice objektu" + +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "Pozice hlavního předmětu fotografie. Formát \"x,y\"." + +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "Špatný formát pozice objektu. " + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "Zadaná pozice objektu je mimo obrázek. " + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "Vaše zadání: \"{subject_location}\". " + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" +msgstr "" + +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" +msgstr "" + +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "Složka s tímto názvem již existuje." + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "Správce souborů" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "Knihovna médií" + +#: models/abstract.py:62 +msgid "default alt text" +msgstr "výchozí alternativní text" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "výchozí popisek" + +#: models/abstract.py:76 +msgid "subject location" +msgstr "poloha objektu" + +#: models/abstract.py:91 +msgid "image" +msgstr "obrázek" + +#: models/abstract.py:92 +msgid "images" +msgstr "obrázky" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "" + +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." +msgstr "" + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 +msgid "user" +msgstr "uživatel" + +#: models/clipboardmodels.py:17 models/filemodels.py:157 +msgid "files" +msgstr "soubory" + +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 +msgid "clipboard" +msgstr "schránka" + +#: models/clipboardmodels.py:25 +msgid "clipboards" +msgstr "schránky" + +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 +msgid "file" +msgstr "soubor" + +#: models/clipboardmodels.py:56 +msgid "clipboard item" +msgstr "položka schránky" + +#: models/clipboardmodels.py:57 +msgid "clipboard items" +msgstr "položky schránky" + +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "folder" +msgstr "složka" + +#: models/filemodels.py:81 +msgid "file size" +msgstr "velikost souboru" + +#: models/filemodels.py:87 +msgid "sha1" +msgstr "sha1" + +#: models/filemodels.py:94 +msgid "has all mandatory data" +msgstr "má všechna povinná data" + +#: models/filemodels.py:100 +msgid "original filename" +msgstr "původní název souboru" + +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 +msgid "name" +msgstr "název" + +#: models/filemodels.py:116 +msgid "description" +msgstr "popis" + +#: models/filemodels.py:125 models/foldermodels.py:108 +msgid "owner" +msgstr "vlastník" + +#: models/filemodels.py:129 models/foldermodels.py:116 +msgid "uploaded at" +msgstr "nahráno" + +#: models/filemodels.py:134 models/foldermodels.py:126 +msgid "modified at" +msgstr "změněno" + +#: models/filemodels.py:140 +msgid "Permissions disabled" +msgstr "Oprávnění neaktivní" + +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "" +"Deaktivovat veškerá oprávnění pro tento soubor. Soubor bude komukoli veřejně " +"dostupný." + +#: models/foldermodels.py:94 +msgid "parent" +msgstr "" + +#: models/foldermodels.py:121 +msgid "created at" +msgstr "vytvořeno" + +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Folder" +msgstr "Složka" + +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 +msgid "Folders" +msgstr "Složky" + +#: models/foldermodels.py:260 +msgid "all items" +msgstr "všechny položky" + +#: models/foldermodels.py:261 +msgid "this item only" +msgstr "pouze tato položka" + +#: models/foldermodels.py:262 +msgid "this item and all children" +msgstr "tato položka včetně všech potomků" + +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "povolit" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "zakázat" + +#: models/foldermodels.py:280 +msgid "type" +msgstr "typ" + +#: models/foldermodels.py:297 +msgid "group" +msgstr "skupina" + +#: models/foldermodels.py:304 +msgid "everybody" +msgstr "kdokoli" + +#: models/foldermodels.py:309 +msgid "can read" +msgstr "smí číst" + +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "smí upravit" + +#: models/foldermodels.py:325 +msgid "can add children" +msgstr "smí přidávat potomky" + +#: models/foldermodels.py:333 +msgid "folder permission" +msgstr "oprávnění složky" + +#: models/foldermodels.py:334 +msgid "folder permissions" +msgstr "oprávnění složky" + +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." +msgstr "" + +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." +msgstr "" + +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." +msgstr "" + +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." +msgstr "" + +#: models/foldermodels.py:360 +msgid "All Folders" +msgstr "" + +#: models/foldermodels.py:362 +msgid "Logical Path" +msgstr "" + +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" +msgstr "" + +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" +msgstr "" + +#: models/foldermodels.py:375 +msgid "Everybody" +msgstr "" + +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "" + +#: models/foldermodels.py:389 +msgid "Read" +msgstr "" + +#: models/foldermodels.py:390 +msgid "Add children" +msgstr "" + +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "datum pořízení" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "autor" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "autor musí být vždy uveden" + +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "copyright musí být vždy uvedeno" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "šířka v pixelech." + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "výška v pixelech." + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "volby náhledu" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "Nezařazené" + +#: models/virtualitems.py:73 +msgid "files with missing metadata" +msgstr "soubory s chybějícími informacemi" + +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "root" +msgstr "kořenová složka" + +#: settings.py:273 +msgid "Show table view" +msgstr "" + +#: settings.py:278 +msgid "Show thumbnail view" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Run the selected action" +msgstr "Provést vybranou operaci" + +#: templates/admin/filer/actions.html:5 +msgid "Go" +msgstr "Provést" + +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +msgid "Click here to select the objects across all pages" +msgstr "Klikněte sem pro výběr všechny položky na všech stránkách výpisu" + +#: templates/admin/filer/actions.html:14 +#, python-format +msgid "Select all %(total_count)s files and/or folders" +msgstr "Vybrat všechny soubory a/nebo složky (%(total_count)s)" + +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 +msgid "Clear selection" +msgstr "Zrušit výběr" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 +msgid "Go back to admin homepage" +msgstr "Přejít zpět na hlavní stránku administrace" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 +msgid "Home" +msgstr "Hlavní stránka" + +#: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 +msgid "Go back to Filer app" +msgstr "Přejít zpět do Správce souborů" + +#: templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Go back to root folder" +msgstr "Přejít zpět do kořenové složky" + +#: templates/admin/filer/breadcrumbs.html:8 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 +#, python-format +msgid "Go back to '%(folder_name)s' folder" +msgstr "Přejít zpět do složky '%(folder_name)s'" + +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "Duplicity" + +#: templates/admin/filer/delete_selected_files_confirmation.html:11 +msgid "" +"Deleting the selected files and/or folders would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Smazání vybraných souborů a/nebo složek bude mít za následek smazání všech " +"přidružených objektů, nicméně ke smazání následujících objektů nemáte " +"oprávnění:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:19 +msgid "" +"Deleting the selected files and/or folders would require deleting the " +"following protected related objects:" +msgstr "" +"Smazání vybraných souborů a/nebo složek bude mít za následek smazání " +"následujících přidružených objektů:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:27 +msgid "" +"Are you sure you want to delete the selected files and/or folders? All of " +"the following objects and their related items will be deleted:" +msgstr "" +"Opravdu chcete smazat vybrané soubory a složky? Všechny následující objekty " +"budou smazány:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "Ne, chci zpátky" + +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "Ano" + +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 +msgid "History" +msgstr "Historie" + +#: templates/admin/filer/file/change_form.html:37 +#: templates/admin/filer/folder/change_form.html:23 +#: templates/admin/filer/image/change_form.html:37 +msgid "View on site" +msgstr "Zobrazit na webu" + +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "Vrátit se do" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "hlavní stránka administrace" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 +msgid "Folder Icon" +msgstr "Ikona složky" + +#: templates/admin/filer/folder/choose_copy_destination.html:23 +msgid "" +"Your account doesn't have permissions to copy all of the selected files and/" +"or folders." +msgstr "Nemáte oprávnění kopírovat vybrané soubory a/nebo složky." + +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "Zpět" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 +msgid "There are no destination folders available." +msgstr "Nejsou k dispozici žádné cílové složky." + +#: templates/admin/filer/folder/choose_copy_destination.html:35 +msgid "There are no files and/or folders available to copy." +msgstr "Žádné soubory ani složky není možno kopírovat." + +#: templates/admin/filer/folder/choose_copy_destination.html:40 +msgid "" +"The following files and/or folders will be copied to a destination folder " +"(retaining their tree structure):" +msgstr "" +"Následující soubory a/nebo složky budou zkopírovány do cílové slžoky (jejich " +"stromová struktura bude zachována):" + +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 +msgid "Destination folder:" +msgstr "Cílová složka:" + +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 +msgid "Copy" +msgstr "Kopírovat" + +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "Není možné kopírovat soubory do stejné složky" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 +msgid "" +"Your account doesn't have permissions to resize all of the selected images." +msgstr "Nemáte oprávnění k změně velikosti vybraných obrázků." + +#: templates/admin/filer/folder/choose_images_resize_options.html:18 +msgid "There are no images available to resize." +msgstr "Žádné obrázky ke změně velikosti." + +#: templates/admin/filer/folder/choose_images_resize_options.html:20 +msgid "The following images will be resized:" +msgstr "Následujícím obrázkům bude změněna velikost:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:32 +msgid "Choose an existing thumbnail option or enter resize parameters:" +msgstr "" +"Vyberte existující volby náhledu nebo zadejte parametry změny velikosti:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:36 +msgid "" +"Warning: Images will be resized in-place and originals will be lost. Maybe " +"first make a copy of them to retain the originals." +msgstr "" +"Varování: Bude změněna velikost obrázků a původní obrázky budou přepsány. " +"Pokud chcete zachovat obrázky v původní velikosti, nejdříve vytvořte jejich " +"kopie." + +#: templates/admin/filer/folder/choose_images_resize_options.html:39 +msgid "Resize" +msgstr "Změnit velikost" + +#: templates/admin/filer/folder/choose_move_destination.html:35 +msgid "" +"Your account doesn't have permissions to move all of the selected files and/" +"or folders." +msgstr "Nemáte oprávnění k přesunu vybraných souborů nebo složek." + +#: templates/admin/filer/folder/choose_move_destination.html:47 +msgid "There are no files and/or folders available to move." +msgstr "Žádné soubory k přesunutí." + +#: templates/admin/filer/folder/choose_move_destination.html:52 +msgid "" +"The following files and/or folders will be moved to a destination folder " +"(retaining their tree structure):" +msgstr "" +"Následující soubory a/nebo složky budou přesunyty do cílové složky (jejich " +"stromová struktura bude zachována)" + +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 +msgid "Move" +msgstr "Přesunout" + +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "Není možné přesouvat soubory do stejné složky" + +#: templates/admin/filer/folder/choose_rename_format.html:15 +msgid "" +"Your account doesn't have permissions to rename all of the selected files." +msgstr "Nemáte oprávnění přejmenovat všechny vybrané soubory." + +#: templates/admin/filer/folder/choose_rename_format.html:18 +msgid "There are no files available to rename." +msgstr "Žádné soubory k přejmenování." + +#: templates/admin/filer/folder/choose_rename_format.html:20 +msgid "" +"The following files will be renamed (they will stay in their folders and " +"keep original filename, only displayed filename will be changed):" +msgstr "" +"Následující soubory budou přejmenovány (změněno bude pouze zobrazované jméno)" + +#: templates/admin/filer/folder/choose_rename_format.html:59 +msgid "Rename" +msgstr "Přejmenovat" + +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "Přejít zpět do nadřazené složky" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "Upravit aktuální složku" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "Upravit" + +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "Klikněte sem pro vyhledání zadaného výrazu" + +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "Hledat" + +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "Zavřít" + +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "Omezit" + +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "Zaškrtněte pro omezení hledání na aktuální složku" + +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "Omezit hledání na aktuální složku" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "Smazat" + +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "Přidá novou složku" + +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "Nová složka" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "Nahrát soubory" + +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "Nejdříve musíte vybrat složku" + +#: templates/admin/filer/folder/directory_table_list.html:16 +msgid "Name" +msgstr "Název" + +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "Vlastník" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "Velikost" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "Akce" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 +#, python-format +msgid "Change '%(item_label)s' folder details" +msgstr "Upravit podrobnosti složky '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "Upravit podrobnosti složky" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "Smazat složku" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 +msgid "Select this file" +msgstr "Vybrat tento soubor" + +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 +#, python-format +msgid "Change '%(item_label)s' details" +msgstr "Upravit podrobnosti '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "Permissions" +msgstr "Oprávnění" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "disabled" +msgstr "neaktivní" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "enabled" +msgstr "aktivní" + +#: templates/admin/filer/folder/directory_table_list.html:144 +#, fuzzy +#| msgid "Move selected files to clipboard" +msgid "URL copied to clipboard" +msgstr "Přesunout vybrané soubory do schránky" + +#: templates/admin/filer/folder/directory_table_list.html:147 +#, python-format +msgid "Canonical url '%(item_label)s'" +msgstr "Kanonický odkaz '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:151 +#, python-format +msgid "Download '%(item_label)s'" +msgstr "Stáhnout '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "Smazat soubor" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "Přetáhněte soubory sem nebo klikněte na tlačítko \"Nahrát soubory\"" + +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "Přetáhněte sem soubory, které chcete nahrát do:" + +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "Nahrát" + +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "zrušit" + +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "Nahrávání se zdařilo!" + +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "Nahrávání bylo zrušeno!" + +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 +msgid "previous" +msgstr "předchozí" + +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 +#, python-format +msgid "Page %(number)s of %(num_pages)s." +msgstr "Stránka %(number)s z %(num_pages)s." + +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 +msgid "next" +msgstr "následující" + +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "Vybrat všechny (%(total_count)s)" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +msgid "Select all" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +msgid "Files" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +msgid "Add new" +msgstr "Přidat" + +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" +msgstr "Hlavní stránka administrace" + +#: templates/admin/filer/folder/new_folder_form.html:15 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: templates/admin/filer/folder/new_folder_form.html:30 +msgid "Save" +msgstr "Uložit" + +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "Schtánka" + +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "Vložit všechny položky sem" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "Přesunout všechny soubory ve schránce do" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "Vyprázdnit schránku" + +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "schránka je prázdná" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "nahrávání selhalo" + +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +msgid "File is missing" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "Typ" + +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "Velikost souboru" + +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "Změněno" + +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "Vytvořeno" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "found" +msgstr "nalezeno" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "and" +msgstr "a" + +#: templates/admin/filer/tools/search_form.html:7 +msgid "cancel search" +msgstr "zrušit hledání" + +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "Vyčistit" + +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "přetáhněte soubory sem" + +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "žádný soubor nebyl vybrán" + +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "Vyhledat" + +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "Vybrat soubor" + +#: templates/admin/filer/widgets/admin_folder.html:16 +msgid "Choose Folder" +msgstr "" + +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" +msgstr "" + +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" +msgstr "" + +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" +msgstr "" + +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" +msgstr "" + +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" +msgstr "" + +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." + +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" + +#~ msgid "Open file" +#~ msgstr "Open file" + +#~ msgid "Full size preview" +#~ msgstr "Full size preview" + +#~ msgid "Add Description" +#~ msgstr "Add Description" + +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" + +#~ msgid "none selected" +#~ msgstr "none selected" + +#~ msgid "Add Folder" +#~ msgstr "Add Folder" + +#~ msgid "Subject Location" +#~ msgstr "Subject location" + +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" +#~ msgstr[1] "15c0f2d28d6dab1af1f6d94906beb627_pl_1" +#~ msgstr[2] "15c0f2d28d6dab1af1f6d94906beb627_pl_2" +#~ msgstr[3] "15c0f2d28d6dab1af1f6d94906beb627_pl_3" + +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/de/LC_MESSAGES/django.mo b/filer/locale/de/LC_MESSAGES/django.mo new file mode 100644 index 000000000..0f9415701 Binary files /dev/null and b/filer/locale/de/LC_MESSAGES/django.mo differ diff --git a/filer/locale/de/LC_MESSAGES/django.po b/filer/locale/de/LC_MESSAGES/django.po new file mode 100644 index 000000000..915585c65 --- /dev/null +++ b/filer/locale/de/LC_MESSAGES/django.po @@ -0,0 +1,1244 @@ +# 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: +# Translators: +# Angelo Dini , 2016-2017 +# Fabian Braun , 2023 +# Jannik Vieten , 2016-2017 +# Mitja Martini , 2012 +# Mitja Martini , 2012 +# Peter Wischer , 2018 +# Stefan Foulis , 2016 +msgid "" +msgstr "" +"Project-Id-Version: django Filer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: Fabian Braun , 2023\n" +"Language-Team: German (http://app.transifex.com/divio/django-filer/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/clipboardadmin.py:17 +#| msgid "" +#| "ccount doesn't have permissions to rename all of the selected files." +msgid "You do not have permission to upload files." +msgstr "Du hast keine Berechtigungen, um Dateien hochzuladen." + +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "Ich kann den Zielordner nicht finden. Bitter lade die Seite neu und versuche es noch einmal." + +#: admin/clipboardadmin.py:20 +msgid "" +"Can't use this folder, Permission Denied. Please select another folder." +msgstr "Zugriff auf diesen Ordner verweigert. Bitte wähle einen anderen Ordner." + +#: admin/fileadmin.py:73 +msgid "Advanced" +msgstr "Fortgeschritten" + +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "Kanonische URL" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "Einträge müssen ausgewählt werden, um Aktionen darauf auszuführen. Keine Einträge wurden geändert." + +#: admin/folderadmin.py:434 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s ausgewählt" +msgstr[1] "Alle %(total_count)s ausgewählt" + +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "Verzeichnis Auflistung für %(folder_name)s" + +#: admin/folderadmin.py:475 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 von %(cnt)s ausgewählt" + +#: admin/folderadmin.py:612 +msgid "No action selected." +msgstr "Keine Aktion ausgewählt." + +#: admin/folderadmin.py:664 +#, python-format +msgid "Successfully moved %(count)d files to clipboard." +msgstr "%(count)d Dateien wurden erfolgreich in die Zwischenablage gelegt." + +#: admin/folderadmin.py:669 +msgid "Move selected files to clipboard" +msgstr "Ausgewählte Dateien in die Zwischenablage legen" + +#: admin/folderadmin.py:709 +#, python-format +msgid "Successfully disabled permissions for %(count)d files." +msgstr "Berechtigungen für %(count)d Dateien erfolgreich deaktiviert." + +#: admin/folderadmin.py:711 +#, python-format +msgid "Successfully enabled permissions for %(count)d files." +msgstr "Berechtigungen für %(count)d Dateien erfolgreich aktiviert." + +#: admin/folderadmin.py:719 +msgid "Enable permissions for selected files" +msgstr "Berechtigungen für ausgewählte Dateien aktivieren" + +#: admin/folderadmin.py:725 +msgid "Disable permissions for selected files" +msgstr "Berechtigungen für ausgewählte Dateien deaktivieren" + +#: admin/folderadmin.py:789 +#, python-format +msgid "Successfully deleted %(count)d files and/or folders." +msgstr "%(count)d Dateien und/oder Ordner wurden erfolgreich gelöscht." + +#: admin/folderadmin.py:794 +msgid "Cannot delete files and/or folders" +msgstr "Dateien und/oder Ordner können nicht gelöscht werden" + +#: admin/folderadmin.py:796 +msgid "Are you sure?" +msgstr "Bist Du sicher?" + +#: admin/folderadmin.py:802 +msgid "Delete files and/or folders" +msgstr "Lösche Dateien und/oder Ordner" + +#: admin/folderadmin.py:823 +msgid "Delete selected files and/or folders" +msgstr "Lösche ausgewählte Dateien und/oder Ordner" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "Die Ordner mit den Namen %s existieren bereits am ausgewählten Zielort" + +#: admin/folderadmin.py:934 +#, python-format +msgid "" +"Successfully moved %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "%(count)d Dateien und/oder Ordner wurden erfolgreich in den Ordner '%(destination)s' verschoben." + +#: admin/folderadmin.py:942 admin/folderadmin.py:944 +msgid "Move files and/or folders" +msgstr "Verschiebe Dateien und/oder Ordner" + +#: admin/folderadmin.py:959 +msgid "Move selected files and/or folders" +msgstr "Ausgewählte Dateien und/oder Ordner verschieben" + +#: admin/folderadmin.py:1016 +#, python-format +msgid "Successfully renamed %(count)d files." +msgstr "%(count)d Dateien wurden erfolgreich umbenannt." + +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 +msgid "Rename files" +msgstr "Dateien umbenennen" + +#: admin/folderadmin.py:1137 +#, python-format +msgid "" +"Successfully copied %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "%(count)d Dateien und/oder Ordner wurden erfolgreich in den Ordner '%(destination)s' kopiert." + +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 +msgid "Copy files and/or folders" +msgstr "Kopiere Dateien und/oder Ordner" + +#: admin/folderadmin.py:1174 +msgid "Copy selected files and/or folders" +msgstr "Ausgewählte Dateien und/oder Ordner kopieren" + +#: admin/folderadmin.py:1279 +#, python-format +msgid "Successfully resized %(count)d images." +msgstr "Die Bildgrösse von %(count)d Bildern wurde erfolgreich geändert." + +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 +msgid "Resize images" +msgstr "Bildgrössen verändern" + +#: admin/folderadmin.py:1303 +msgid "Resize selected images" +msgstr "Die Bildgrössen der ausgewählten Bilder verändern" + +#: admin/forms.py:24 +msgid "Suffix which will be appended to filenames of copied files." +msgstr "Die Dateiendung, welche an die Dateinamen der kopierten Dateien angehängt wird." + +#: admin/forms.py:31 +#, python-format +msgid "" +"Suffix should be a valid, simple and lowercase filename part, like " +"\"%(valid)s\"." +msgstr "Die Dateiendung sollte ein gültiger, einfacher und kleingeschriebener Teil eines Dateinamens sein, wie zum Beispiel \"%(valid)s\"." + +#: admin/forms.py:52 +#, python-format +msgid "Unknown rename format value key \"%(key)s\"." +msgstr "Unbekannter Schlüssel für das Umbenennungs-Format: %(key)s." + +#: admin/forms.py:54 +#, python-format +msgid "Invalid rename format: %(error)s." +msgstr "Ungültiges Umbenennungs-Format: %(error)s." + +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 +msgid "thumbnail option" +msgstr "Vorschaubild Optionen" + +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 +msgid "width" +msgstr "Breite" + +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 +msgid "height" +msgstr "Höhe" + +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 +msgid "crop" +msgstr "Beschneiden" + +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 +msgid "upscale" +msgstr "Vergrössern" + +#: admin/forms.py:79 +msgid "Thumbnail option or resize parameters must be choosen." +msgstr "Vorschaubild Optionen oder Parameter zur Grössenänderung müssen ausgewählt werden." + +#: admin/imageadmin.py:20 admin/imageadmin.py:112 +msgid "Subject location" +msgstr "Ort des Hauptinhalts" + +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "Position des Hauptinhalts des Bildes. Format: \"x,y\"." + +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "Ungültiges Format zur Positionsangabe." + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "Angegebene Position des Hauptinhalts liegt außerhalb des Bildes." + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "Deine Eingabe: \"{subject_location}\". " + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" +msgstr "Wer" + +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" +msgstr "Was" + +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "Dieser Ordnername wird bereits verwendet." + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "Filer" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "Medienbibliothek" + +#: models/abstract.py:62 +msgid "default alt text" +msgstr "Standard Alt-Text" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "Standard Bildlegende" + +#: models/abstract.py:76 +msgid "subject location" +msgstr "Ort des Hauptinhalts" + +#: models/abstract.py:91 +msgid "image" +msgstr "Bild" + +#: models/abstract.py:92 +msgid "images" +msgstr "Bilder" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "Bildformat nicht erkannt oder Bildgröße überschreitet den Grenzwert von %(max_pixels)d Millionen Pixeln um einen Faktor 2 oder mehr. Vor erneutem Hochladen prüfen Sie das Dateiformat oder verkleinern Sie das Bild auf %(width)d x %(height)d oder weniger." + +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." +msgstr "Bildgröße (%(pixels)d Millionen Pixel) überschreitet den Grenzwert von %(max_pixels)d Millionen Pixeln. Vor erneutem Hochladen verkleinern Sie das Bild auf %(width)d x %(height)d oder weniger." + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 +msgid "user" +msgstr "Benutzer" + +#: models/clipboardmodels.py:17 models/filemodels.py:157 +msgid "files" +msgstr "Dateien" + +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 +msgid "clipboard" +msgstr "Zwischenablage" + +#: models/clipboardmodels.py:25 +msgid "clipboards" +msgstr "Zwischenablagen" + +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 +msgid "file" +msgstr "Datei" + +#: models/clipboardmodels.py:56 +msgid "clipboard item" +msgstr "Eintrag der Zwischenablage" + +#: models/clipboardmodels.py:57 +msgid "clipboard items" +msgstr "Einträge der Zwischenablage" + +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "folder" +msgstr "Ordner" + +#: models/filemodels.py:81 +msgid "file size" +msgstr "Dateigrösse" + +#: models/filemodels.py:87 +msgid "sha1" +msgstr "sha1" + +#: models/filemodels.py:94 +msgid "has all mandatory data" +msgstr "hat alle Pflichtinhalte" + +#: models/filemodels.py:100 +msgid "original filename" +msgstr "ursprünglicher Dateiname" + +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 +msgid "name" +msgstr "Name" + +#: models/filemodels.py:116 +msgid "description" +msgstr "Beschreibung" + +#: models/filemodels.py:125 models/foldermodels.py:108 +msgid "owner" +msgstr "Besitzer" + +#: models/filemodels.py:129 models/foldermodels.py:116 +msgid "uploaded at" +msgstr "Hochgeladen am" + +#: models/filemodels.py:134 models/foldermodels.py:126 +msgid "modified at" +msgstr "Verändert am" + +#: models/filemodels.py:140 +msgid "Permissions disabled" +msgstr "Berechtigungen deaktiviert" + +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "Zugriffskontrolle für diese Datei deaktivieren. Die Datei wird für jeden öffentlich zugreifbar sein." + +#: models/foldermodels.py:94 +msgid "parent" +msgstr "Übergeordneter Ordner" + +#: models/foldermodels.py:121 +msgid "created at" +msgstr "Angelegt am" + +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Folder" +msgstr "Ordner" + +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 +msgid "Folders" +msgstr "Ordner" + +#: models/foldermodels.py:260 +msgid "all items" +msgstr "alle Einträge" + +#: models/foldermodels.py:261 +msgid "this item only" +msgstr "nur dieser Eintrag" + +#: models/foldermodels.py:262 +msgid "this item and all children" +msgstr "dieser Eintrag und alle darunter liegenden Einträge" + +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "vererben" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "erlauben" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "verbieten" + +#: models/foldermodels.py:280 +msgid "type" +msgstr "Typ" + +#: models/foldermodels.py:297 +msgid "group" +msgstr "Gruppe" + +#: models/foldermodels.py:304 +msgid "everybody" +msgstr "Jeder" + +#: models/foldermodels.py:309 +msgid "can read" +msgstr "kann lesen" + +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "kann ändern" + +#: models/foldermodels.py:325 +msgid "can add children" +msgstr "kann Kinder hinzufügen" + +#: models/foldermodels.py:333 +msgid "folder permission" +msgstr "Ordnerberechtigung" + +#: models/foldermodels.py:334 +msgid "folder permissions" +msgstr "Ordnerberechtigungen" + +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." +msgstr "Für den Typ \"Alle Einträge\" kann kein Ordner ausgewählt werden. " + +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." +msgstr "Für alle Typen außer \"Alle Einträge\" muss ein Ordner ausgewählt werden." + +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." +msgstr "Zusammen mit \"Jeder\" kann kein Benutzer oder eine Gruppe ausgewählt werden." + +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." +msgstr "Mindestens ein Eintrag muss gewählt werden: \"Benutzer\", \"Gruppe\" oder \"Jeder\"." + +#: models/foldermodels.py:360 +#| msgid "Folders" +msgid "All Folders" +msgstr "Alle Ordner" + +#: models/foldermodels.py:362 +msgid "Logical Path" +msgstr "Logischer Pfad" + +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" +msgstr "Nutzer: {user}" + +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" +msgstr "Gruppe: {group}" + +#: models/foldermodels.py:375 +#| msgid "everybody" +msgid "Everybody" +msgstr "Jede(r)" + +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "Edit" + +#: models/foldermodels.py:389 +msgid "Read" +msgstr "Lesen" + +#: models/foldermodels.py:390 +#| msgid "can add children" +msgid "Add children" +msgstr "Unterordner hinzufügen" + +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "Aufgenommen am" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "Autor" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "Nennung des Autoren ist Pflicht" + +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "Veröffentlichung des Copyright ist Pflicht" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "Breite in Pixel." + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "Höhe in Pixel." + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "Vorschaubild-Optionen" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "Nicht sortierte Uploads" + +#: models/virtualitems.py:73 +msgid "files with missing metadata" +msgstr "Dateien mit fehlenden Metadaten" + +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "root" +msgstr "Start" + +#: settings.py:273 +msgid "Show table view" +msgstr "Tabellenansicht" + +#: settings.py:278 +#| msgid "thumbnail option" +msgid "Show thumbnail view" +msgstr "Vorschauansicht" + +#: templates/admin/filer/actions.html:5 +msgid "Run the selected action" +msgstr "Die ausgewählte Aktion ausführen" + +#: templates/admin/filer/actions.html:5 +msgid "Go" +msgstr "Los" + +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +msgid "Click here to select the objects across all pages" +msgstr "Hier klicken, um die Objekte über alle Seiten hinweg auszuwählen" + +#: templates/admin/filer/actions.html:14 +#, python-format +msgid "Select all %(total_count)s files and/or folders" +msgstr "Alle %(total_count)s Dateien und/oder Ordner auswählen" + +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 +msgid "Clear selection" +msgstr "Auswahl aufheben" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 +msgid "Go back to admin homepage" +msgstr "Zur Admin Startseite zurück gehen" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 +msgid "Home" +msgstr "Startseite" + +#: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 +msgid "Go back to Filer app" +msgstr "Zur Filer App zurück gehen" + +#: templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Go back to root folder" +msgstr "Zum Root Ordner zurück gehen" + +#: templates/admin/filer/breadcrumbs.html:8 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 +#, python-format +msgid "Go back to '%(folder_name)s' folder" +msgstr "Zum Ordner '%(folder_name)s' zurück gehen" + +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "Duplikate" + +#: templates/admin/filer/delete_selected_files_confirmation.html:11 +msgid "" +"Deleting the selected files and/or folders would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "Beim Löschen der ausgewählten Dateien und/oder Ordner, würden verbundene Objekte mitgelöscht. Dein Benutzerkonto hat jedoch nicht die erforderlichen Berechtigungen, um die folgenden Objekttypen zu löschen:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:19 +msgid "" +"Deleting the selected files and/or folders would require deleting the " +"following protected related objects:" +msgstr "Das Löschen der folgenden ausgewählten Dateien und/oder Ordner würde das Löschen der folgenden geschützten verknüpften Objekte erfordern:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:27 +msgid "" +"Are you sure you want to delete the selected files and/or folders? All of " +"the following objects and their related items will be deleted:" +msgstr "Bist Du sicher, dass Du die ausgewählten Dateien und/oder Ordner löschen willst? Alle der folgenden Objekte und ihre verbundenen Einträge werden gelöscht:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "Nein, zurück gehen" + +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "Ja, ich bin sicher" + +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 +msgid "History" +msgstr "Historie" + +#: templates/admin/filer/file/change_form.html:37 +#: templates/admin/filer/folder/change_form.html:23 +#: templates/admin/filer/image/change_form.html:37 +msgid "View on site" +msgstr "Auf der Website ansehen" + +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "Gehe zurück zu" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "Admin Startseite" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 +msgid "Folder Icon" +msgstr "Ordner Icon" + +#: templates/admin/filer/folder/choose_copy_destination.html:23 +msgid "" +"Your account doesn't have permissions to copy all of the selected files " +"and/or folders." +msgstr "Dein Benutzerkonto hat nicht die Berechtigungen, um alle der ausgewählten Dateien und/oder Ordner zu kopieren." + +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "Zurück gehen" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 +msgid "There are no destination folders available." +msgstr "Es gibt keine verwendbaren Zielordner." + +#: templates/admin/filer/folder/choose_copy_destination.html:35 +msgid "There are no files and/or folders available to copy." +msgstr "Es gibt keine Dateien und/oder Ordner zum Kopieren." + +#: templates/admin/filer/folder/choose_copy_destination.html:40 +msgid "" +"The following files and/or folders will be copied to a destination folder " +"(retaining their tree structure):" +msgstr "Die folgenden Dateien und/oder Ordner werden in einen Zielordner kopiert (unter Beibehaltung ihrer Ordnerstruktur):" + +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 +msgid "Destination folder:" +msgstr "Zielordner" + +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 +msgid "Copy" +msgstr "Kopieren" + +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "Es ist nicht erlaubt Dateien in den selben Ordner zu kopieren" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 +msgid "" +"Your account doesn't have permissions to resize all of the selected images." +msgstr "Dein Benutzerkonto hat nicht die erforderlichen Berechtigungen, um die Grösse jedes der ausgewählten Bilder zu verändern." + +#: templates/admin/filer/folder/choose_images_resize_options.html:18 +msgid "There are no images available to resize." +msgstr "Es gibt keine Bilder auf denen die Größenänderung anwendbar ist." + +#: templates/admin/filer/folder/choose_images_resize_options.html:20 +msgid "The following images will be resized:" +msgstr "Die Grösse der folgenden Bilder wird verändert:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:32 +msgid "Choose an existing thumbnail option or enter resize parameters:" +msgstr "Wähle eine vorhandene Vorschaubild Option aus oder gib die Parameter für die Bildgrössenänderung an:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:36 +msgid "" +"Warning: Images will be resized in-place and originals will be lost. Maybe " +"first make a copy of them to retain the originals." +msgstr "Warnung: Die Bilder werden in-place verändert. Die Originale gehen dabei verloren. Lege bei Bedarf eine Kopie der Originale an." + +#: templates/admin/filer/folder/choose_images_resize_options.html:39 +msgid "Resize" +msgstr "Bildgrösse verändern" + +#: templates/admin/filer/folder/choose_move_destination.html:35 +msgid "" +"Your account doesn't have permissions to move all of the selected files " +"and/or folders." +msgstr "Dein Benutzerkonto hat nicht die erforderlichen Berechtigungen, um alle ausgewählten Dateien und/oder Ordner zu verschieben." + +#: templates/admin/filer/folder/choose_move_destination.html:47 +msgid "There are no files and/or folders available to move." +msgstr "Es gibt keine verschiebbaren Dateien und/oder Ordner." + +#: templates/admin/filer/folder/choose_move_destination.html:52 +msgid "" +"The following files and/or folders will be moved to a destination folder " +"(retaining their tree structure):" +msgstr "Die folgenden Dateien und/oder Ordner werden in ein Zielordner verschoben (unter Beibehaltung ihrer Ordnerstruktur):" + +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 +msgid "Move" +msgstr "Verschieben" + +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "Es ist nicht erlaubt Dateien in den selben Ordner zu verschieben" + +#: templates/admin/filer/folder/choose_rename_format.html:15 +msgid "" +"Your account doesn't have permissions to rename all of the selected files." +msgstr "Dein Benutzerkonto hat nicht die erforderlichen Berechtigungen, um alle ausgewählten Dateien umzubenennen." + +#: templates/admin/filer/folder/choose_rename_format.html:18 +msgid "There are no files available to rename." +msgstr "Es sind keine Dateien, die umbenannt werden können." + +#: templates/admin/filer/folder/choose_rename_format.html:20 +msgid "" +"The following files will be renamed (they will stay in their folders and " +"keep original filename, only displayed filename will be changed):" +msgstr "Die folgenden Dateien werden umbenannt (sie bleiben in ihren Ordnern und behalten ihren originalen Dateinamen, nur dier angezeigte Dateiname wird geändert):" + +#: templates/admin/filer/folder/choose_rename_format.html:59 +msgid "Rename" +msgstr "Umbenennen" + +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "Gehe zurück zum übergeordneten Ordner" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "Details des aktuellen Ordners ändern" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "Ändern" + +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "Hier klicken, um nach dem eingegebenen Text zu suchen" + +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "Suchen" + +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "Schliessen" + +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "Limit" + +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "Aktivieren, um die Suche auf den aktuellen Ordner zu beschränken" + +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "Suche auf aktuellen Ordner beschränken" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "Löschen" + +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "Fügt einen neuen Ordner hinzu" + +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "Neuer Ordner" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "Dateien hochladen" + +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "Du musst zuerst einen Ordner auswählen" + +#: templates/admin/filer/folder/directory_table_list.html:16 +msgid "Name" +msgstr "Name" + +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "Besitzer" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "Grösse" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "Aktion" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 +#, python-format +msgid "Change '%(item_label)s' folder details" +msgstr "Ändere Details des Ordners '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "%(counter)s Ordner" +msgstr[1] "%(counter)s Ordner" + +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "%(counter)s Datei" +msgstr[1] "%(counter)s Dateien" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "Ordner-Details ändern" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "Ordner löschen" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 +msgid "Select this file" +msgstr "Diese Datei auswählen" + +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 +#, python-format +msgid "Change '%(item_label)s' details" +msgstr "Ändere Details von '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "Permissions" +msgstr "Berechtigungen" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "disabled" +msgstr "deaktiviert" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "enabled" +msgstr "aktiviert" + +#: templates/admin/filer/folder/directory_table_list.html:144 +#| msgid "Move selected files to clipboard" +msgid "URL copied to clipboard" +msgstr "URL in Zwischenablage kopiert" + +#: templates/admin/filer/folder/directory_table_list.html:147 +#, python-format +#| msgid "Change '%(item_label)s' details" +msgid "Canonical url '%(item_label)s'" +msgstr "Kanonische URL '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:151 +#, python-format +#| msgid "Change '%(item_label)s' details" +msgid "Download '%(item_label)s'" +msgstr "'%(item_label)s' herunterladen" + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "Datei löschen" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "Dateien hier ablegen oder den \"Datei hochladen\" Button benutzen." + +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "Dateien hier ablegen um sie in den folgenden Ordner abzulegen:" + +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "Hochladen" + +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "Abbrechen" + +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "Upload erfolgreich!" + +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "Upload abgebrochen!" + +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 +msgid "previous" +msgstr "vorige" + +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 +#, python-format +msgid "Page %(number)s of %(num_pages)s." +msgstr "Seite %(number)s von %(num_pages)s." + +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 +msgid "next" +msgstr "nächste" + +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "Alle %(total_count)s auswählen" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +#| msgid "Select this file" +msgid "Select all" +msgstr "Alle auswählen" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +#| msgid "Filer" +msgid "Files" +msgstr "Dateien" + +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +msgid "Add new" +msgstr "Hinzufügen" + +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" +msgstr "Django Seiten-Administration" + +#: templates/admin/filer/folder/new_folder_form.html:15 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Bitte korrigiere den unten genannten Fehler." +msgstr[1] "Bitte korrigiere die unten genannten Fehler." + +#: templates/admin/filer/folder/new_folder_form.html:30 +msgid "Save" +msgstr "Sichern" + +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." +msgstr "Dein Browser unterstützt kein Audio." + +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." +msgstr "Dein Browser unterstützt kein Video." + +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "Zwischenablage" + +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "Alle Einträge hier einfügen" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "Bewege alle Dateien in der Zwischenablage nach" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "Zwischenablage leeren" + +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "die Zwischenablage ist leer" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "das Hochladen schlug fehl" + +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" +msgstr "Herunterladen" + +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" +msgstr "Vergrößern" + +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +#| msgid "file missing" +msgid "File is missing" +msgstr "Datei fehlt" + +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "Typ" + +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "Dateigrösse" + +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "Verändert am" + +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "Erstellt am" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "found" +msgstr "gefunden" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "and" +msgstr "und" + +#: templates/admin/filer/tools/search_form.html:7 +msgid "cancel search" +msgstr "Suche abbrechen" + +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "Zurücksetzen" + +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "oder die Datei hierhin ziehen" + +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "keine Datei ausgewählt" + +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "Nachschlagen" + +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "Datei auswählen" + +#: templates/admin/filer/widgets/admin_folder.html:16 +#| msgid "Choose File" +msgid "Choose Folder" +msgstr "Ordner auswählen" + +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" +msgstr "Datei \"{file_name}\": Die Sicherheitseinstellung der Seite haben die Datei zurückgewiesen." + +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" +msgstr "Datei \"{file_name}\": Die Sicherheitseinstellung weisen {file_type}-Dateien zurück." + +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" +msgstr "Datei \"{file_name}\": Die Sicherheitseinstellung weisen HTML-Dateien zurück." + +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" +msgstr "Datei \"{file_name}\": Zurückgewiesen, da eine \"Cross Site Scripting\"-Attacke nicht ausgeschlossen werden kann." + +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" +msgstr "Datei \"{file_name}\": SVG-Format nicht erkannt" + +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." + +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" + +#~ msgid "Open file" +#~ msgstr "Open file" + +#~ msgid "Full size preview" +#~ msgstr "Full size preview" + +#~ msgid "Add Description" +#~ msgstr "Add Description" + +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" + +#~ msgid "none selected" +#~ msgstr "none selected" + +#~ msgid "Add Folder" +#~ msgstr "Add Folder" + +#~ msgid "Subject Location" +#~ msgstr "Subject location" + +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" +#~ msgstr[1] "15c0f2d28d6dab1af1f6d94906beb627_pl_1" + +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/en/LC_MESSAGES/django.mo b/filer/locale/en/LC_MESSAGES/django.mo index 11a1682b6..4f8792c06 100644 Binary files a/filer/locale/en/LC_MESSAGES/django.mo and b/filer/locale/en/LC_MESSAGES/django.mo differ diff --git a/filer/locale/en/LC_MESSAGES/django.po b/filer/locale/en/LC_MESSAGES/django.po index 449ccce4c..fbcc67bdc 100644 --- a/filer/locale/en/LC_MESSAGES/django.po +++ b/filer/locale/en/LC_MESSAGES/django.po @@ -1,483 +1,643 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. # +# Translators: +# Translators: msgid "" msgstr "" -"Project-Id-Version: django-filer 0.9\n" +"Project-Id-Version: django Filer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-07-13 19:10+0200\n" -"PO-Revision-Date: 2012-09-03 20:10+0100\n" -"Last-Translator: Stefan Foulis \n" -"Language-Team: en \n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2016-06-17 14:16+0000\n" +"Last-Translator: Angelo Dini \n" +"Language-Team: English (http://www.transifex.com/divio/django-filer/language/" +"en/)\n" "Language: en\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" -#: views.py:103 -msgid "Folder with this name already exists." +#: admin/clipboardadmin.py:17 +#, fuzzy +#| msgid "" +#| "Your account doesn't have permissions to rename all of the selected files." +msgid "You do not have permission to upload files." msgstr "" +"Your account doesn't have permissions to rename all of the selected files." -#: admin/fileadmin.py:41 -msgid "Advanced" +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" msgstr "" -#: admin/folderadmin.py:324 admin/folderadmin.py:427 +#: admin/clipboardadmin.py:20 +msgid "Can't use this folder, Permission Denied. Please select another folder." +msgstr "" + +#: admin/fileadmin.py:73 +msgid "Advanced" +msgstr "Advanced" + +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "canonical URL" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 msgid "" "Items must be selected in order to perform actions on them. No items have " "been changed." msgstr "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." -#: admin/folderadmin.py:344 +#: admin/folderadmin.py:434 #, python-format msgid "%(total_count)s selected" msgid_plural "All %(total_count)s selected" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%(total_count)s selected" +msgstr[1] "All %(total_count)s selected" -#: admin/folderadmin.py:377 +#: admin/folderadmin.py:460 #, python-format -msgid "0 of %(cnt)s selected" +msgid "Directory listing for %(folder_name)s" msgstr "" -#: admin/folderadmin.py:456 +#: admin/folderadmin.py:475 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 of %(cnt)s selected" + +#: admin/folderadmin.py:612 msgid "No action selected." -msgstr "" +msgstr "No action selected." -#: admin/folderadmin.py:497 +#: admin/folderadmin.py:664 #, python-format msgid "Successfully moved %(count)d files to clipboard." -msgstr "" +msgstr "Successfully moved %(count)d files to clipboard." -#: admin/folderadmin.py:503 +#: admin/folderadmin.py:669 msgid "Move selected files to clipboard" -msgstr "" +msgstr "Move selected files to clipboard" -#: admin/folderadmin.py:537 +#: admin/folderadmin.py:709 #, python-format msgid "Successfully disabled permissions for %(count)d files." -msgstr "" +msgstr "Successfully disabled permissions for %(count)d files." -#: admin/folderadmin.py:541 +#: admin/folderadmin.py:711 #, python-format msgid "Successfully enabled permissions for %(count)d files." -msgstr "" +msgstr "Successfully enabled permissions for %(count)d files." -#: admin/folderadmin.py:550 +#: admin/folderadmin.py:719 msgid "Enable permissions for selected files" -msgstr "" +msgstr "Enable permissions for selected files" -#: admin/folderadmin.py:555 +#: admin/folderadmin.py:725 msgid "Disable permissions for selected files" -msgstr "" +msgstr "Disable permissions for selected files" -#: admin/folderadmin.py:623 +#: admin/folderadmin.py:789 #, python-format msgid "Successfully deleted %(count)d files and/or folders." -msgstr "" +msgstr "Successfully deleted %(count)d files and/or folders." -#: admin/folderadmin.py:630 +#: admin/folderadmin.py:794 msgid "Cannot delete files and/or folders" -msgstr "" +msgstr "Cannot delete files and/or folders" -#: admin/folderadmin.py:632 +#: admin/folderadmin.py:796 msgid "Are you sure?" -msgstr "" +msgstr "Are you sure?" -#: admin/folderadmin.py:637 +#: admin/folderadmin.py:802 msgid "Delete files and/or folders" -msgstr "" +msgstr "Delete files and/or folders" -#: admin/folderadmin.py:656 +#: admin/folderadmin.py:823 msgid "Delete selected files and/or folders" -msgstr "" +msgstr "Delete selected files and/or folders" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "Folders with names %s already exist at the selected destination" -#: admin/folderadmin.py:771 +#: admin/folderadmin.py:934 #, python-format msgid "" "Successfully moved %(count)d files and/or folders to folder " "'%(destination)s'." msgstr "" +"Successfully moved %(count)d files and/or folders to folder " +"'%(destination)s'." -#: admin/folderadmin.py:778 admin/folderadmin.py:780 +#: admin/folderadmin.py:942 admin/folderadmin.py:944 msgid "Move files and/or folders" -msgstr "" +msgstr "Move files and/or folders" -#: admin/folderadmin.py:797 +#: admin/folderadmin.py:959 msgid "Move selected files and/or folders" -msgstr "" +msgstr "Move selected files and/or folders" -#: admin/folderadmin.py:854 +#: admin/folderadmin.py:1016 #, python-format msgid "Successfully renamed %(count)d files." -msgstr "" +msgstr "Successfully renamed %(count)d files." -#: admin/folderadmin.py:862 admin/folderadmin.py:864 admin/folderadmin.py:881 +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 msgid "Rename files" -msgstr "" +msgstr "Rename files" -#: admin/folderadmin.py:975 +#: admin/folderadmin.py:1137 #, python-format msgid "" "Successfully copied %(count)d files and/or folders to folder " "'%(destination)s'." msgstr "" +"Successfully copied %(count)d files and/or folders to folder " +"'%(destination)s'." -#: admin/folderadmin.py:989 admin/folderadmin.py:991 +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 msgid "Copy files and/or folders" -msgstr "" +msgstr "Copy files and/or folders" -#: admin/folderadmin.py:1010 +#: admin/folderadmin.py:1174 msgid "Copy selected files and/or folders" -msgstr "" +msgstr "Copy selected files and/or folders" -#: admin/folderadmin.py:1105 +#: admin/folderadmin.py:1279 #, python-format msgid "Successfully resized %(count)d images." -msgstr "" +msgstr "Successfully resized %(count)d images." -#: admin/folderadmin.py:1113 admin/folderadmin.py:1115 +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 msgid "Resize images" -msgstr "" +msgstr "Resize images" -#: admin/folderadmin.py:1133 +#: admin/folderadmin.py:1303 msgid "Resize selected images" -msgstr "" +msgstr "Resize selected images" -#: admin/forms.py:26 +#: admin/forms.py:24 msgid "Suffix which will be appended to filenames of copied files." -msgstr "" +msgstr "Suffix which will be appended to filenames of copied files." -#: admin/forms.py:33 +#: admin/forms.py:31 #, python-format msgid "" "Suffix should be a valid, simple and lowercase filename part, like " "\"%(valid)s\"." msgstr "" +"Suffix should be a valid, simple and lowercase filename part, like " +"\"%(valid)s\"." -#: admin/forms.py:54 +#: admin/forms.py:52 #, python-format msgid "Unknown rename format value key \"%(key)s\"." -msgstr "" +msgstr "Unknown rename format value key \"%(key)s\"." -#: admin/forms.py:56 +#: admin/forms.py:54 #, python-format msgid "Invalid rename format: %(error)s." -msgstr "" +msgstr "Invalid rename format: %(error)s." -#: admin/forms.py:62 +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 msgid "thumbnail option" -msgstr "" +msgstr "thumbnail option" -#: admin/forms.py:63 +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 msgid "width" -msgstr "" +msgstr "width" -#: admin/forms.py:64 +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 msgid "height" -msgstr "" +msgstr "height" -#: admin/forms.py:65 +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 msgid "crop" -msgstr "" +msgstr "crop" -#: admin/forms.py:66 +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 msgid "upscale" -msgstr "" +msgstr "upscale" -#: admin/forms.py:71 +#: admin/forms.py:79 msgid "Thumbnail option or resize parameters must be choosen." +msgstr "Thumbnail option or resize parameters must be choosen." + +#: admin/imageadmin.py:20 admin/imageadmin.py:112 +msgid "Subject location" +msgstr "Subject location" + +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "Location of the main subject of the scene. Format: \"x,y\"." + +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "Invalid subject location format. " + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "Subject location is outside of the image. " + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "Your input: \"{subject_location}\". " + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" msgstr "" -#: admin/forms.py:73 -msgid "Resize parameters must be choosen." +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" msgstr "" -#: admin/imageadmin.py:12 -msgid "Subject location" +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "Folder with this name already exists." + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "Filer" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" msgstr "" -#: admin/imageadmin.py:13 -msgid "Location of the main subject of the scene." +#: models/abstract.py:62 +msgid "default alt text" +msgstr "default alt text" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "default caption" + +#: models/abstract.py:76 +msgid "subject location" +msgstr "subject location" + +#: models/abstract.py:91 +msgid "image" +msgstr "image" + +#: models/abstract.py:92 +msgid "images" +msgstr "images" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." msgstr "" -#: models/clipboardmodels.py:9 models/foldermodels.py:236 -msgid "user" +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." msgstr "" -#: models/clipboardmodels.py:11 models/filemodels.py:287 +#: models/clipboardmodels.py:11 models/foldermodels.py:289 +msgid "user" +msgstr "user" + +#: models/clipboardmodels.py:17 models/filemodels.py:157 msgid "files" -msgstr "" +msgstr "files" -#: models/clipboardmodels.py:34 models/clipboardmodels.py:40 +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 msgid "clipboard" -msgstr "" +msgstr "clipboard" -#: models/clipboardmodels.py:35 +#: models/clipboardmodels.py:25 msgid "clipboards" -msgstr "" +msgstr "clipboards" -#: models/clipboardmodels.py:39 models/filemodels.py:35 -#: models/filemodels.py:286 +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 msgid "file" -msgstr "" +msgstr "file" -#: models/clipboardmodels.py:44 +#: models/clipboardmodels.py:56 msgid "clipboard item" -msgstr "" +msgstr "clipboard item" -#: models/clipboardmodels.py:45 +#: models/clipboardmodels.py:57 msgid "clipboard items" -msgstr "" +msgstr "clipboard items" -#: models/filemodels.py:33 templates/admin/filer/folder/change_form.html:9 -#: templates/admin/filer/folder/directory_listing.html:74 +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 #: templates/admin/filer/folder/new_folder_form.html:4 -#: templates/admin/filer/tools/clipboard/clipboard.html:26 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 msgid "folder" -msgstr "" +msgstr "folder" -#: models/filemodels.py:36 +#: models/filemodels.py:81 msgid "file size" -msgstr "" +msgstr "file size" -#: models/filemodels.py:38 +#: models/filemodels.py:87 msgid "sha1" -msgstr "" +msgstr "sha1" -#: models/filemodels.py:40 +#: models/filemodels.py:94 msgid "has all mandatory data" -msgstr "" +msgstr "has all mandatory data" -#: models/filemodels.py:42 +#: models/filemodels.py:100 msgid "original filename" -msgstr "" +msgstr "original filename" -#: models/filemodels.py:44 models/foldermodels.py:99 +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 msgid "name" -msgstr "" +msgstr "name" -#: models/filemodels.py:46 +#: models/filemodels.py:116 msgid "description" -msgstr "" +msgstr "description" -#: models/filemodels.py:50 +#: models/filemodels.py:125 models/foldermodels.py:108 msgid "owner" -msgstr "uploaded by" +msgstr "owner" -#: models/filemodels.py:52 models/foldermodels.py:105 +#: models/filemodels.py:129 models/foldermodels.py:116 msgid "uploaded at" -msgstr "" +msgstr "uploaded at" -#: models/filemodels.py:53 models/foldermodels.py:108 +#: models/filemodels.py:134 models/foldermodels.py:126 msgid "modified at" -msgstr "" +msgstr "modified at" -#: models/filemodels.py:57 +#: models/filemodels.py:140 msgid "Permissions disabled" +msgstr "Permissions disabled" + +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." msgstr "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." -#: models/filemodels.py:58 -msgid "Disable any permission checking for this " +#: models/foldermodels.py:94 +msgid "parent" msgstr "" -#: models/foldermodels.py:107 +#: models/foldermodels.py:121 msgid "created at" -msgstr "" +msgstr "created at" -#: models/foldermodels.py:211 -#: templates/admin/filer/widgets/admin_folder.html:3 -#: templates/admin/filer/widgets/admin_folder.html:5 +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 msgid "Folder" -msgstr "" +msgstr "Folder" -#: models/foldermodels.py:212 +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 msgid "Folders" -msgstr "" +msgstr "Folders" -#: models/foldermodels.py:227 +#: models/foldermodels.py:260 msgid "all items" -msgstr "" +msgstr "all items" -#: models/foldermodels.py:228 +#: models/foldermodels.py:261 msgid "this item only" -msgstr "" +msgstr "this item only" -#: models/foldermodels.py:229 +#: models/foldermodels.py:262 msgid "this item and all children" +msgstr "this item and all children" + +#: models/foldermodels.py:266 +msgid "inherit" msgstr "" -#: models/foldermodels.py:233 +#: models/foldermodels.py:267 +msgid "allow" +msgstr "allow" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "deny" + +#: models/foldermodels.py:280 msgid "type" -msgstr "" +msgstr "type" -#: models/foldermodels.py:239 +#: models/foldermodels.py:297 msgid "group" -msgstr "" +msgstr "group" -#: models/foldermodels.py:240 +#: models/foldermodels.py:304 msgid "everybody" -msgstr "" - -#: models/foldermodels.py:242 -msgid "can edit" -msgstr "" +msgstr "everybody" -#: models/foldermodels.py:243 +#: models/foldermodels.py:309 msgid "can read" -msgstr "" +msgstr "can read" -#: models/foldermodels.py:244 +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "can edit" + +#: models/foldermodels.py:325 msgid "can add children" -msgstr "" +msgstr "can add children" -#: models/foldermodels.py:273 +#: models/foldermodels.py:333 msgid "folder permission" -msgstr "" +msgstr "folder permission" -#: models/foldermodels.py:274 +#: models/foldermodels.py:334 msgid "folder permissions" -msgstr "" +msgstr "folder permissions" -#: models/imagemodels.py:39 -msgid "date taken" +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." msgstr "" -#: models/imagemodels.py:42 -msgid "default alt text" +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." msgstr "" -#: models/imagemodels.py:43 -msgid "default caption" +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." msgstr "" -#: models/imagemodels.py:45 templates/image_filer/image.html:6 -msgid "author" +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." msgstr "" -#: models/imagemodels.py:47 -msgid "must always publish author credit" -msgstr "" +#: models/foldermodels.py:360 +#, fuzzy +#| msgid "Folders" +msgid "All Folders" +msgstr "Folders" -#: models/imagemodels.py:48 -msgid "must always publish copyright" +#: models/foldermodels.py:362 +msgid "Logical Path" msgstr "" -#: models/imagemodels.py:50 -msgid "subject location" +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" msgstr "" -#: models/imagemodels.py:200 -msgid "image" +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" msgstr "" -#: models/imagemodels.py:201 -msgid "images" +#: models/foldermodels.py:375 +#, fuzzy +#| msgid "everybody" +msgid "Everybody" +msgstr "everybody" + +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" msgstr "" -#: models/virtualitems.py:45 -#: templates/admin/filer/tools/clipboard/clipboard.html:26 -msgid "unfiled files" +#: models/foldermodels.py:389 +msgid "Read" msgstr "" -#: models/virtualitems.py:59 +#: models/foldermodels.py:390 +#, fuzzy +#| msgid "can add children" +msgid "Add children" +msgstr "can add children" + +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "date taken" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "author" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "must always publish author credit" + +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "must always publish copyright" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "width in pixel." + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "height in pixel." + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "thumbnail options" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "Unsorted Uploads" + +#: models/virtualitems.py:73 msgid "files with missing metadata" -msgstr "" +msgstr "files with missing metadata" -#: models/virtualitems.py:73 templates/admin/filer/breadcrumbs.html:6 -#: templates/admin/filer/folder/change_form.html:9 -#: templates/admin/filer/folder/directory_listing.html:74 -#: templates/image_filer/image_export_form.html:10 +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 msgid "root" +msgstr "root" + +#: settings.py:273 +msgid "Show table view" msgstr "" -#: templates/admin/filer/actions.html:4 +#: settings.py:278 +#, fuzzy +#| msgid "thumbnail option" +msgid "Show thumbnail view" +msgstr "thumbnail option" + +#: templates/admin/filer/actions.html:5 msgid "Run the selected action" -msgstr "" +msgstr "Run the selected action" -#: templates/admin/filer/actions.html:4 +#: templates/admin/filer/actions.html:5 msgid "Go" -msgstr "" +msgstr "Go" -#: templates/admin/filer/actions.html:11 +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 msgid "Click here to select the objects across all pages" -msgstr "" +msgstr "Click here to select the objects across all pages" -#: templates/admin/filer/actions.html:11 +#: templates/admin/filer/actions.html:14 #, python-format msgid "Select all %(total_count)s files and/or folders" -msgstr "" +msgstr "Select all %(total_count)s files and/or folders" -#: templates/admin/filer/actions.html:13 +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 msgid "Clear selection" -msgstr "" +msgstr "Clear selection" #: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 msgid "Go back to admin homepage" -msgstr "" +msgstr "Go back to admin homepage" #: templates/admin/filer/breadcrumbs.html:4 -#: templates/admin/filer/folder/change_form.html:7 -#: templates/image_filer/image_export_form.html:7 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 msgid "Home" -msgstr "" +msgstr "Home" #: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 msgid "Go back to Filer app" -msgstr "" - -#: templates/admin/filer/breadcrumbs.html:5 -#: templates/admin/filer/folder/change_form.html:8 -#: templates/image_filer/image_export_form.html:8 -msgid "Filer" -msgstr "" +msgstr "Go back to Filer app" #: templates/admin/filer/breadcrumbs.html:6 -#: templates/image_filer/image_export_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:35 msgid "Go back to root folder" -msgstr "" +msgstr "Go back to root folder" #: templates/admin/filer/breadcrumbs.html:8 -#: templates/admin/filer/breadcrumbs.html:11 -#: templates/admin/filer/folder/change_form.html:11 -#: templates/image_filer/image_export_form.html:12 -#: templates/image_filer/image_export_form.html:14 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 #, python-format msgid "Go back to '%(folder_name)s' folder" -msgstr "" +msgstr "Go back to '%(folder_name)s' folder" -#: templates/admin/filer/change_form.html:28 -msgid "duplicates" -msgstr "" - -#: templates/admin/filer/delete_confirmation.html:13 -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#: templates/admin/filer/delete_confirmation.html:21 -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#: templates/admin/filer/delete_confirmation.html:29 -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -#: templates/admin/filer/delete_confirmation.html:34 -#: templates/admin/filer/delete_selected_files_confirmation.html:45 -msgid "Yes, I'm sure" -msgstr "" +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "Duplicates" #: templates/admin/filer/delete_selected_files_confirmation.html:11 msgid "" @@ -485,399 +645,636 @@ msgid "" "objects, but your account doesn't have permission to delete the following " "types of objects:" msgstr "" +"Deleting the selected files and/or folders would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" #: templates/admin/filer/delete_selected_files_confirmation.html:19 msgid "" "Deleting the selected files and/or folders would require deleting the " "following protected related objects:" msgstr "" +"Deleting the selected files and/or folders would require deleting the " +"following protected related objects:" #: templates/admin/filer/delete_selected_files_confirmation.html:27 msgid "" "Are you sure you want to delete the selected files and/or folders? All of " "the following objects and their related items will be deleted:" msgstr "" +"Are you sure you want to delete the selected files and/or folders? All of " +"the following objects and their related items will be deleted:" -#: templates/admin/filer/folder/change_form.html:7 -#: templates/admin/filer/folder/change_form.html:8 -#: templates/admin/filer/folder/change_form.html:9 -#: templates/admin/filer/folder/directory_listing.html:74 -#: templates/image_filer/image_export_form.html:7 -#: templates/image_filer/image_export_form.html:8 -#: templates/image_filer/image_export_form.html:16 -msgid "Go back to" -msgstr "" +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "No, take me back" -#: templates/admin/filer/folder/change_form.html:7 -#: templates/image_filer/image_export_form.html:7 -msgid "admin homepage" -msgstr "" +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "Yes, I'm sure" -#: templates/admin/filer/folder/change_form.html:22 -#: templates/admin/filer/image/change_form.html:9 +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 msgid "History" -msgstr "" +msgstr "History" +#: templates/admin/filer/file/change_form.html:37 #: templates/admin/filer/folder/change_form.html:23 -#: templates/admin/filer/image/change_form.html:10 +#: templates/admin/filer/image/change_form.html:37 msgid "View on site" -msgstr "" +msgstr "View on site" -#: templates/admin/filer/folder/change_form.html:35 -#: templates/admin/filer/folder/directory_listing.html:75 -#: templates/admin/filer/folder/directory_listing.html:85 -#: templates/admin/filer/folder/directory_table.html:23 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "Go back to" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "admin homepage" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 msgid "Folder Icon" -msgstr "" +msgstr "Folder Icon" -#: templates/admin/filer/folder/choose_copy_destination.html:12 +#: templates/admin/filer/folder/choose_copy_destination.html:23 msgid "" "Your account doesn't have permissions to copy all of the selected files and/" "or folders." msgstr "" +"Your account doesn't have permissions to copy all of the selected files and/" +"or folders." -#: templates/admin/filer/folder/choose_copy_destination.html:15 -#: templates/admin/filer/folder/choose_move_destination.html:15 +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "Take me back" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 msgid "There are no destination folders available." -msgstr "" +msgstr "There are no destination folders available." -#: templates/admin/filer/folder/choose_copy_destination.html:18 +#: templates/admin/filer/folder/choose_copy_destination.html:35 msgid "There are no files and/or folders available to copy." -msgstr "" +msgstr "There are no files and/or folders available to copy." -#: templates/admin/filer/folder/choose_copy_destination.html:20 +#: templates/admin/filer/folder/choose_copy_destination.html:40 msgid "" "The following files and/or folders will be copied to a destination folder " "(retaining their tree structure):" msgstr "" +"The following files and/or folders will be copied to a destination folder " +"(retaining their tree structure):" -#: templates/admin/filer/folder/choose_copy_destination.html:32 -#: templates/admin/filer/folder/choose_move_destination.html:32 +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 msgid "Destination folder:" -msgstr "" +msgstr "Destination folder:" -#: templates/admin/filer/folder/choose_copy_destination.html:39 +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 msgid "Copy" -msgstr "" +msgstr "Copy" + +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "It is not allowed to copy files into same folder" -#: templates/admin/filer/folder/choose_images_resize_options.html:12 +#: templates/admin/filer/folder/choose_images_resize_options.html:15 msgid "" "Your account doesn't have permissions to resize all of the selected images." msgstr "" +"Your account doesn't have permissions to resize all of the selected images." -#: templates/admin/filer/folder/choose_images_resize_options.html:15 +#: templates/admin/filer/folder/choose_images_resize_options.html:18 msgid "There are no images available to resize." -msgstr "" +msgstr "There are no images available to resize." -#: templates/admin/filer/folder/choose_images_resize_options.html:17 +#: templates/admin/filer/folder/choose_images_resize_options.html:20 msgid "The following images will be resized:" -msgstr "" - -#: templates/admin/filer/folder/choose_images_resize_options.html:30 -msgid "Choose an existing thumbnail option or enter resize parameters:" -msgstr "" +msgstr "The following images will be resized:" #: templates/admin/filer/folder/choose_images_resize_options.html:32 -msgid "Choose resize parameters:" -msgstr "" +msgid "Choose an existing thumbnail option or enter resize parameters:" +msgstr "Choose an existing thumbnail option or enter resize parameters:" -#: templates/admin/filer/folder/choose_images_resize_options.html:35 +#: templates/admin/filer/folder/choose_images_resize_options.html:36 msgid "" "Warning: Images will be resized in-place and originals will be lost. Maybe " "first make a copy of them to retain the originals." msgstr "" +"Warning: Images will be resized in-place and originals will be lost. Maybe " +"first make a copy of them to retain the originals." -#: templates/admin/filer/folder/choose_images_resize_options.html:36 +#: templates/admin/filer/folder/choose_images_resize_options.html:39 msgid "Resize" -msgstr "" +msgstr "Resize" -#: templates/admin/filer/folder/choose_move_destination.html:12 +#: templates/admin/filer/folder/choose_move_destination.html:35 msgid "" "Your account doesn't have permissions to move all of the selected files and/" "or folders." msgstr "" +"Your account doesn't have permissions to move all of the selected files and/" +"or folders." -#: templates/admin/filer/folder/choose_move_destination.html:18 +#: templates/admin/filer/folder/choose_move_destination.html:47 msgid "There are no files and/or folders available to move." -msgstr "" +msgstr "There are no files and/or folders available to move." -#: templates/admin/filer/folder/choose_move_destination.html:20 +#: templates/admin/filer/folder/choose_move_destination.html:52 msgid "" "The following files and/or folders will be moved to a destination folder " "(retaining their tree structure):" msgstr "" +"The following files and/or folders will be moved to a destination folder " +"(retaining their tree structure):" -#: templates/admin/filer/folder/choose_move_destination.html:38 +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 msgid "Move" -msgstr "" +msgstr "Move" + +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "It is not allowed to move files into same folder" -#: templates/admin/filer/folder/choose_rename_format.html:12 +#: templates/admin/filer/folder/choose_rename_format.html:15 msgid "" "Your account doesn't have permissions to rename all of the selected files." msgstr "" +"Your account doesn't have permissions to rename all of the selected files." -#: templates/admin/filer/folder/choose_rename_format.html:15 +#: templates/admin/filer/folder/choose_rename_format.html:18 msgid "There are no files available to rename." -msgstr "" +msgstr "There are no files available to rename." -#: templates/admin/filer/folder/choose_rename_format.html:17 +#: templates/admin/filer/folder/choose_rename_format.html:20 msgid "" "The following files will be renamed (they will stay in their folders and " "keep original filename, only displayed filename will be changed):" msgstr "" +"The following files will be renamed (they will stay in their folders and " +"keep original filename, only displayed filename will be changed):" -#: templates/admin/filer/folder/choose_rename_format.html:54 +#: templates/admin/filer/folder/choose_rename_format.html:59 msgid "Rename" -msgstr "" +msgstr "Rename" -#: templates/admin/filer/folder/directory_listing.html:66 -msgid "Adds a new Folder" -msgstr "" +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "Go back to the parent folder" -#: templates/admin/filer/folder/directory_listing.html:66 -#: templates/image_filer/include/export_dialog.html:34 -msgid "New Folder" -msgstr "" +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "Change current folder details" -#: templates/admin/filer/folder/directory_listing.html:67 -msgid "upload files" -msgstr "" +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "Change" -#: templates/admin/filer/folder/directory_listing.html:67 -msgid "Upload" -msgstr "" +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "Click here to run search for entered phrase" -#: templates/admin/filer/folder/directory_listing.html:74 -msgid "Go back to the parent folder" -msgstr "" +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "Search" -#: templates/admin/filer/folder/directory_listing.html:76 -#: templates/admin/filer/folder/directory_table.html:29 -#: templates/admin/filer/tools/search_form.html:18 -#, python-format -msgid "1 folder" -msgid_plural "%(counter)s folders" -msgstr[0] "" -msgstr[1] "" +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "Close" -#: templates/admin/filer/folder/directory_listing.html:76 -#: templates/admin/filer/folder/directory_table.html:29 -#: templates/admin/filer/tools/search_form.html:19 -#, python-format -msgid "1 file" -msgid_plural "%(counter)s files" -msgstr[0] "" -msgstr[1] "" +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "Limit" -#: templates/admin/filer/folder/directory_listing.html:80 -msgid "Change current folder details" -msgstr "" +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "Check it to limit the search to current folder" -#: templates/admin/filer/folder/directory_listing.html:80 -#: templates/admin/filer/folder/directory_table.html:27 -#: templates/admin/filer/folder/directory_table.html:43 -msgid "Change" -msgstr "" +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "Limit the search to current folder" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "Delete" + +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "Adds a new Folder" + +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "New Folder" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "Upload Files" -#: templates/admin/filer/folder/directory_table.html:13 +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "You have to select a folder first" + +#: templates/admin/filer/folder/directory_table_list.html:16 msgid "Name" -msgstr "" +msgstr "Name" -#: templates/admin/filer/folder/directory_table.html:23 -#: templates/admin/filer/folder/directory_table.html:27 -#: templates/admin/filer/folder/directory_table.html:29 +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "Owner" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "Size" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "Action" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 #, python-format msgid "Change '%(item_label)s' folder details" -msgstr "" +msgstr "Change '%(item_label)s' folder details" -#: templates/admin/filer/folder/directory_table.html:30 -#: templates/admin/filer/folder/directory_table.html:45 -msgid "Owner" -msgstr "Uploaded by" +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "%(counter)s folder" +msgstr[1] "%(counter)s folders" -#: templates/admin/filer/folder/directory_table.html:37 +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "%(counter)s file" +msgstr[1] "%(counter)s files" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "Change folder details" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "Remove folder" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 msgid "Select this file" -msgstr "" +msgstr "Select this file" -#: templates/admin/filer/folder/directory_table.html:39 -#: templates/admin/filer/folder/directory_table.html:43 -#: templates/admin/filer/folder/directory_table.html:44 +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 #, python-format msgid "Change '%(item_label)s' details" -msgstr "" +msgstr "Change '%(item_label)s' details" -#: templates/admin/filer/folder/directory_table.html:42 -#, python-format -msgid "Delete '%(item_label)s'" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:42 -msgid "Delete" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:46 +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 msgid "Permissions" -msgstr "" +msgstr "Permissions" -#: templates/admin/filer/folder/directory_table.html:46 +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 msgid "disabled" -msgstr "" +msgstr "disabled" -#: templates/admin/filer/folder/directory_table.html:46 +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 msgid "enabled" -msgstr "" +msgstr "enabled" + +#: templates/admin/filer/folder/directory_table_list.html:144 +#, fuzzy +#| msgid "Move selected files to clipboard" +msgid "URL copied to clipboard" +msgstr "Move selected files to clipboard" + +#: templates/admin/filer/folder/directory_table_list.html:147 +#, fuzzy, python-format +#| msgid "Change '%(item_label)s' details" +msgid "Canonical url '%(item_label)s'" +msgstr "Change '%(item_label)s' details" + +#: templates/admin/filer/folder/directory_table_list.html:151 +#, fuzzy, python-format +#| msgid "Change '%(item_label)s' details" +msgid "Download '%(item_label)s'" +msgstr "Change '%(item_label)s' details" + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "Remove file" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "Drop files here or use the \"Upload Files\" button" + +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "Drop your file to upload into:" + +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "Upload" -#: templates/admin/filer/folder/directory_table.html:50 -msgid "Move to clipboard" -msgstr "" +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "cancel" -#: templates/admin/filer/folder/directory_table.html:58 -msgid "there are no files or subfolders" -msgstr "" +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "Upload success!" + +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "Upload canceled!" -#: templates/admin/filer/folder/directory_table.html:65 +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 msgid "previous" -msgstr "" +msgstr "previous" -#: templates/admin/filer/folder/directory_table.html:69 +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 #, python-format -msgid "" -"\n" -" Page %(number)s of %(num_pages)s.\n" -" " -msgstr "" +msgid "Page %(number)s of %(num_pages)s." +msgstr "Page %(number)s of %(num_pages)s." -#: templates/admin/filer/folder/directory_table.html:75 +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 msgid "next" -msgstr "" +msgstr "next" + +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "Select all %(total_count)s" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +#, fuzzy +#| msgid "Select this file" +msgid "Select all" +msgstr "Select this file" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +#, fuzzy +#| msgid "Filer" +msgid "Files" +msgstr "Filer" #: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 msgid "Add new" +msgstr "Add new" + +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" msgstr "" -#: templates/admin/filer/folder/new_folder_form.html:13 +#: templates/admin/filer/folder/new_folder_form.html:15 msgid "Please correct the error below." msgid_plural "Please correct the errors below." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Please correct the error below." +msgstr[1] "Please correct the errors below." -#: templates/admin/filer/folder/new_folder_form.html:28 +#: templates/admin/filer/folder/new_folder_form.html:30 msgid "Save" -msgstr "" +msgstr "Save" -#: templates/admin/filer/image/change_form.html:21 -msgid "Full size preview" +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." msgstr "" -#: templates/admin/filer/tools/search_form.html:8 -#: templates/admin/filer/tools/search_form.html:14 -msgid "Search" +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." msgstr "" -#: templates/admin/filer/tools/search_form.html:13 -msgid "Enter your search phrase here" -msgstr "" +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "Clipboard" -#: templates/admin/filer/tools/search_form.html:14 -msgid "Click here to" -msgstr "" +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "Paste all items here" -#: templates/admin/filer/tools/search_form.html:14 -msgid "run search for entered phrase" -msgstr "" +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "Move all clipboard files to" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "Empty Clipboard" -#: templates/admin/filer/tools/search_form.html:15 -msgid "Check it to" +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "the clipboard is empty" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "upload failed" + +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" msgstr "" -#: templates/admin/filer/tools/search_form.html:15 -#: templates/admin/filer/tools/search_form.html:16 -msgid "limit the search to current folder" +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" msgstr "" -#: templates/admin/filer/tools/search_form.html:18 +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +#, fuzzy +#| msgid "file missing" +msgid "File is missing" +msgstr "file missing" + +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "Type" + +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "File-size" + +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "Modified" + +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "Created" + +#: templates/admin/filer/tools/search_form.html:5 msgid "found" -msgstr "" +msgstr "found" -#: templates/admin/filer/tools/search_form.html:18 +#: templates/admin/filer/tools/search_form.html:5 msgid "and" -msgstr "" +msgstr "and" -#: templates/admin/filer/tools/search_form.html:19 +#: templates/admin/filer/tools/search_form.html:7 msgid "cancel search" -msgstr "" +msgstr "cancel search" -#: templates/admin/filer/tools/upload_button_js.html:24 -#: templates/admin/filer/widgets/admin_file.html:7 -#: templates/admin/filer/widgets/admin_file.html:8 -msgid "file missing" -msgstr "" +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "Clear" -#: templates/admin/filer/tools/clipboard/clipboard.html:7 -msgid "Clipboard" -msgstr "" +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "or drop your file here" -#: templates/admin/filer/tools/clipboard/clipboard.html:19 -msgid "Paste all items here" -msgstr "" +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "no file selected" -#: templates/admin/filer/tools/clipboard/clipboard.html:26 -msgid "discard" -msgstr "" +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "Lookup" -#: templates/admin/filer/tools/clipboard/clipboard.html:26 -msgid "Move all clipboard files to" -msgstr "" +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "Choose File" -#: templates/admin/filer/tools/clipboard/clipboard.html:43 -msgid "the clipboard is empty" -msgstr "" +#: templates/admin/filer/widgets/admin_folder.html:16 +#, fuzzy +#| msgid "Choose File" +msgid "Choose Folder" +msgstr "Choose File" -#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:11 -msgid "upload failed" +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" msgstr "" -#: templates/admin/filer/widgets/admin_file.html:11 -msgid "no file selected" +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" msgstr "" -#: templates/admin/filer/widgets/admin_file.html:14 -#: templates/admin/filer/widgets/admin_file.html:15 -#: templates/admin/filer/widgets/admin_folder.html:7 -#: templates/admin/filer/widgets/admin_folder.html:8 -msgid "Lookup" +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" msgstr "" -#: templates/admin/filer/widgets/admin_file.html:17 -#: templates/admin/filer/widgets/admin_folder.html:10 -msgid "Clear" +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" msgstr "" -#: templates/admin/filer/widgets/admin_folder.html:5 -msgid "none selected" +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" msgstr "" -#: templates/image_filer/folder.html:3 -#, python-format -msgid "Folder '%(folder_label)s' files" -msgstr "" +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." -#: templates/image_filer/folder.html:6 -msgid "File name" -msgstr "" +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" -#: templates/image_filer/image_export_form.html:17 -msgid "export" -msgstr "" +#~ msgid "Open file" +#~ msgstr "Open file" -#: templates/image_filer/image_export_form.html:27 -msgid "download image" -msgstr "" +#~ msgid "Full size preview" +#~ msgstr "Full size preview" -#: templates/image_filer/include/export_dialog.html:13 -msgid "Folder name already taken." -msgstr "" +#~ msgid "Add Description" +#~ msgstr "Add Description" -#: templates/image_filer/include/export_dialog.html:15 -msgid "Submit" -msgstr "" +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" + +#~ msgid "none selected" +#~ msgstr "none selected" + +#~ msgid "Add Folder" +#~ msgstr "Add Folder" + +#, fuzzy +#~| msgid "Subject location" +#~ msgid "Subject Location" +#~ msgstr "Subject location" + +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" +#~ msgstr[1] "15c0f2d28d6dab1af1f6d94906beb627_pl_1" + +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/es/LC_MESSAGES/django.mo b/filer/locale/es/LC_MESSAGES/django.mo new file mode 100644 index 000000000..f11285aee Binary files /dev/null and b/filer/locale/es/LC_MESSAGES/django.mo differ diff --git a/filer/locale/es/LC_MESSAGES/django.po b/filer/locale/es/LC_MESSAGES/django.po new file mode 100644 index 000000000..cc42ddf61 --- /dev/null +++ b/filer/locale/es/LC_MESSAGES/django.po @@ -0,0 +1,1296 @@ +# 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: +# Translators: +# Biel Frontera, 2023 +# Cristian Acevedo , 2016 +# David , 2015 +# Jason Gass Martinez , 2016 +# Luis Zárate , 2019 +# Manuel E. Gutierrez , 2013,2015 +# Manuel E. Gutierrez , 2013 +# Pablo, 2015 +# Pablo, 2015 +msgid "" +msgstr "" +"Project-Id-Version: django Filer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: Biel Frontera, 2023\n" +"Language-Team: Spanish (http://app.transifex.com/divio/django-filer/language/" +"es/)\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? " +"1 : 2;\n" + +#: admin/clipboardadmin.py:17 +msgid "You do not have permission to upload files." +msgstr "No tienes autorización para subir ficheros. " + +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "" +"No se ha encontrado la carpeta donde guardar el fichero. Por favor, refresca " +"la página y vuelve a probar." + +#: admin/clipboardadmin.py:20 +msgid "Can't use this folder, Permission Denied. Please select another folder." +msgstr "" +"No se puede utilizar esta carpeta: permiso denegado. Por favor, selecciona " +"otra carpeta." + +#: admin/fileadmin.py:73 +msgid "Advanced" +msgstr "Avanzado" + +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "URL canónica" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Los elementos deben estar seleccionados para efectuar acciones sobre ellos. " +"Ningún elemento ha sido modificado." + +#: admin/folderadmin.py:434 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] " %(total_count)s seleccionado" +msgstr[1] "Todos los %(total_count)s seleccionados" +msgstr[2] "Todos los %(total_count)s seleccionados" + +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "Listado de directorio para %(folder_name)s" + +#: admin/folderadmin.py:475 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 de %(cnt)s seleccionados" + +#: admin/folderadmin.py:612 +msgid "No action selected." +msgstr "Ninguna acción seleccionada." + +#: admin/folderadmin.py:664 +#, python-format +msgid "Successfully moved %(count)d files to clipboard." +msgstr "%(count)d archivos movidos con éxito al clipboard." + +#: admin/folderadmin.py:669 +msgid "Move selected files to clipboard" +msgstr "Mover archivos selecionados al clipboard." + +#: admin/folderadmin.py:709 +#, python-format +msgid "Successfully disabled permissions for %(count)d files." +msgstr "Permisos para %(count)d ficheros deshabilitados con éxito." + +#: admin/folderadmin.py:711 +#, python-format +msgid "Successfully enabled permissions for %(count)d files." +msgstr "Permisos para %(count)d ficheros habilitados con éxito." + +#: admin/folderadmin.py:719 +msgid "Enable permissions for selected files" +msgstr "Habilitar permisos para los archivos seleccionados." + +#: admin/folderadmin.py:725 +msgid "Disable permissions for selected files" +msgstr "Deshabilitar permisos para los archivos seleccionados." + +#: admin/folderadmin.py:789 +#, python-format +msgid "Successfully deleted %(count)d files and/or folders." +msgstr "Eliminados %(count)d ficheros y/o directorios con éxito." + +#: admin/folderadmin.py:794 +msgid "Cannot delete files and/or folders" +msgstr "No es posible eliminar ficheros y/o directorios" + +#: admin/folderadmin.py:796 +msgid "Are you sure?" +msgstr "¿Estás seguro?" + +#: admin/folderadmin.py:802 +msgid "Delete files and/or folders" +msgstr "Eliminar ficheros y/o directorios" + +#: admin/folderadmin.py:823 +msgid "Delete selected files and/or folders" +msgstr "Eliminar ficheros y/o directorios seleccionados" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "Las carpetas con los nombres %s ya existen en el destino seleccionado" + +#: admin/folderadmin.py:934 +#, python-format +msgid "" +"Successfully moved %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" +"Movidos con éxito %(count)d ficheros y/o directorios al directorio " +"'%(destination)s'." + +#: admin/folderadmin.py:942 admin/folderadmin.py:944 +msgid "Move files and/or folders" +msgstr "Mover ficheros y/o directorios" + +#: admin/folderadmin.py:959 +msgid "Move selected files and/or folders" +msgstr "Mover ficheros y/o directorios seleccionados" + +#: admin/folderadmin.py:1016 +#, python-format +msgid "Successfully renamed %(count)d files." +msgstr "Cambiado el nombre de %(count)d archivos con éxito." + +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 +msgid "Rename files" +msgstr "Cambiar el nombre de los archivos" + +#: admin/folderadmin.py:1137 +#, python-format +msgid "" +"Successfully copied %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" +"Copiados con éxito %(count)d ficheros y/o directorios al directorio " +"'%(destination)s'." + +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 +msgid "Copy files and/or folders" +msgstr "Copiar ficheros y/o directorios" + +#: admin/folderadmin.py:1174 +msgid "Copy selected files and/or folders" +msgstr "Copiar ficheros y/o directorios seleccionados" + +#: admin/folderadmin.py:1279 +#, python-format +msgid "Successfully resized %(count)d images." +msgstr "Cambiado correctamente el tamaño de %(count)d imágenes." + +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 +msgid "Resize images" +msgstr "Cambiar el tamaño de imágenes." + +#: admin/folderadmin.py:1303 +msgid "Resize selected images" +msgstr "Cambiar el tamaño de imágenes seleccionadas." + +#: admin/forms.py:24 +msgid "Suffix which will be appended to filenames of copied files." +msgstr "" +"Sufijo que se añadirá al nombre de los archivos de los archivos copiados." + +#: admin/forms.py:31 +#, python-format +msgid "" +"Suffix should be a valid, simple and lowercase filename part, like " +"\"%(valid)s\"." +msgstr "" +"El sufijo debe ser una parte válida de un nombre de fichero, simple y en " +"minúsculas, como \"%(valid)s\"." + +#: admin/forms.py:52 +#, python-format +msgid "Unknown rename format value key \"%(key)s\"." +msgstr "" +"Formato de cambio de nombre con valor de clave \"%(key)s\" desconocido." + +#: admin/forms.py:54 +#, python-format +msgid "Invalid rename format: %(error)s." +msgstr "Formato de cambio de nombre no válido: %(error)s." + +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 +msgid "thumbnail option" +msgstr "opción de miniatura" + +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 +msgid "width" +msgstr "ancho" + +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 +msgid "height" +msgstr "alto" + +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 +msgid "crop" +msgstr "recortar" + +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 +msgid "upscale" +msgstr "ampliar" + +#: admin/forms.py:79 +msgid "Thumbnail option or resize parameters must be choosen." +msgstr "" +"Se debe elegir una opción de miniatura o unos parámetros para el cambio de " +"tamaño." + +#: admin/imageadmin.py:20 admin/imageadmin.py:112 +msgid "Subject location" +msgstr "Localización del sujeto." + +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "Ubicación del tema principal en la escena. Formato \"x,y\"" + +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "Formato de la ubicación del tema inválido" + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "La ubicación del tema está fuera de la imagen" + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "Tu entrada: \"{subject_location}\"." + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" +msgstr "Quién" + +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" +msgstr "Qué" + +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "Ya existe un directorio con este nombre." + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "Filer" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "Biblioteca multimedia" + +#: models/abstract.py:62 +msgid "default alt text" +msgstr "texto alternativo por defecto" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "leyenda por defecto" + +#: models/abstract.py:76 +msgid "subject location" +msgstr "localización del sujeto" + +#: models/abstract.py:91 +msgid "image" +msgstr "imagen" + +#: models/abstract.py:92 +msgid "images" +msgstr "imágenes" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "" + +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." +msgstr "" + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 +msgid "user" +msgstr "usuario" + +#: models/clipboardmodels.py:17 models/filemodels.py:157 +msgid "files" +msgstr "archivos" + +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 +msgid "clipboard" +msgstr "portapapeles" + +#: models/clipboardmodels.py:25 +msgid "clipboards" +msgstr "portapapeles" + +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 +msgid "file" +msgstr "archivo" + +#: models/clipboardmodels.py:56 +msgid "clipboard item" +msgstr "elemento del portapapeles" + +#: models/clipboardmodels.py:57 +msgid "clipboard items" +msgstr "elementos del portapapeles" + +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "folder" +msgstr "carpeta" + +#: models/filemodels.py:81 +msgid "file size" +msgstr "tamaño del archivo" + +#: models/filemodels.py:87 +msgid "sha1" +msgstr "sha1" + +#: models/filemodels.py:94 +msgid "has all mandatory data" +msgstr "tiene todos los datos obligatorios" + +#: models/filemodels.py:100 +msgid "original filename" +msgstr "nombre del archivo original" + +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 +msgid "name" +msgstr "nombre" + +#: models/filemodels.py:116 +msgid "description" +msgstr "descripción" + +#: models/filemodels.py:125 models/foldermodels.py:108 +msgid "owner" +msgstr "propietario" + +#: models/filemodels.py:129 models/foldermodels.py:116 +msgid "uploaded at" +msgstr "subido a" + +#: models/filemodels.py:134 models/foldermodels.py:126 +msgid "modified at" +msgstr "modificado el" + +#: models/filemodels.py:140 +msgid "Permissions disabled" +msgstr "Permisos desactivados" + +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "" +"Desactiva cualquier comprobación de permiso para este archivo. El archivo " +"será accesible públicamente para todos." + +#: models/foldermodels.py:94 +msgid "parent" +msgstr "Padre" + +#: models/foldermodels.py:121 +msgid "created at" +msgstr "creado el" + +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Folder" +msgstr "Carpeta" + +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 +msgid "Folders" +msgstr "Carpetas" + +#: models/foldermodels.py:260 +msgid "all items" +msgstr "todos los elementos" + +#: models/foldermodels.py:261 +msgid "this item only" +msgstr "sólo este elemento" + +#: models/foldermodels.py:262 +msgid "this item and all children" +msgstr "este elemento y todos los hijos" + +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "hereda" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "permitir" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "denegar" + +#: models/foldermodels.py:280 +msgid "type" +msgstr "tipo" + +#: models/foldermodels.py:297 +msgid "group" +msgstr "grupo" + +#: models/foldermodels.py:304 +msgid "everybody" +msgstr "todos" + +#: models/foldermodels.py:309 +msgid "can read" +msgstr "puede leer" + +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "puede editar" + +#: models/foldermodels.py:325 +msgid "can add children" +msgstr "puede añadir hijos" + +#: models/foldermodels.py:333 +msgid "folder permission" +msgstr "permiso de la carpeta" + +#: models/foldermodels.py:334 +msgid "folder permissions" +msgstr "permisos de la carpeta" + +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." +msgstr "" +"La carpeta no se puede seleccionar con el tipo \"todos los elementos\"." + +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." +msgstr "" +"La carpeta se tiene que seleccionar cuando el tipo no es \"todos los " +"elementos\"." + +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." +msgstr "Usuario y grupo no se pueden seleccionar a la vez con \"todos\"." + +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." +msgstr "Al menos se debe seleccionar un usuario, un grupo o \"todos\"." + +#: models/foldermodels.py:360 +msgid "All Folders" +msgstr "Todas las carpetas" + +#: models/foldermodels.py:362 +msgid "Logical Path" +msgstr "Path lógico" + +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" +msgstr "Usuario: {user}" + +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" +msgstr "Grupo: {group}" + +#: models/foldermodels.py:375 +msgid "Everybody" +msgstr "Todos" + +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "Editar" + +#: models/foldermodels.py:389 +msgid "Read" +msgstr "Leer" + +#: models/foldermodels.py:390 +msgid "Add children" +msgstr "Añadir hijos" + +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "fecha" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "autor" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "siempre debes dar crédito al autor" + +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "siempre debes publicar los derechos de autor" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "Ancho en pixel." + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "Alto en pixel." + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "Opciones de miniatura" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "Subidas desordenadas" + +#: models/virtualitems.py:73 +msgid "files with missing metadata" +msgstr "archivos con metadatos perdidos" + +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "root" +msgstr "raíz" + +#: settings.py:273 +msgid "Show table view" +msgstr "Muestra la vista de tabla" + +#: settings.py:278 +msgid "Show thumbnail view" +msgstr "Muestra la vista de miniaturas" + +#: templates/admin/filer/actions.html:5 +msgid "Run the selected action" +msgstr "Ejecutar la acción seleccionada" + +#: templates/admin/filer/actions.html:5 +msgid "Go" +msgstr "Continuar" + +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +msgid "Click here to select the objects across all pages" +msgstr "" +"Haz clic aquí para seleccionar los objetos a través de todas las páginas" + +#: templates/admin/filer/actions.html:14 +#, python-format +msgid "Select all %(total_count)s files and/or folders" +msgstr "Seleccionar los %(total_count)s archivos y/o carpetas" + +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 +msgid "Clear selection" +msgstr "Limpiar la selección" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 +msgid "Go back to admin homepage" +msgstr "Volver a la página de inicio de admin" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 +msgid "Home" +msgstr "Inicio" + +#: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 +msgid "Go back to Filer app" +msgstr "Volver a la app Filer" + +#: templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Go back to root folder" +msgstr "Volver a la carpeta raíz" + +#: templates/admin/filer/breadcrumbs.html:8 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 +#, python-format +msgid "Go back to '%(folder_name)s' folder" +msgstr "Volver a la carpeta '%(folder_name)s'" + +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "Duplicados" + +#: templates/admin/filer/delete_selected_files_confirmation.html:11 +msgid "" +"Deleting the selected files and/or folders would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Borrar los archivos y/o carpetas seleccionados borraría los objetos " +"seleccionados, pero tu cuenta no tiene permiso para borrar los siguientes " +"tipos de objetos:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:19 +msgid "" +"Deleting the selected files and/or folders would require deleting the " +"following protected related objects:" +msgstr "" +"Borrar los archivos y/o carpetas requeriría borrar los siguientes objetos " +"relacionados protegidos:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:27 +msgid "" +"Are you sure you want to delete the selected files and/or folders? All of " +"the following objects and their related items will be deleted:" +msgstr "" +"¿Estás seguro de que quieres borrar los archivos y/o carpetas seleccionados? " +"Los siguientes objetos y sus elementos relacionados serán borrados:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "No, ir atrás" + +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "Sí, estoy seguro" + +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 +msgid "History" +msgstr "Histórico" + +#: templates/admin/filer/file/change_form.html:37 +#: templates/admin/filer/folder/change_form.html:23 +#: templates/admin/filer/image/change_form.html:37 +msgid "View on site" +msgstr "Ver en la página" + +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "Volver a" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "página de inicio de la administración" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 +msgid "Folder Icon" +msgstr "Icono de la Carpeta" + +#: templates/admin/filer/folder/choose_copy_destination.html:23 +msgid "" +"Your account doesn't have permissions to copy all of the selected files and/" +"or folders." +msgstr "" +"Tu cuenta no tiene permisos para copiar todos los archivos y/o carpetas " +"seleccionados." + +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "Volver atrás" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 +msgid "There are no destination folders available." +msgstr "No hay carpetas de destino disponibles." + +#: templates/admin/filer/folder/choose_copy_destination.html:35 +msgid "There are no files and/or folders available to copy." +msgstr "No hay archivos y/o carpetas disponibles para copiar." + +#: templates/admin/filer/folder/choose_copy_destination.html:40 +msgid "" +"The following files and/or folders will be copied to a destination folder " +"(retaining their tree structure):" +msgstr "" +"Los siguientes archivos y/o carpetas serán copiados a una carpeta de destino " +"(manteniendo su estructura en árbol):" + +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 +msgid "Destination folder:" +msgstr "Carpeta de destino:" + +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 +msgid "Copy" +msgstr "Copiar" + +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "No está permitido copiar los archivos dentro de la misma carpeta" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 +msgid "" +"Your account doesn't have permissions to resize all of the selected images." +msgstr "" +"Tu cuenta no tiene permisos para cambiar el tamaño de todas las imágenes " +"seleccionadas." + +#: templates/admin/filer/folder/choose_images_resize_options.html:18 +msgid "There are no images available to resize." +msgstr "No hay imágenes disponibles a las que cambiarles el tamaño." + +#: templates/admin/filer/folder/choose_images_resize_options.html:20 +msgid "The following images will be resized:" +msgstr "Se les cambiará el tamaño a las siguientes imágenes:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:32 +msgid "Choose an existing thumbnail option or enter resize parameters:" +msgstr "" +"Elige una opción de miniatura existente o introduce parámetros para el " +"cambio de tamaño:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:36 +msgid "" +"Warning: Images will be resized in-place and originals will be lost. Maybe " +"first make a copy of them to retain the originals." +msgstr "" +"Aviso: se cambiará el tamaño de las imágenes en el mismo sitio y los " +"originales se perderán. Considera realizar una copia de aquellas para " +"conservar los originales." + +#: templates/admin/filer/folder/choose_images_resize_options.html:39 +msgid "Resize" +msgstr "Cambiar de tamaño" + +#: templates/admin/filer/folder/choose_move_destination.html:35 +msgid "" +"Your account doesn't have permissions to move all of the selected files and/" +"or folders." +msgstr "" +"Tu cuenta no tiene permisos para mover todos los archivos y/o carpetas " +"seleccionados." + +#: templates/admin/filer/folder/choose_move_destination.html:47 +msgid "There are no files and/or folders available to move." +msgstr "No hay archivos y/o carpetas disponibles para mover." + +#: templates/admin/filer/folder/choose_move_destination.html:52 +msgid "" +"The following files and/or folders will be moved to a destination folder " +"(retaining their tree structure):" +msgstr "" +"Los siguientes archivos y/o directorios serán movidos a una carpeta de " +"destino (manteniendo su estructura de árbol):" + +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 +msgid "Move" +msgstr "Mover" + +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "No está permitido mover los archivos dentro de la misma carpeta" + +#: templates/admin/filer/folder/choose_rename_format.html:15 +msgid "" +"Your account doesn't have permissions to rename all of the selected files." +msgstr "" +"Tu cuenta no tiene permisos para renombrar todos los objetos seleccionados." + +#: templates/admin/filer/folder/choose_rename_format.html:18 +msgid "There are no files available to rename." +msgstr "No hay archivos disponibles a los que cambiar el nombre." + +#: templates/admin/filer/folder/choose_rename_format.html:20 +msgid "" +"The following files will be renamed (they will stay in their folders and " +"keep original filename, only displayed filename will be changed):" +msgstr "" +"Los siguientes archivos serán renombrados (se quedarán en sus carpetas y " +"mantendrán su nombre original, solo los nombres mostrados serán cambiados):" + +#: templates/admin/filer/folder/choose_rename_format.html:59 +msgid "Rename" +msgstr "Cambiar el nombre" + +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "Volver a la carpeta padre" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "Cambiar los detalles de la carpeta actual" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "Cambiar" + +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "Haz clic para correr la búsqueda del texto ingresado" + +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "Buscar" + +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "Cerrar" + +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "Limite" + +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "Comprueba el límite de búsqueda en la carpeta actual" + +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "Limitar busqueda a la carpeta actual" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "Borrar" + +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "Añade una nueva Carpeta" + +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "Carpeta Nueva" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "Subir archivos." + +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "Tiene que seleccionar primero una carpeta" + +#: templates/admin/filer/folder/directory_table_list.html:16 +msgid "Name" +msgstr "Nombre" + +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "Propietario" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "Tamaño" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "Acción" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 +#, python-format +msgid "Change '%(item_label)s' folder details" +msgstr "Cambiar los detalles de la carpeta '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "%(counter)s carpeta" +msgstr[1] "%(counter)s carpetas" +msgstr[2] "%(counter)s carpetas" + +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "%(counter)s archivo" +msgstr[1] "%(counter)s archivos" +msgstr[2] "%(counter)s archivos" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "Cambiar los detalles de la carpeta" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "Eliminar carpeta" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 +msgid "Select this file" +msgstr "Seleccionar este archivo" + +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 +#, python-format +msgid "Change '%(item_label)s' details" +msgstr "Cambiar los detalles de '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "Permissions" +msgstr "Permisos" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "disabled" +msgstr "desactivado" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "enabled" +msgstr "activado" + +#: templates/admin/filer/folder/directory_table_list.html:144 +#, fuzzy +#| msgid "Move selected files to clipboard" +msgid "URL copied to clipboard" +msgstr "Mover archivos selecionados al clipboard." + +#: templates/admin/filer/folder/directory_table_list.html:147 +#, python-format +msgid "Canonical url '%(item_label)s'" +msgstr "Url canónica '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:151 +#, python-format +msgid "Download '%(item_label)s'" +msgstr "Descargar '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "Eliminar archivo" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "Suelta los archivos aquí o usa el botón \"Subir archivos\"" + +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "Suelta el archivo a subir dentro:" + +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "Subir" + +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "cancelar" + +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "Subida exitosa!" + +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "Subida cancelada!" + +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 +msgid "previous" +msgstr "anterior" + +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 +#, python-format +msgid "Page %(number)s of %(num_pages)s." +msgstr "Página %(number)s de %(num_pages)s." + +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 +msgid "next" +msgstr "siguiente" + +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "Seleccionar todo %(total_count)s" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +msgid "Select all" +msgstr "Selecciona todas" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +msgid "Files" +msgstr "Ficheros" + +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +msgid "Add new" +msgstr "Añadir nuevo" + +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" +msgstr "Sitio administrativo de Django" + +#: templates/admin/filer/folder/new_folder_form.html:15 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Por favor, corrige el error indicado abajo." +msgstr[1] "Por favor, corrige los errores indicados abajo." +msgstr[2] "Por favor, corrige los errores indicados abajo." + +#: templates/admin/filer/folder/new_folder_form.html:30 +msgid "Save" +msgstr "Guardar" + +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." +msgstr "El navegador no soporta audio." + +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." +msgstr "El navegador no soporta vídeo." + +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "Portapapeles" + +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "Pegar aquí todos los elementos" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "Mover todos los archivos del portapapeles a" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "Portapapeles vacío" + +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "el portapapeles está vacío" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "fallo en la subida" + +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" +msgstr "Descarga" + +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" +msgstr "Expande" + +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +msgid "File is missing" +msgstr "Fichero no encontrado" + +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "Tipo" + +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "Tamaño del archivo" + +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "Modificado" + +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "Creado" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "found" +msgstr "encontrado" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "and" +msgstr "y" + +#: templates/admin/filer/tools/search_form.html:7 +msgid "cancel search" +msgstr "cancelar la búsqueda" + +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "Limpiar" + +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "o suelta aquí tu archivo" + +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "ningún archivo seleccionado" + +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "Buscar" + +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "Selecciona el archivo" + +#: templates/admin/filer/widgets/admin_folder.html:16 +msgid "Choose Folder" +msgstr "Escoge una carpeta" + +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" +msgstr "" +"Fichero \"{file_name}\": carga denegada por políticas de seguridad del sitio " +"web" + +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" +msgstr "" +"Fichero \"{file_name}\": carga del tipo {file_type} denegada por políticas " +"de seguridad del sitio web" + +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" +msgstr "" +"Fichero \"{file_name}\": carga de HTML denegada por políticas de seguridad " +"del sitio web" + +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" +msgstr "" +"Fichero \"{file_name}\": rechazado por posible vulnerabilidad XSS (Cross-" +"site scripting)" + +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" +msgstr "" + +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." + +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" + +#~ msgid "Open file" +#~ msgstr "Open file" + +#~ msgid "Full size preview" +#~ msgstr "Full size preview" + +#~ msgid "Add Description" +#~ msgstr "Add Description" + +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" + +#~ msgid "none selected" +#~ msgstr "none selected" + +#~ msgid "Add Folder" +#~ msgstr "Add Folder" + +#~ msgid "Subject Location" +#~ msgstr "Subject location" + +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" +#~ msgstr[1] "15c0f2d28d6dab1af1f6d94906beb627_pl_1" +#~ msgstr[2] "15c0f2d28d6dab1af1f6d94906beb627_pl_2" + +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/et/LC_MESSAGES/django.mo b/filer/locale/et/LC_MESSAGES/django.mo index 982b54f44..6f688e0c0 100644 Binary files a/filer/locale/et/LC_MESSAGES/django.mo and b/filer/locale/et/LC_MESSAGES/django.mo differ diff --git a/filer/locale/et/LC_MESSAGES/django.po b/filer/locale/et/LC_MESSAGES/django.po index ba48e6a20..44b47474a 100644 --- a/filer/locale/et/LC_MESSAGES/django.po +++ b/filer/locale/et/LC_MESSAGES/django.po @@ -3,483 +3,623 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Translators: +# Translators: +# Johan Viirok, 2022 +# Martin , 2016 +# Rivo Zängov , 2013 msgid "" msgstr "" -"Project-Id-Version: django-filer\n" +"Project-Id-Version: django Filer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-07-13 19:10+0200\n" -"PO-Revision-Date: 2012-09-03 20:11+0100\n" -"Last-Translator: Stefan Foulis \n" -"Language-Team: Estonian (http://www.transifex.com/projects/p/django-filer/" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: Johan Viirok, 2022\n" +"Language-Team: Estonian (http://app.transifex.com/divio/django-filer/" "language/et/)\n" +"Language: et\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: et\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: views.py:103 -msgid "Folder with this name already exists." +#: admin/clipboardadmin.py:17 +msgid "You do not have permission to upload files." msgstr "" -#: admin/fileadmin.py:41 +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "" + +#: admin/clipboardadmin.py:20 +msgid "Can't use this folder, Permission Denied. Please select another folder." +msgstr "" + +#: admin/fileadmin.py:73 msgid "Advanced" msgstr "" -#: admin/folderadmin.py:324 admin/folderadmin.py:427 +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 msgid "" "Items must be selected in order to perform actions on them. No items have " "been changed." msgstr "" -#: admin/folderadmin.py:344 +#: admin/folderadmin.py:434 #, python-format msgid "%(total_count)s selected" msgid_plural "All %(total_count)s selected" msgstr[0] "" msgstr[1] "" -#: admin/folderadmin.py:377 +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "" + +#: admin/folderadmin.py:475 #, python-format msgid "0 of %(cnt)s selected" msgstr "" -#: admin/folderadmin.py:456 +#: admin/folderadmin.py:612 msgid "No action selected." -msgstr "" +msgstr "Ühtegi tegevust pole valitud." -#: admin/folderadmin.py:497 +#: admin/folderadmin.py:664 #, python-format msgid "Successfully moved %(count)d files to clipboard." msgstr "" -#: admin/folderadmin.py:503 +#: admin/folderadmin.py:669 msgid "Move selected files to clipboard" msgstr "" -#: admin/folderadmin.py:537 +#: admin/folderadmin.py:709 #, python-format msgid "Successfully disabled permissions for %(count)d files." msgstr "" -#: admin/folderadmin.py:541 +#: admin/folderadmin.py:711 #, python-format msgid "Successfully enabled permissions for %(count)d files." msgstr "" -#: admin/folderadmin.py:550 +#: admin/folderadmin.py:719 msgid "Enable permissions for selected files" msgstr "" -#: admin/folderadmin.py:555 +#: admin/folderadmin.py:725 msgid "Disable permissions for selected files" msgstr "" -#: admin/folderadmin.py:623 +#: admin/folderadmin.py:789 #, python-format msgid "Successfully deleted %(count)d files and/or folders." msgstr "" -#: admin/folderadmin.py:630 +#: admin/folderadmin.py:794 msgid "Cannot delete files and/or folders" msgstr "" -#: admin/folderadmin.py:632 +#: admin/folderadmin.py:796 msgid "Are you sure?" -msgstr "" +msgstr "Oled sa kindel?" -#: admin/folderadmin.py:637 +#: admin/folderadmin.py:802 msgid "Delete files and/or folders" -msgstr "" +msgstr "Kustuta failid ja/või kaustad" -#: admin/folderadmin.py:656 +#: admin/folderadmin.py:823 msgid "Delete selected files and/or folders" +msgstr "Kustuta valitud failid ja/või kaustad" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" msgstr "" -#: admin/folderadmin.py:771 +#: admin/folderadmin.py:934 #, python-format msgid "" "Successfully moved %(count)d files and/or folders to folder " "'%(destination)s'." msgstr "" -#: admin/folderadmin.py:778 admin/folderadmin.py:780 +#: admin/folderadmin.py:942 admin/folderadmin.py:944 msgid "Move files and/or folders" msgstr "" -#: admin/folderadmin.py:797 +#: admin/folderadmin.py:959 msgid "Move selected files and/or folders" msgstr "" -#: admin/folderadmin.py:854 +#: admin/folderadmin.py:1016 #, python-format msgid "Successfully renamed %(count)d files." msgstr "" -#: admin/folderadmin.py:862 admin/folderadmin.py:864 admin/folderadmin.py:881 +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 msgid "Rename files" -msgstr "" +msgstr "Nimeta failid ümber" -#: admin/folderadmin.py:975 +#: admin/folderadmin.py:1137 #, python-format msgid "" "Successfully copied %(count)d files and/or folders to folder " "'%(destination)s'." msgstr "" -#: admin/folderadmin.py:989 admin/folderadmin.py:991 +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 msgid "Copy files and/or folders" msgstr "" -#: admin/folderadmin.py:1010 +#: admin/folderadmin.py:1174 msgid "Copy selected files and/or folders" msgstr "" -#: admin/folderadmin.py:1105 +#: admin/folderadmin.py:1279 #, python-format msgid "Successfully resized %(count)d images." msgstr "" -#: admin/folderadmin.py:1113 admin/folderadmin.py:1115 +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 msgid "Resize images" msgstr "" -#: admin/folderadmin.py:1133 +#: admin/folderadmin.py:1303 msgid "Resize selected images" msgstr "" -#: admin/forms.py:26 +#: admin/forms.py:24 msgid "Suffix which will be appended to filenames of copied files." msgstr "" -#: admin/forms.py:33 +#: admin/forms.py:31 #, python-format msgid "" "Suffix should be a valid, simple and lowercase filename part, like " "\"%(valid)s\"." msgstr "" -#: admin/forms.py:54 +#: admin/forms.py:52 #, python-format msgid "Unknown rename format value key \"%(key)s\"." msgstr "" -#: admin/forms.py:56 +#: admin/forms.py:54 #, python-format msgid "Invalid rename format: %(error)s." msgstr "" -#: admin/forms.py:62 +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 msgid "thumbnail option" -msgstr "" +msgstr "pisipildi valikud" -#: admin/forms.py:63 +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 msgid "width" -msgstr "" +msgstr "laius" -#: admin/forms.py:64 +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 msgid "height" -msgstr "" +msgstr "kõrgus" -#: admin/forms.py:65 +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 msgid "crop" -msgstr "" +msgstr "lõika" -#: admin/forms.py:66 +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 msgid "upscale" -msgstr "" +msgstr "suurenda" -#: admin/forms.py:71 +#: admin/forms.py:79 msgid "Thumbnail option or resize parameters must be choosen." msgstr "" -#: admin/forms.py:73 -msgid "Resize parameters must be choosen." +#: admin/imageadmin.py:20 admin/imageadmin.py:112 +msgid "Subject location" msgstr "" -#: admin/imageadmin.py:12 -msgid "Subject location" +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." msgstr "" -#: admin/imageadmin.py:13 -msgid "Location of the main subject of the scene." +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " msgstr "" -#: models/clipboardmodels.py:9 models/foldermodels.py:236 -msgid "user" +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " msgstr "" -#: models/clipboardmodels.py:11 models/filemodels.py:287 -msgid "files" +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " msgstr "" -#: models/clipboardmodels.py:34 models/clipboardmodels.py:40 -msgid "clipboard" +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" msgstr "" -#: models/clipboardmodels.py:35 -msgid "clipboards" +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" msgstr "" -#: models/clipboardmodels.py:39 models/filemodels.py:35 -#: models/filemodels.py:286 -msgid "file" +#: admin/views.py:55 +msgid "Folder with this name already exists." msgstr "" -#: models/clipboardmodels.py:44 -msgid "clipboard item" +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "Filer" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" msgstr "" -#: models/clipboardmodels.py:45 -msgid "clipboard items" +#: models/abstract.py:62 +msgid "default alt text" +msgstr "" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "" + +#: models/abstract.py:76 +msgid "subject location" +msgstr "" + +#: models/abstract.py:91 +msgid "image" +msgstr "pilt" + +#: models/abstract.py:92 +msgid "images" +msgstr "pildid" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "" + +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." msgstr "" -#: models/filemodels.py:33 templates/admin/filer/folder/change_form.html:9 -#: templates/admin/filer/folder/directory_listing.html:74 +#: models/clipboardmodels.py:11 models/foldermodels.py:289 +msgid "user" +msgstr "kasutaja" + +#: models/clipboardmodels.py:17 models/filemodels.py:157 +msgid "files" +msgstr "failid" + +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 +msgid "clipboard" +msgstr "lõikalaud" + +#: models/clipboardmodels.py:25 +msgid "clipboards" +msgstr "lõikelauad" + +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 +msgid "file" +msgstr "fail" + +#: models/clipboardmodels.py:56 +msgid "clipboard item" +msgstr "lõikelaua kirje" + +#: models/clipboardmodels.py:57 +msgid "clipboard items" +msgstr "lõikelaua kirjed" + +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 #: templates/admin/filer/folder/new_folder_form.html:4 -#: templates/admin/filer/tools/clipboard/clipboard.html:26 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 msgid "folder" -msgstr "" +msgstr "kaust" -#: models/filemodels.py:36 +#: models/filemodels.py:81 msgid "file size" -msgstr "" +msgstr "failisuurus" -#: models/filemodels.py:38 +#: models/filemodels.py:87 msgid "sha1" -msgstr "" +msgstr "sha1" -#: models/filemodels.py:40 +#: models/filemodels.py:94 msgid "has all mandatory data" msgstr "" -#: models/filemodels.py:42 +#: models/filemodels.py:100 msgid "original filename" -msgstr "" +msgstr "algne failinimi" -#: models/filemodels.py:44 models/foldermodels.py:99 +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 msgid "name" -msgstr "" +msgstr "nimi" -#: models/filemodels.py:46 +#: models/filemodels.py:116 msgid "description" -msgstr "" +msgstr "kirjeldus" -#: models/filemodels.py:50 +#: models/filemodels.py:125 models/foldermodels.py:108 msgid "owner" -msgstr "" +msgstr "omanik" -#: models/filemodels.py:52 models/foldermodels.py:105 +#: models/filemodels.py:129 models/foldermodels.py:116 msgid "uploaded at" -msgstr "" +msgstr "üles laaditud" -#: models/filemodels.py:53 models/foldermodels.py:108 +#: models/filemodels.py:134 models/foldermodels.py:126 msgid "modified at" -msgstr "" +msgstr "muudetud" -#: models/filemodels.py:57 +#: models/filemodels.py:140 msgid "Permissions disabled" msgstr "" -#: models/filemodels.py:58 -msgid "Disable any permission checking for this " +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "" + +#: models/foldermodels.py:94 +msgid "parent" msgstr "" -#: models/foldermodels.py:107 +#: models/foldermodels.py:121 msgid "created at" -msgstr "" +msgstr "loodud" -#: models/foldermodels.py:211 -#: templates/admin/filer/widgets/admin_folder.html:3 -#: templates/admin/filer/widgets/admin_folder.html:5 +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 msgid "Folder" -msgstr "" +msgstr "Kaust" -#: models/foldermodels.py:212 +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 msgid "Folders" -msgstr "" +msgstr "Kaustad" -#: models/foldermodels.py:227 +#: models/foldermodels.py:260 msgid "all items" -msgstr "" +msgstr "kõik kirjed" -#: models/foldermodels.py:228 +#: models/foldermodels.py:261 msgid "this item only" -msgstr "" +msgstr "ainult see kirje" -#: models/foldermodels.py:229 +#: models/foldermodels.py:262 msgid "this item and all children" +msgstr "see kirje ja kõik alamkirjed" + +#: models/foldermodels.py:266 +msgid "inherit" msgstr "" -#: models/foldermodels.py:233 +#: models/foldermodels.py:267 +msgid "allow" +msgstr "luba" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "keeldu" + +#: models/foldermodels.py:280 msgid "type" -msgstr "" +msgstr "tüüp" -#: models/foldermodels.py:239 +#: models/foldermodels.py:297 msgid "group" -msgstr "" +msgstr "grupp" -#: models/foldermodels.py:240 +#: models/foldermodels.py:304 msgid "everybody" -msgstr "" +msgstr "kõik" + +#: models/foldermodels.py:309 +msgid "can read" +msgstr "saab lugeda" -#: models/foldermodels.py:242 +#: models/foldermodels.py:317 msgid "can edit" +msgstr "saab mutua" + +#: models/foldermodels.py:325 +msgid "can add children" msgstr "" -#: models/foldermodels.py:243 -msgid "can read" +#: models/foldermodels.py:333 +msgid "folder permission" +msgstr "kausta õigus" + +#: models/foldermodels.py:334 +msgid "folder permissions" +msgstr "kausta õigused" + +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." msgstr "" -#: models/foldermodels.py:244 -msgid "can add children" +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." msgstr "" -#: models/foldermodels.py:273 -msgid "folder permission" +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." msgstr "" -#: models/foldermodels.py:274 -msgid "folder permissions" +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." msgstr "" -#: models/imagemodels.py:39 -msgid "date taken" +#: models/foldermodels.py:360 +msgid "All Folders" msgstr "" -#: models/imagemodels.py:42 -msgid "default alt text" +#: models/foldermodels.py:362 +msgid "Logical Path" msgstr "" -#: models/imagemodels.py:43 -msgid "default caption" +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" msgstr "" -#: models/imagemodels.py:45 templates/image_filer/image.html:6 -msgid "author" +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" msgstr "" -#: models/imagemodels.py:47 -msgid "must always publish author credit" +#: models/foldermodels.py:375 +msgid "Everybody" msgstr "" -#: models/imagemodels.py:48 -msgid "must always publish copyright" +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" msgstr "" -#: models/imagemodels.py:50 -msgid "subject location" +#: models/foldermodels.py:389 +msgid "Read" msgstr "" -#: models/imagemodels.py:200 -msgid "image" +#: models/foldermodels.py:390 +msgid "Add children" msgstr "" -#: models/imagemodels.py:201 -msgid "images" +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "autor" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" msgstr "" -#: models/virtualitems.py:45 -#: templates/admin/filer/tools/clipboard/clipboard.html:26 -msgid "unfiled files" +#: models/imagemodels.py:37 +msgid "must always publish copyright" msgstr "" -#: models/virtualitems.py:59 +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "laius pikslites" + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "kõrgus pikslites" + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "" + +#: models/virtualitems.py:73 msgid "files with missing metadata" msgstr "" -#: models/virtualitems.py:73 templates/admin/filer/breadcrumbs.html:6 -#: templates/admin/filer/folder/change_form.html:9 -#: templates/admin/filer/folder/directory_listing.html:74 -#: templates/image_filer/image_export_form.html:10 +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 msgid "root" msgstr "" -#: templates/admin/filer/actions.html:4 +#: settings.py:273 +msgid "Show table view" +msgstr "" + +#: settings.py:278 +msgid "Show thumbnail view" +msgstr "" + +#: templates/admin/filer/actions.html:5 msgid "Run the selected action" msgstr "" -#: templates/admin/filer/actions.html:4 +#: templates/admin/filer/actions.html:5 msgid "Go" -msgstr "" +msgstr "Mine" -#: templates/admin/filer/actions.html:11 +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 msgid "Click here to select the objects across all pages" msgstr "" -#: templates/admin/filer/actions.html:11 +#: templates/admin/filer/actions.html:14 #, python-format msgid "Select all %(total_count)s files and/or folders" msgstr "" -#: templates/admin/filer/actions.html:13 +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 msgid "Clear selection" -msgstr "" +msgstr "Tühista valik" #: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 msgid "Go back to admin homepage" msgstr "" #: templates/admin/filer/breadcrumbs.html:4 -#: templates/admin/filer/folder/change_form.html:7 -#: templates/image_filer/image_export_form.html:7 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 msgid "Home" -msgstr "" +msgstr "Koduleht" #: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 msgid "Go back to Filer app" msgstr "" -#: templates/admin/filer/breadcrumbs.html:5 -#: templates/admin/filer/folder/change_form.html:8 -#: templates/image_filer/image_export_form.html:8 -msgid "Filer" -msgstr "" - #: templates/admin/filer/breadcrumbs.html:6 -#: templates/image_filer/image_export_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:35 msgid "Go back to root folder" -msgstr "" +msgstr "Tagasi peakausta" #: templates/admin/filer/breadcrumbs.html:8 -#: templates/admin/filer/breadcrumbs.html:11 -#: templates/admin/filer/folder/change_form.html:11 -#: templates/image_filer/image_export_form.html:12 -#: templates/image_filer/image_export_form.html:14 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 #, python-format msgid "Go back to '%(folder_name)s' folder" msgstr "" -#: templates/admin/filer/change_form.html:28 -msgid "duplicates" -msgstr "" - -#: templates/admin/filer/delete_confirmation.html:13 -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#: templates/admin/filer/delete_confirmation.html:21 -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#: templates/admin/filer/delete_confirmation.html:29 -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -#: templates/admin/filer/delete_confirmation.html:34 -#: templates/admin/filer/delete_selected_files_confirmation.html:45 -msgid "Yes, I'm sure" -msgstr "" +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "Duplikaadid" #: templates/admin/filer/delete_selected_files_confirmation.html:11 msgid "" @@ -500,386 +640,588 @@ msgid "" "the following objects and their related items will be deleted:" msgstr "" -#: templates/admin/filer/folder/change_form.html:7 -#: templates/admin/filer/folder/change_form.html:8 -#: templates/admin/filer/folder/change_form.html:9 -#: templates/admin/filer/folder/directory_listing.html:74 -#: templates/image_filer/image_export_form.html:7 -#: templates/image_filer/image_export_form.html:8 -#: templates/image_filer/image_export_form.html:16 -msgid "Go back to" -msgstr "" +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "Ei, vii mind tagasi" -#: templates/admin/filer/folder/change_form.html:7 -#: templates/image_filer/image_export_form.html:7 -msgid "admin homepage" -msgstr "" +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "Jah, olen kindel" -#: templates/admin/filer/folder/change_form.html:22 -#: templates/admin/filer/image/change_form.html:9 +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 msgid "History" -msgstr "" +msgstr "Ajalugu" +#: templates/admin/filer/file/change_form.html:37 #: templates/admin/filer/folder/change_form.html:23 -#: templates/admin/filer/image/change_form.html:10 +#: templates/admin/filer/image/change_form.html:37 msgid "View on site" -msgstr "" +msgstr "Vaata saidil" + +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "Mine tagasi" -#: templates/admin/filer/folder/change_form.html:35 -#: templates/admin/filer/folder/directory_listing.html:75 -#: templates/admin/filer/folder/directory_listing.html:85 -#: templates/admin/filer/folder/directory_table.html:23 +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "admini koduleht" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 msgid "Folder Icon" -msgstr "" +msgstr "Kausta ikoon" -#: templates/admin/filer/folder/choose_copy_destination.html:12 +#: templates/admin/filer/folder/choose_copy_destination.html:23 msgid "" "Your account doesn't have permissions to copy all of the selected files and/" "or folders." msgstr "" -#: templates/admin/filer/folder/choose_copy_destination.html:15 -#: templates/admin/filer/folder/choose_move_destination.html:15 +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 msgid "There are no destination folders available." msgstr "" -#: templates/admin/filer/folder/choose_copy_destination.html:18 +#: templates/admin/filer/folder/choose_copy_destination.html:35 msgid "There are no files and/or folders available to copy." msgstr "" -#: templates/admin/filer/folder/choose_copy_destination.html:20 +#: templates/admin/filer/folder/choose_copy_destination.html:40 msgid "" "The following files and/or folders will be copied to a destination folder " "(retaining their tree structure):" msgstr "" -#: templates/admin/filer/folder/choose_copy_destination.html:32 -#: templates/admin/filer/folder/choose_move_destination.html:32 +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 msgid "Destination folder:" msgstr "" -#: templates/admin/filer/folder/choose_copy_destination.html:39 +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 msgid "Copy" +msgstr "Kopeeri" + +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" msgstr "" -#: templates/admin/filer/folder/choose_images_resize_options.html:12 +#: templates/admin/filer/folder/choose_images_resize_options.html:15 msgid "" "Your account doesn't have permissions to resize all of the selected images." msgstr "" -#: templates/admin/filer/folder/choose_images_resize_options.html:15 +#: templates/admin/filer/folder/choose_images_resize_options.html:18 msgid "There are no images available to resize." msgstr "" -#: templates/admin/filer/folder/choose_images_resize_options.html:17 +#: templates/admin/filer/folder/choose_images_resize_options.html:20 msgid "The following images will be resized:" msgstr "" -#: templates/admin/filer/folder/choose_images_resize_options.html:30 -msgid "Choose an existing thumbnail option or enter resize parameters:" -msgstr "" - #: templates/admin/filer/folder/choose_images_resize_options.html:32 -msgid "Choose resize parameters:" +msgid "Choose an existing thumbnail option or enter resize parameters:" msgstr "" -#: templates/admin/filer/folder/choose_images_resize_options.html:35 +#: templates/admin/filer/folder/choose_images_resize_options.html:36 msgid "" "Warning: Images will be resized in-place and originals will be lost. Maybe " "first make a copy of them to retain the originals." msgstr "" -#: templates/admin/filer/folder/choose_images_resize_options.html:36 +#: templates/admin/filer/folder/choose_images_resize_options.html:39 msgid "Resize" -msgstr "" +msgstr "Muuda suurust" -#: templates/admin/filer/folder/choose_move_destination.html:12 +#: templates/admin/filer/folder/choose_move_destination.html:35 msgid "" "Your account doesn't have permissions to move all of the selected files and/" "or folders." msgstr "" -#: templates/admin/filer/folder/choose_move_destination.html:18 +#: templates/admin/filer/folder/choose_move_destination.html:47 msgid "There are no files and/or folders available to move." msgstr "" -#: templates/admin/filer/folder/choose_move_destination.html:20 +#: templates/admin/filer/folder/choose_move_destination.html:52 msgid "" "The following files and/or folders will be moved to a destination folder " "(retaining their tree structure):" msgstr "" -#: templates/admin/filer/folder/choose_move_destination.html:38 +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 msgid "Move" +msgstr "Liiguta" + +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" msgstr "" -#: templates/admin/filer/folder/choose_rename_format.html:12 +#: templates/admin/filer/folder/choose_rename_format.html:15 msgid "" "Your account doesn't have permissions to rename all of the selected files." msgstr "" -#: templates/admin/filer/folder/choose_rename_format.html:15 +#: templates/admin/filer/folder/choose_rename_format.html:18 msgid "There are no files available to rename." msgstr "" -#: templates/admin/filer/folder/choose_rename_format.html:17 +#: templates/admin/filer/folder/choose_rename_format.html:20 msgid "" "The following files will be renamed (they will stay in their folders and " "keep original filename, only displayed filename will be changed):" msgstr "" -#: templates/admin/filer/folder/choose_rename_format.html:54 +#: templates/admin/filer/folder/choose_rename_format.html:59 msgid "Rename" -msgstr "" +msgstr "Nimeta ümber" -#: templates/admin/filer/folder/directory_listing.html:66 -msgid "Adds a new Folder" +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "Mine tagasi peamisesse kausta" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" msgstr "" -#: templates/admin/filer/folder/directory_listing.html:66 -#: templates/image_filer/include/export_dialog.html:34 -msgid "New Folder" +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "Muuda" + +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" msgstr "" -#: templates/admin/filer/folder/directory_listing.html:67 -msgid "upload files" +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "Otsi" + +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "Sulge" + +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" msgstr "" -#: templates/admin/filer/folder/directory_listing.html:67 -msgid "Upload" +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" msgstr "" -#: templates/admin/filer/folder/directory_listing.html:74 -msgid "Go back to the parent folder" +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" msgstr "" -#: templates/admin/filer/folder/directory_listing.html:76 -#: templates/admin/filer/folder/directory_table.html:29 -#: templates/admin/filer/tools/search_form.html:18 -#, python-format -msgid "1 folder" -msgid_plural "%(counter)s folders" -msgstr[0] "" -msgstr[1] "" +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "Kustuta" -#: templates/admin/filer/folder/directory_listing.html:76 -#: templates/admin/filer/folder/directory_table.html:29 -#: templates/admin/filer/tools/search_form.html:19 -#, python-format -msgid "1 file" -msgid_plural "%(counter)s files" -msgstr[0] "" -msgstr[1] "" +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "Lisab uue kausta" -#: templates/admin/filer/folder/directory_listing.html:80 -msgid "Change current folder details" +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "Uus kaust" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" msgstr "" -#: templates/admin/filer/folder/directory_listing.html:80 -#: templates/admin/filer/folder/directory_table.html:27 -#: templates/admin/filer/folder/directory_table.html:43 -msgid "Change" +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" msgstr "" -#: templates/admin/filer/folder/directory_table.html:13 +#: templates/admin/filer/folder/directory_table_list.html:16 msgid "Name" +msgstr "Nimi" + +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "Omanik" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "Suurus" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" msgstr "" -#: templates/admin/filer/folder/directory_table.html:23 -#: templates/admin/filer/folder/directory_table.html:27 -#: templates/admin/filer/folder/directory_table.html:29 +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 #, python-format msgid "Change '%(item_label)s' folder details" msgstr "" -#: templates/admin/filer/folder/directory_table.html:30 -#: templates/admin/filer/folder/directory_table.html:45 -msgid "Owner" +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "%(counter)s kaust" +msgstr[1] "%(counter)s kausta" + +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "%(counter)s fail" +msgstr[1] "%(counter)s faili" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" msgstr "" -#: templates/admin/filer/folder/directory_table.html:37 +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "Eemalda kaust" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 msgid "Select this file" -msgstr "" +msgstr "Vali see fail" -#: templates/admin/filer/folder/directory_table.html:39 -#: templates/admin/filer/folder/directory_table.html:43 -#: templates/admin/filer/folder/directory_table.html:44 +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 #, python-format msgid "Change '%(item_label)s' details" msgstr "" -#: templates/admin/filer/folder/directory_table.html:42 -#, python-format -msgid "Delete '%(item_label)s'" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:42 -msgid "Delete" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:46 +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 msgid "Permissions" -msgstr "" +msgstr "Õigused" -#: templates/admin/filer/folder/directory_table.html:46 +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 msgid "disabled" -msgstr "" +msgstr "välja lülitatud" -#: templates/admin/filer/folder/directory_table.html:46 +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 msgid "enabled" +msgstr "sisse lülitatud" + +#: templates/admin/filer/folder/directory_table_list.html:144 +msgid "URL copied to clipboard" msgstr "" -#: templates/admin/filer/folder/directory_table.html:50 -msgid "Move to clipboard" +#: templates/admin/filer/folder/directory_table_list.html:147 +#, python-format +msgid "Canonical url '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:151 +#, python-format +msgid "Download '%(item_label)s'" +msgstr "Lae alla '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "Eemalda fail" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" msgstr "" -#: templates/admin/filer/folder/directory_table.html:58 -msgid "there are no files or subfolders" +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" msgstr "" -#: templates/admin/filer/folder/directory_table.html:65 +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "Laadi üles" + +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "tühista" + +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "Üleslaadimine õnnestus!" + +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "Üleslaadimine tühistatud!" + +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 msgid "previous" -msgstr "" +msgstr "eelmine" -#: templates/admin/filer/folder/directory_table.html:69 +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 #, python-format -msgid "" -"\n" -" Page %(number)s of %(num_pages)s.\n" -" " -msgstr "" +msgid "Page %(number)s of %(num_pages)s." +msgstr "Lehekülg %(number)s / %(num_pages)s." -#: templates/admin/filer/folder/directory_table.html:75 +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 msgid "next" +msgstr "järgmine" + +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "Vali kõik %(total_count)s" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +msgid "Select all" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +msgid "Files" msgstr "" #: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 msgid "Add new" +msgstr "Lisa uus" + +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" msgstr "" -#: templates/admin/filer/folder/new_folder_form.html:13 +#: templates/admin/filer/folder/new_folder_form.html:15 msgid "Please correct the error below." msgid_plural "Please correct the errors below." msgstr[0] "" msgstr[1] "" -#: templates/admin/filer/folder/new_folder_form.html:28 +#: templates/admin/filer/folder/new_folder_form.html:30 msgid "Save" -msgstr "" +msgstr "Salvesta" -#: templates/admin/filer/image/change_form.html:21 -msgid "Full size preview" +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." msgstr "" -#: templates/admin/filer/tools/search_form.html:8 -#: templates/admin/filer/tools/search_form.html:14 -msgid "Search" +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." msgstr "" -#: templates/admin/filer/tools/search_form.html:13 -msgid "Enter your search phrase here" +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "Lõikelaud" + +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" msgstr "" -#: templates/admin/filer/tools/search_form.html:14 -msgid "Click here to" +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" msgstr "" -#: templates/admin/filer/tools/search_form.html:14 -msgid "run search for entered phrase" +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "Tühjenda lõikelaud" + +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "lõikelaud on tühi" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "üleslaadimine ebaõnnestus" + +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" msgstr "" -#: templates/admin/filer/tools/search_form.html:15 -msgid "Check it to" +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" msgstr "" -#: templates/admin/filer/tools/search_form.html:15 -#: templates/admin/filer/tools/search_form.html:16 -msgid "limit the search to current folder" +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +msgid "File is missing" msgstr "" -#: templates/admin/filer/tools/search_form.html:18 +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "Tüüp" + +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "Faili suurus" + +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "Muudetud" + +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "Loodud" + +#: templates/admin/filer/tools/search_form.html:5 msgid "found" -msgstr "" +msgstr "leitud" -#: templates/admin/filer/tools/search_form.html:18 +#: templates/admin/filer/tools/search_form.html:5 msgid "and" -msgstr "" +msgstr "ja" -#: templates/admin/filer/tools/search_form.html:19 +#: templates/admin/filer/tools/search_form.html:7 msgid "cancel search" -msgstr "" +msgstr "tühista otsing" -#: templates/admin/filer/tools/upload_button_js.html:24 -#: templates/admin/filer/widgets/admin_file.html:7 -#: templates/admin/filer/widgets/admin_file.html:8 -msgid "file missing" -msgstr "" +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "Tühjenda" -#: templates/admin/filer/tools/clipboard/clipboard.html:7 -msgid "Clipboard" -msgstr "" +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "või lohista fail siia" -#: templates/admin/filer/tools/clipboard/clipboard.html:19 -msgid "Paste all items here" -msgstr "" +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "ühtegi faili pole valitud" -#: templates/admin/filer/tools/clipboard/clipboard.html:26 -msgid "discard" +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" msgstr "" -#: templates/admin/filer/tools/clipboard/clipboard.html:26 -msgid "Move all clipboard files to" -msgstr "" +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "Vali fail" -#: templates/admin/filer/tools/clipboard/clipboard.html:43 -msgid "the clipboard is empty" +#: templates/admin/filer/widgets/admin_folder.html:16 +msgid "Choose Folder" msgstr "" -#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:11 -msgid "upload failed" +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" msgstr "" -#: templates/admin/filer/widgets/admin_file.html:11 -msgid "no file selected" +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" msgstr "" -#: templates/admin/filer/widgets/admin_file.html:14 -#: templates/admin/filer/widgets/admin_file.html:15 -#: templates/admin/filer/widgets/admin_folder.html:7 -#: templates/admin/filer/widgets/admin_folder.html:8 -msgid "Lookup" +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" msgstr "" -#: templates/admin/filer/widgets/admin_file.html:17 -#: templates/admin/filer/widgets/admin_folder.html:10 -msgid "Clear" +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" msgstr "" -#: templates/admin/filer/widgets/admin_folder.html:5 -msgid "none selected" +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" msgstr "" -#: templates/image_filer/folder.html:3 -#, python-format -msgid "Folder '%(folder_label)s' files" -msgstr "" +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." -#: templates/image_filer/folder.html:6 -msgid "File name" -msgstr "" +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" -#: templates/image_filer/image_export_form.html:17 -msgid "export" -msgstr "" +#~ msgid "Open file" +#~ msgstr "Open file" -#: templates/image_filer/image_export_form.html:27 -msgid "download image" -msgstr "" +#~ msgid "Full size preview" +#~ msgstr "Full size preview" -#: templates/image_filer/include/export_dialog.html:13 -msgid "Folder name already taken." -msgstr "" +#~ msgid "Add Description" +#~ msgstr "Add Description" -#: templates/image_filer/include/export_dialog.html:15 -msgid "Submit" -msgstr "" +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" + +#~ msgid "none selected" +#~ msgstr "none selected" + +#~ msgid "Add Folder" +#~ msgstr "Add Folder" + +#~ msgid "Subject Location" +#~ msgstr "Subject location" + +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" +#~ msgstr[1] "15c0f2d28d6dab1af1f6d94906beb627_pl_1" + +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/eu/LC_MESSAGES/django.mo b/filer/locale/eu/LC_MESSAGES/django.mo new file mode 100644 index 000000000..0c1dfafb6 Binary files /dev/null and b/filer/locale/eu/LC_MESSAGES/django.mo differ diff --git a/filer/locale/eu/LC_MESSAGES/django.po b/filer/locale/eu/LC_MESSAGES/django.po new file mode 100644 index 000000000..a28a55d23 --- /dev/null +++ b/filer/locale/eu/LC_MESSAGES/django.po @@ -0,0 +1,1241 @@ +# 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: +# Translators: +# Ales Zabala Alava , 2013 +msgid "" +msgstr "" +"Project-Id-Version: django Filer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: Ales Zabala Alava , 2013\n" +"Language-Team: Basque (http://app.transifex.com/divio/django-filer/language/" +"eu/)\n" +"Language: eu\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: admin/clipboardadmin.py:17 +msgid "You do not have permission to upload files." +msgstr "" + +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "" + +#: admin/clipboardadmin.py:20 +msgid "Can't use this folder, Permission Denied. Please select another folder." +msgstr "" + +#: admin/fileadmin.py:73 +msgid "Advanced" +msgstr "Aurreratua" + +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Elementuak hautatu behar dira beraiekin zeozer egiteko. Ez da elementurik " +"aldatu." + +#: admin/folderadmin.py:434 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "bat haututa" +msgstr[1] "%(total_count)s hautatuta" + +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "" + +#: admin/folderadmin.py:475 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "%(cnt)s-(e)tik 0 hautatuta" + +#: admin/folderadmin.py:612 +msgid "No action selected." +msgstr "Ez da ekintzarik hautatu" + +#: admin/folderadmin.py:664 +#, python-format +msgid "Successfully moved %(count)d files to clipboard." +msgstr "%(count)d fitxategi arbelera mugituta." + +#: admin/folderadmin.py:669 +msgid "Move selected files to clipboard" +msgstr "Hautatutako fitxategiak arbelara mugitu" + +#: admin/folderadmin.py:709 +#, python-format +msgid "Successfully disabled permissions for %(count)d files." +msgstr "%(count)d fitxategientzako baimenak ezgaituta." + +#: admin/folderadmin.py:711 +#, python-format +msgid "Successfully enabled permissions for %(count)d files." +msgstr "%(count)d fitxategientzako baimenak gaituta." + +#: admin/folderadmin.py:719 +msgid "Enable permissions for selected files" +msgstr "Hautatutako fitxategientzako baimenak gaitu" + +#: admin/folderadmin.py:725 +msgid "Disable permissions for selected files" +msgstr "Hautatutako fitxategientzako baimenak ezgaitu" + +#: admin/folderadmin.py:789 +#, python-format +msgid "Successfully deleted %(count)d files and/or folders." +msgstr "%(count)d fitxategi eta/edo karpeta ezabatuta." + +#: admin/folderadmin.py:794 +msgid "Cannot delete files and/or folders" +msgstr "Ezin dira fitxategia eta/edo karpetak ezabatu" + +#: admin/folderadmin.py:796 +msgid "Are you sure?" +msgstr "Ziur zaude?" + +#: admin/folderadmin.py:802 +msgid "Delete files and/or folders" +msgstr "Ezabatu fitxategi eta/edo karpetak" + +#: admin/folderadmin.py:823 +msgid "Delete selected files and/or folders" +msgstr "Ezabatu hautatutako fitxategi eta/edo karpetak" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "" + +#: admin/folderadmin.py:934 +#, python-format +msgid "" +"Successfully moved %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" +"%(count)d fitxategi eta/edo karpeta '%(destination)s' karpetara mugituta." + +#: admin/folderadmin.py:942 admin/folderadmin.py:944 +msgid "Move files and/or folders" +msgstr "Fitxategi eta/edo karpetak mugitu" + +#: admin/folderadmin.py:959 +msgid "Move selected files and/or folders" +msgstr "Hautatutako fitxategi eta/edo karpetak mugitu" + +#: admin/folderadmin.py:1016 +#, python-format +msgid "Successfully renamed %(count)d files." +msgstr "%(count)d fitxategi berrizendatuta." + +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 +msgid "Rename files" +msgstr "Fitxategiak berrizendatu" + +#: admin/folderadmin.py:1137 +#, python-format +msgid "" +"Successfully copied %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" +"%(count)d fitxategi eta/edo karpeta %(destination)s karpetara kopiatuta." + +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 +msgid "Copy files and/or folders" +msgstr "Fitxategi eta/edo karpetak kopiatu" + +#: admin/folderadmin.py:1174 +msgid "Copy selected files and/or folders" +msgstr "Hautatutako fitxategi eta/edo karpetak kopiatu" + +#: admin/folderadmin.py:1279 +#, python-format +msgid "Successfully resized %(count)d images." +msgstr "%(count)d irudien tamaina aldatuta." + +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 +msgid "Resize images" +msgstr "Irudien tamaina aldatu" + +#: admin/folderadmin.py:1303 +msgid "Resize selected images" +msgstr "Hautatutako irudien tamaina aldatu" + +#: admin/forms.py:24 +msgid "Suffix which will be appended to filenames of copied files." +msgstr "Kopiatutako fitxategiei gehituko zaien atzizkia." + +#: admin/forms.py:31 +#, python-format +msgid "" +"Suffix should be a valid, simple and lowercase filename part, like " +"\"%(valid)s\"." +msgstr "" +"Atzizkia baliozko, sinple eta letra xehetan dagoen fitxategi izen zatia izan " +"beharko luke, \"%(valid)s\" bezala." + +#: admin/forms.py:52 +#, python-format +msgid "Unknown rename format value key \"%(key)s\"." +msgstr "Berrizendatze formatuko gako balio ezezaguna \"%(key)s\"." + +#: admin/forms.py:54 +#, python-format +msgid "Invalid rename format: %(error)s." +msgstr "Berrizendatze formatu okerra: %(error)s." + +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 +msgid "thumbnail option" +msgstr "argazkitxoaren aukerak" + +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 +msgid "width" +msgstr "zabalera" + +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 +msgid "height" +msgstr "altuera" + +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 +msgid "crop" +msgstr "moztu" + +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 +msgid "upscale" +msgstr "handitu" + +#: admin/forms.py:79 +msgid "Thumbnail option or resize parameters must be choosen." +msgstr "" +"Argazkitxo aukerak edo tamaina aldatzeko parametroak zehaztu behar dira." + +#: admin/imageadmin.py:20 admin/imageadmin.py:112 +msgid "Subject location" +msgstr "Subjektuaren kokapena" + +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "" + +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "" + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "" + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "" + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" +msgstr "" + +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" +msgstr "" + +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "Izen honetako karpeta badago." + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "Filer" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "" + +#: models/abstract.py:62 +msgid "default alt text" +msgstr "defektuzko testu alternatiboa" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "defektuzko epigrafea" + +#: models/abstract.py:76 +msgid "subject location" +msgstr "subjektuaren kokapena" + +#: models/abstract.py:91 +msgid "image" +msgstr "irudia" + +#: models/abstract.py:92 +msgid "images" +msgstr "irudiak" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "" + +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." +msgstr "" + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 +msgid "user" +msgstr "erabiltzailea" + +#: models/clipboardmodels.py:17 models/filemodels.py:157 +msgid "files" +msgstr "fitxategiak" + +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 +msgid "clipboard" +msgstr "arbela" + +#: models/clipboardmodels.py:25 +msgid "clipboards" +msgstr "arbelak" + +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 +msgid "file" +msgstr "fitxategia" + +#: models/clipboardmodels.py:56 +msgid "clipboard item" +msgstr "arbeleko elementua" + +#: models/clipboardmodels.py:57 +msgid "clipboard items" +msgstr "arbeleko elementuak" + +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "folder" +msgstr "karpeta" + +#: models/filemodels.py:81 +msgid "file size" +msgstr "fitxategi tamaina" + +#: models/filemodels.py:87 +msgid "sha1" +msgstr "sha1" + +#: models/filemodels.py:94 +msgid "has all mandatory data" +msgstr "beharrezko datu guztiak ditu" + +#: models/filemodels.py:100 +msgid "original filename" +msgstr "jatorrizko fitxategi izena" + +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 +msgid "name" +msgstr "izena" + +#: models/filemodels.py:116 +msgid "description" +msgstr "deskribapena" + +#: models/filemodels.py:125 models/foldermodels.py:108 +msgid "owner" +msgstr "jaea" + +#: models/filemodels.py:129 models/foldermodels.py:116 +msgid "uploaded at" +msgstr "noiz igota" + +#: models/filemodels.py:134 models/foldermodels.py:126 +msgid "modified at" +msgstr "noiz aldatua" + +#: models/filemodels.py:140 +msgid "Permissions disabled" +msgstr "Baimenak ezgaituta" + +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "" + +#: models/foldermodels.py:94 +msgid "parent" +msgstr "" + +#: models/foldermodels.py:121 +msgid "created at" +msgstr "noiz sortua" + +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Folder" +msgstr "Karpeta" + +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 +msgid "Folders" +msgstr "Karpetak" + +#: models/foldermodels.py:260 +msgid "all items" +msgstr "elementu guztiak" + +#: models/foldermodels.py:261 +msgid "this item only" +msgstr "elementu hau bakarrik" + +#: models/foldermodels.py:262 +msgid "this item and all children" +msgstr "elementu hau eta bere semeak" + +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "" + +#: models/foldermodels.py:280 +msgid "type" +msgstr "mota" + +#: models/foldermodels.py:297 +msgid "group" +msgstr "taldea" + +#: models/foldermodels.py:304 +msgid "everybody" +msgstr "edonor" + +#: models/foldermodels.py:309 +msgid "can read" +msgstr "irakurri dezake" + +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "editatu dezake" + +#: models/foldermodels.py:325 +msgid "can add children" +msgstr "semeak gehitu ditzake" + +#: models/foldermodels.py:333 +msgid "folder permission" +msgstr "karpeta baimena" + +#: models/foldermodels.py:334 +msgid "folder permissions" +msgstr "karpeta baimenak" + +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." +msgstr "" + +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." +msgstr "" + +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." +msgstr "" + +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." +msgstr "" + +#: models/foldermodels.py:360 +msgid "All Folders" +msgstr "" + +#: models/foldermodels.py:362 +msgid "Logical Path" +msgstr "" + +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" +msgstr "" + +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" +msgstr "" + +#: models/foldermodels.py:375 +msgid "Everybody" +msgstr "" + +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "" + +#: models/foldermodels.py:389 +msgid "Read" +msgstr "" + +#: models/foldermodels.py:390 +msgid "Add children" +msgstr "" + +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "sortze data" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "egilea" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "egilearen kredituak beti argitaratu behar dira" + +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "copyright-a beti argitaratu behar da" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "" + +#: models/virtualitems.py:73 +msgid "files with missing metadata" +msgstr "metadatuak faltan dituzten fitxategiak" + +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "root" +msgstr "erroa" + +#: settings.py:273 +msgid "Show table view" +msgstr "" + +#: settings.py:278 +msgid "Show thumbnail view" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Run the selected action" +msgstr "Hautatutako ekintza abiarazi" + +#: templates/admin/filer/actions.html:5 +msgid "Go" +msgstr "Joan" + +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +msgid "Click here to select the objects across all pages" +msgstr "Hemen klikatu orri guztietako objektuak hautatzeko" + +#: templates/admin/filer/actions.html:14 +#, python-format +msgid "Select all %(total_count)s files and/or folders" +msgstr "Hautatu %(total_count)s fitxategi eta/edo karpeta guztiak" + +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 +msgid "Clear selection" +msgstr "Hautapena hustu" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 +msgid "Go back to admin homepage" +msgstr "Kudeaketa hasierara itzuli" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 +msgid "Home" +msgstr "Etxea" + +#: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 +msgid "Go back to Filer app" +msgstr "Filer aplikaziora itzuli" + +#: templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Go back to root folder" +msgstr "Erro karpetara itzuli" + +#: templates/admin/filer/breadcrumbs.html:8 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 +#, python-format +msgid "Go back to '%(folder_name)s' folder" +msgstr "'%(folder_name)s karpetara itzuli'" + +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:11 +msgid "" +"Deleting the selected files and/or folders would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:19 +msgid "" +"Deleting the selected files and/or folders would require deleting the " +"following protected related objects:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:27 +msgid "" +"Are you sure you want to delete the selected files and/or folders? All of " +"the following objects and their related items will be deleted:" +msgstr "" +"Ziur hautatutako fitxategi eta/edo karpetak ezabatu nahi dituzula? Ondoko " +"objektu eta erlazionatutako elementu guztiak ezabatuko lirateke:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "" + +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 +msgid "History" +msgstr "Aurrekoak" + +#: templates/admin/filer/file/change_form.html:37 +#: templates/admin/filer/folder/change_form.html:23 +#: templates/admin/filer/image/change_form.html:37 +msgid "View on site" +msgstr "Webgunean ikusi" + +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "Itzuli hona:" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "kudeaketa hasiera" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 +msgid "Folder Icon" +msgstr "Karpeta ikonoa" + +#: templates/admin/filer/folder/choose_copy_destination.html:23 +msgid "" +"Your account doesn't have permissions to copy all of the selected files and/" +"or folders." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 +msgid "There are no destination folders available." +msgstr "Ez dago helburuko karpetarik eskuragarri." + +#: templates/admin/filer/folder/choose_copy_destination.html:35 +msgid "There are no files and/or folders available to copy." +msgstr "Ez dago kopiatu daitekeen fitxategi eta/edo karpetarik." + +#: templates/admin/filer/folder/choose_copy_destination.html:40 +msgid "" +"The following files and/or folders will be copied to a destination folder " +"(retaining their tree structure):" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 +msgid "Destination folder:" +msgstr "Helburuko karpeta:" + +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 +msgid "Copy" +msgstr "Kopiatu" + +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 +msgid "" +"Your account doesn't have permissions to resize all of the selected images." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:18 +msgid "There are no images available to resize." +msgstr "Ez dago tamaina aldatu dezakeen irudirik." + +#: templates/admin/filer/folder/choose_images_resize_options.html:20 +msgid "The following images will be resized:" +msgstr "Ondoko irudien tamaina aldatuko da:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:32 +msgid "Choose an existing thumbnail option or enter resize parameters:" +msgstr "" +"Argazkitxo aukera bat hautatu edo tamaina aldatzeko parametroak ezarri:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:36 +msgid "" +"Warning: Images will be resized in-place and originals will be lost. Maybe " +"first make a copy of them to retain the originals." +msgstr "" +"Kontuz: Irudien tamaina aldatzean jatorrizkoak galduko dira. Lehenbizi " +"jatorrizkoen kopia egin zenezake." + +#: templates/admin/filer/folder/choose_images_resize_options.html:39 +msgid "Resize" +msgstr "Tamaina aldatu" + +#: templates/admin/filer/folder/choose_move_destination.html:35 +msgid "" +"Your account doesn't have permissions to move all of the selected files and/" +"or folders." +msgstr "" +"Zure kontuak ez du hautatutako fitxategi eta/edo karpeta guztiak mugitzeko " +"baimenik." + +#: templates/admin/filer/folder/choose_move_destination.html:47 +msgid "There are no files and/or folders available to move." +msgstr "Ez dago mugitu daitekeen fitxategi edo/eta karpetarik." + +#: templates/admin/filer/folder/choose_move_destination.html:52 +msgid "" +"The following files and/or folders will be moved to a destination folder " +"(retaining their tree structure):" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 +msgid "Move" +msgstr "Mugitu" + +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:15 +msgid "" +"Your account doesn't have permissions to rename all of the selected files." +msgstr "Zure kontuak ez du hautatutako fitxategiak berrizendatzeko baimenik." + +#: templates/admin/filer/folder/choose_rename_format.html:18 +msgid "There are no files available to rename." +msgstr "Ez dago berrizendatu daitekeen fitxategirik." + +#: templates/admin/filer/folder/choose_rename_format.html:20 +msgid "" +"The following files will be renamed (they will stay in their folders and " +"keep original filename, only displayed filename will be changed):" +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:59 +msgid "Rename" +msgstr "Berrizendatu" + +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "Karpeta gurasora joan" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "Uneko karpetaren xehetasunak aldatu" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "Aldatu" + +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "Bilatu" + +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "Ezabatu" + +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "Karpeta berri bat sortzen du" + +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "Karpeta berria" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:16 +msgid "Name" +msgstr "Izena" + +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "Jabea" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 +#, python-format +msgid "Change '%(item_label)s' folder details" +msgstr "'%(item_label)s' karpetaren xehetasunak aldatu" + +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "" +msgstr[1] "" + +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "" +msgstr[1] "" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 +msgid "Select this file" +msgstr "Fitxategi hau aukeratu" + +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 +#, python-format +msgid "Change '%(item_label)s' details" +msgstr "'%(item_label)s'(r)en xehetasunak aldatu" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "Permissions" +msgstr "Baimenak" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "disabled" +msgstr "ezgaituta" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "enabled" +msgstr "gaituta" + +#: templates/admin/filer/folder/directory_table_list.html:144 +#, fuzzy +#| msgid "Move selected files to clipboard" +msgid "URL copied to clipboard" +msgstr "Hautatutako fitxategiak arbelara mugitu" + +#: templates/admin/filer/folder/directory_table_list.html:147 +#, python-format +msgid "Canonical url '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:151 +#, python-format +msgid "Download '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "Igo" + +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 +msgid "previous" +msgstr "aurrekoa" + +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 +#, python-format +msgid "Page %(number)s of %(num_pages)s." +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 +msgid "next" +msgstr "hurrengoa" + +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +msgid "Select all" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +msgid "Files" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +msgid "Add new" +msgstr "Berria gehitu" + +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:15 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Zuzendu azpiko errorea mesedez." +msgstr[1] "Zuzendu azpiko erroreak mesedez." + +#: templates/admin/filer/folder/new_folder_form.html:30 +msgid "Save" +msgstr "Gorde" + +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "Arbela" + +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "Elementu guztiak hemen itsatsi" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "Arbeleko fitxategi guztiak hona mugitu:" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "arbela hutsik dago" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "igotzean errorea" + +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +msgid "File is missing" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "found" +msgstr "topatuta" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "and" +msgstr "eta" + +#: templates/admin/filer/tools/search_form.html:7 +msgid "cancel search" +msgstr "bilaketa ezeztatu" + +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "Garbitu" + +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "hautatutako fitxategirik ez" + +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "Bilatu" + +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "" + +#: templates/admin/filer/widgets/admin_folder.html:16 +msgid "Choose Folder" +msgstr "" + +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" +msgstr "" + +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" +msgstr "" + +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" +msgstr "" + +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" +msgstr "" + +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" +msgstr "" + +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." + +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" + +#~ msgid "Open file" +#~ msgstr "Open file" + +#~ msgid "Full size preview" +#~ msgstr "Full size preview" + +#~ msgid "Add Description" +#~ msgstr "Add Description" + +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" + +#~ msgid "none selected" +#~ msgstr "none selected" + +#~ msgid "Add Folder" +#~ msgstr "Add Folder" + +#~ msgid "Subject Location" +#~ msgstr "Subject location" + +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" +#~ msgstr[1] "15c0f2d28d6dab1af1f6d94906beb627_pl_1" + +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/fa/LC_MESSAGES/django.mo b/filer/locale/fa/LC_MESSAGES/django.mo new file mode 100644 index 000000000..aed0b0b26 Binary files /dev/null and b/filer/locale/fa/LC_MESSAGES/django.mo differ diff --git a/filer/locale/fa/LC_MESSAGES/django.po b/filer/locale/fa/LC_MESSAGES/django.po new file mode 100644 index 000000000..964b88a0c --- /dev/null +++ b/filer/locale/fa/LC_MESSAGES/django.po @@ -0,0 +1,1045 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Dimacodev Team ddmc.ir , 2025 +# Translators: +# Translators: +# Fariman Ghaedi , 2019 +msgid "" +msgstr "" +"Project-Id-Version: django Filer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: Fariman Ghaedi , 2019\n" +"Language-Team: Persian (http://app.transifex.com/divio/django-filer/language/" +"fa/)\n" +"Language: fa\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: admin/clipboardadmin.py:17 +msgid "You do not have permission to upload files." +msgstr "شما مجوز آپلود فایل ها را ندارید." + +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "پوشه ای برای آپلود یافت نشد. لطفاً صفحه را رفرش کرده و دوباره تلاش کنید" + +#: admin/clipboardadmin.py:20 +msgid "Can't use this folder, Permission Denied. Please select another folder." +msgstr "استفاده از این پوشه امکان پذیر نیست، دسترسی رد شد. لطفاً پوشه دیگری انتخاب کنید." + +#: admin/fileadmin.py:73 +msgid "Advanced" +msgstr "پیشرفته" + +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "آدرس کانونی" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"برای اینکه بتوانید روی آیتم ها اقداماتی انجام دهید ابتدا باید آیتم ها را " +"انتخاب کنید. هیچ آیتمی تغییر نکرد." + +#: admin/folderadmin.py:434 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s انتخاب شده" +msgstr[1] "همه %(total_count)s انتخاب شده" + +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "لیست دایرکتوری برای %(folder_name)s" + +#: admin/folderadmin.py:475 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 از %(cnt)s انتخاب شده" + +#: admin/folderadmin.py:612 +msgid "No action selected." +msgstr "هیچ اقدامی انتخاب نشده است." + +#: admin/folderadmin.py:664 +#, python-format +msgid "Successfully moved %(count)d files to clipboard." +msgstr "%(count)d فایل با موفقیت به کلیپ برد منتقل شد." + +#: admin/folderadmin.py:669 +msgid "Move selected files to clipboard" +msgstr "انتقال فایل های انتخاب شده به کلیپ برد" + +#: admin/folderadmin.py:709 +#, python-format +msgid "Successfully disabled permissions for %(count)d files." +msgstr "مجوزهای %(count)d فایل با موفقیت غیرفعال شد." + +#: admin/folderadmin.py:711 +#, python-format +msgid "Successfully enabled permissions for %(count)d files." +msgstr "مجوزهای %(count)d فایل با موفقیت فعال شد." + +#: admin/folderadmin.py:719 +msgid "Enable permissions for selected files" +msgstr "فعال کردن مجوزها برای فایل های انتخاب شده" + +#: admin/folderadmin.py:725 +msgid "Disable permissions for selected files" +msgstr "غیرفعال کردن مجوزها برای فایل های انتخاب شده" + +#: admin/folderadmin.py:789 +#, python-format +msgid "Successfully deleted %(count)d files and/or folders." +msgstr "%(count)d فایل و/یا پوشه با موفقیت حذف شد." + +#: admin/folderadmin.py:794 +msgid "Cannot delete files and/or folders" +msgstr "امکان حذف فایل ها و/یا پوشه ها وجود ندارد" + +#: admin/folderadmin.py:796 +msgid "Are you sure?" +msgstr "آیا مطمئن هستید؟" + +#: admin/folderadmin.py:802 +msgid "Delete files and/or folders" +msgstr "حذف فایل ها و/یا پوشه ها" + +#: admin/folderadmin.py:823 +msgid "Delete selected files and/or folders" +msgstr "حذف فایل ها و/یا پوشه های انتخاب شده" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "پوشه هایی با نام %s در مقصد انتخاب شده از قبل وجود دارند" + +#: admin/folderadmin.py:934 +#, python-format +msgid "" +"Successfully moved %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "%(count)d فایل و/یا پوشه با موفقیت به پوشه '%(destination)s' منتقل شد." + +#: admin/folderadmin.py:942 admin/folderadmin.py:944 +msgid "Move files and/or folders" +msgstr "انتقال فایل ها و/یا پوشه ها" + +#: admin/folderadmin.py:959 +msgid "Move selected files and/or folders" +msgstr "انتقال فایل ها و/یا پوشه های انتخاب شده" + +#: admin/folderadmin.py:1016 +#, python-format +msgid "Successfully renamed %(count)d files." +msgstr "%(count)d فایل با موفقیت تغییر نام داده شد." + +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 +msgid "Rename files" +msgstr "تغییر نام فایل ها" + +#: admin/folderadmin.py:1137 +#, python-format +msgid "" +"Successfully copied %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "%(count)d فایل و/یا پوشه با موفقیت به پوشه '%(destination)s' کپی شد." + +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 +msgid "Copy files and/or folders" +msgstr "کپی فایل ها و/یا پوشه ها" + +#: admin/folderadmin.py:1174 +msgid "Copy selected files and/or folders" +msgstr "کپی فایل ها و/یا پوشه های انتخاب شده" + +#: admin/folderadmin.py:1279 +#, python-format +msgid "Successfully resized %(count)d images." +msgstr "%(count)d تصویر با موفقیت تغییر اندازه داده شد." + +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 +msgid "Resize images" +msgstr "تغییر اندازه تصاویر" + +#: admin/folderadmin.py:1303 +msgid "Resize selected images" +msgstr "تغییر اندازه تصاویر انتخاب شده" + +#: admin/forms.py:24 +msgid "Suffix which will be appended to filenames of copied files." +msgstr "پسوندی که به نام فایل های کپی شده اضافه خواهد شد." + +#: admin/forms.py:31 +#, python-format +msgid "" +"Suffix should be a valid, simple and lowercase filename part, like " +"\"%(valid)s\"." +msgstr "پسوند باید بخشی معتبر، ساده و با حروف کوچک از نام فایل باشد، مانند \"%(valid)s\"." + +#: admin/forms.py:52 +#, python-format +msgid "Unknown rename format value key \"%(key)s\"." +msgstr "کلید مقدار فرمت تغییر نام ناشناخته \"%(key)s\"." + +#: admin/forms.py:54 +#, python-format +msgid "Invalid rename format: %(error)s." +msgstr "فرمت تغییر نام نامعتبر: %(error)s." + +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 +msgid "thumbnail option" +msgstr "گزینه تصویر بندانگشتی" + +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 +msgid "width" +msgstr "عرض" + +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 +msgid "height" +msgstr "ارتفاع" + +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 +msgid "crop" +msgstr "برش" + +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 +msgid "upscale" +msgstr "بزرگنمایی" + +#: admin/forms.py:79 +msgid "Thumbnail option or resize parameters must be choosen." +msgstr "باید گزینه تصویر بندانگشتی یا پارامترهای تغییر اندازه انتخاب شود." + +#: admin/imageadmin.py:20 admin/imageadmin.py:112 +msgid "Subject location" +msgstr "موقعیت موضوع" + +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "موقعیت موضوع اصلی صحنه. فرمت: \"x,y\"." + +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "فرمت موقعیت موضوع نامعتبر است. " + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "موقعیت موضوع خارج از تصویر است. " + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "ورودی شما: \"{subject_location}\". " + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" +msgstr "چه کسی" + +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" +msgstr "چه چیزی" + +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "پوشه با این نام از قبل وجود دارد." + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "فایلر" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "کتابخانه رسانه" + +#: models/abstract.py:62 +msgid "default alt text" +msgstr "متن جایگزین پیش‌فرض" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "عنوان پیش‌فرض" + +#: models/abstract.py:76 +msgid "subject location" +msgstr "موقعیت موضوع" + +#: models/abstract.py:91 +msgid "image" +msgstr "تصویر" + +#: models/abstract.py:92 +msgid "images" +msgstr "تصاویر" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "" +"فرمت تصویر تشخیص داده نشد یا اندازه تصویر از حد مجاز %(max_pixels)d میلیون پیکسل " +"دو برابر یا بیشتر است. قبل از آپلود مجدد، فرمت فایل را بررسی کنید یا تصویر را " +"به اندازه %(width)d x %(height)d پیکسل یا کمتر تغییر اندازه دهید." + +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." +msgstr "" +"اندازه تصویر (%(pixels)d میلیون پیکسل) از حد مجاز %(max_pixels)d میلیون پیکسل " +"فراتر رفته است. قبل از آپلود مجدد، تصویر را به اندازه %(width)d x %(height)d " +"پیکسل یا کمتر تغییر اندازه دهید." + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 +msgid "user" +msgstr "کاربر" + +#: models/clipboardmodels.py:17 models/filemodels.py:157 +msgid "files" +msgstr "فایل ها" + +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 +msgid "clipboard" +msgstr "کلیپ برد" + +#: models/clipboardmodels.py:25 +msgid "clipboards" +msgstr "کلیپ بردها" + +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 +msgid "file" +msgstr "فایل" + +#: models/clipboardmodels.py:56 +msgid "clipboard item" +msgstr "آیتم کلیپ برد" + +#: models/clipboardmodels.py:57 +msgid "clipboard items" +msgstr "آیتم های کلیپ برد" + +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "folder" +msgstr "پوشه" + +#: models/filemodels.py:81 +msgid "file size" +msgstr "اندازه فایل" + +#: models/filemodels.py:87 +msgid "sha1" +msgstr "sha1" + +#: models/filemodels.py:94 +msgid "has all mandatory data" +msgstr "دارای تمام داده های اجباری است" + +#: models/filemodels.py:100 +msgid "original filename" +msgstr "نام فایل اصلی" + +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 +msgid "name" +msgstr "نام" + +#: models/filemodels.py:116 +msgid "description" +msgstr "توضیحات" + +#: models/filemodels.py:125 models/foldermodels.py:108 +msgid "owner" +msgstr "مالک" + +#: models/filemodels.py:129 models/foldermodels.py:116 +msgid "uploaded at" +msgstr "آپلود شده در" + +#: models/filemodels.py:134 models/foldermodels.py:126 +msgid "modified at" +msgstr "تغییر یافته در" + +#: models/filemodels.py:140 +msgid "Permissions disabled" +msgstr "مجوزها غیرفعال شده" + +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "بررسی هرگونه مجوز برای این فایل را غیرفعال کنید. فایل برای همه به صورت عمومی قابل دسترسی خواهد بود." + +#: models/foldermodels.py:94 +msgid "parent" +msgstr "والد" + +#: models/foldermodels.py:121 +msgid "created at" +msgstr "ایجاد شده در" + +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Folder" +msgstr "پوشه" + +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 +msgid "Folders" +msgstr "پوشه ها" + +#: models/foldermodels.py:260 +msgid "all items" +msgstr "همه آیتم ها" + +#: models/foldermodels.py:261 +msgid "this item only" +msgstr "فقط این آیتم" + +#: models/foldermodels.py:262 +msgid "this item and all children" +msgstr "این آیتم و تمام فرزندان" + +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "به ارث بردن" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "اجازه دادن" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "رد کردن" + +#: models/foldermodels.py:280 +msgid "type" +msgstr "نوع" + +#: models/foldermodels.py:297 +msgid "group" +msgstr "گروه" + +#: models/foldermodels.py:304 +msgid "everybody" +msgstr "همه" + +#: models/foldermodels.py:309 +msgid "can read" +msgstr "می تواند بخواند" + +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "می تواند ویرایش کند" + +#: models/foldermodels.py:325 +msgid "can add children" +msgstr "می تواند فرزند اضافه کند" + +#: models/foldermodels.py:333 +msgid "folder permission" +msgstr "مجوز پوشه" + +#: models/foldermodels.py:334 +msgid "folder permissions" +msgstr "مجوزهای پوشه" + +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." +msgstr "پوشه نمی تواند با نوع \"همه آیتم ها\" انتخاب شود." + +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." +msgstr "هنگامی که نوع \"همه آیتم ها\" نیست، باید پوشه انتخاب شود." + +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." +msgstr "کاربر یا گروه نمی تواند همراه با \"همه\" انتخاب شود." + +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." +msgstr "حداقل یکی از کاربر، گروه یا \"همه\" باید انتخاب شود." + +#: models/foldermodels.py:360 +msgid "All Folders" +msgstr "همه پوشه ها" + +#: models/foldermodels.py:362 +msgid "Logical Path" +msgstr "مسیر منطقی" + +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" +msgstr "کاربر: {user}" + +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" +msgstr "گروه: {group}" + +#: models/foldermodels.py:375 +msgid "Everybody" +msgstr "همه" + +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "ویرایش" + +#: models/foldermodels.py:389 +msgid "Read" +msgstr "خواندن" + +#: models/foldermodels.py:390 +msgid "Add children" +msgstr "افزودن فرزند" + +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "تاریخ گرفته شده" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "نویسنده" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "همیشه باید اعتبار نویسنده منتشر شود" + +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "همیشه باید حق چاپ منتشر شود" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "عرض بر حسب پیکسل." + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "ارتفاع بر حسب پیکسل." + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "گزینه های تصویر بندانگشتی" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "آپلودهای مرتب نشده" + +#: models/virtualitems.py:73 +msgid "files with missing metadata" +msgstr "فایل های با متادیتای از دست رفته" + +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "root" +msgstr "ریشه" + +#: settings.py:273 +msgid "Show table view" +msgstr "نمایش نمای جدولی" + +#: settings.py:278 +msgid "Show thumbnail view" +msgstr "نمایش نمای بندانگشتی" + +#: templates/admin/filer/actions.html:5 +msgid "Run the selected action" +msgstr "اجرای عمل انتخاب شده" + +#: templates/admin/filer/actions.html:5 +msgid "Go" +msgstr "برو" + +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +msgid "Click here to select the objects across all pages" +msgstr "برای انتخاب اشیاء در تمام صفحات اینجا کلیک کنید" + +#: templates/admin/filer/actions.html:14 +#, python-format +msgid "Select all %(total_count)s files and/or folders" +msgstr "انتخاب همه %(total_count)s فایل ها و/یا پوشه ها" + +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 +msgid "Clear selection" +msgstr "پاک کردن انتخاب" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 +msgid "Go back to admin homepage" +msgstr "بازگشت به صفحه اصلی مدیریت" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 +msgid "Home" +msgstr "خانه" + +#: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 +msgid "Go back to Filer app" +msgstr "بازگشت به برنامه فایلر" + +#: templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Go back to root folder" +msgstr "بازگشت به پوشه ریشه" + +#: templates/admin/filer/breadcrumbs.html:8 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 +#, python-format +msgid "Go back to '%(folder_name)s' folder" +msgstr "بازگشت به پوشه '%(folder_name)s'" + +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "تکرارها" + +#: templates/admin/filer/delete_selected_files_confirmation.html:11 +msgid "" +"Deleting the selected files and/or folders would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"حذف فایل ها و/یا پوشه های انتخاب شده منجر به حذف اشیاء مرتبط می شود، اما حساب " +"شما مجوز حذف انواع زیر از اشیاء را ندارد:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:19 +msgid "" +"Deleting the selected files and/or folders would require deleting the " +"following protected related objects:" +msgstr "" +"حذف فایل ها و/یا پوشه های انتخاب شده مستلزم حذف اشیاء محافظت شده مرتبط زیر است:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:27 +msgid "" +"Are you sure you want to delete the selected files and/or folders? All of " +"the following objects and their related items will be deleted:" +msgstr "" +"آیا مطمئن هستید که می خواهید فایل ها و/یا پوشه های انتخاب شده را حذف کنید؟ همه " +"اشیاء زیر و آیتم های مرتبط با آنها حذف خواهند شد:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "خیر، مرا برگردان" + +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "بله، مطمئنم" + +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 +msgid "History" +msgstr "تاریخچه" + +#: templates/admin/filer/file/change_form.html:37 +#: templates/admin/filer/folder/change_form.html:23 +#: templates/admin/filer/image/change_form.html:37 +msgid "View on site" +msgstr "مشاهده در سایت" + +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "بازگشت به" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "صفحه اصلی مدیریت" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 +msgid "Folder Icon" +msgstr "آیکون پوشه" + +#: templates/admin/filer/folder/choose_copy_destination.html:23 +msgid "" +"Your account doesn't have permissions to copy all of the selected files and/" +"or folders." +msgstr "حساب شما مجوز کپی کردن همه فایل ها و/یا پوشه های انتخاب شده را ندارد." + +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "مرا برگردان" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 +msgid "There are no destination folders available." +msgstr "هیچ پوشه مقصدی در دسترس نیست." + +#: templates/admin/filer/folder/choose_copy_destination.html:35 +msgid "There are no files and/or folders available to copy." +msgstr "هیچ فایل و/یا پوشه ای برای کپی کردن در دسترس نیست." + +#: templates/admin/filer/folder/choose_copy_destination.html:40 +msgid "" +"The following files and/or folders will be copied to a destination folder " +"(retaining their tree structure):" +msgstr "فایل ها و/یا پوشه های زیر به یک پوشه مقصد کپی خواهند شد (ساختار درختی آنها حفظ می شود):" + +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 +msgid "Destination folder:" +msgstr "پوشه مقصد:" + +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 +msgid "Copy" +msgstr "کپی" + +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "کپی کردن فایل ها به همان پوشه مجاز نیست" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 +msgid "" +"Your account doesn't have permissions to resize all of the selected images." +msgstr "حساب شما مجوز تغییر اندازه همه تصاویر انتخاب شده را ندارد." + +#: templates/admin/filer/folder/choose_images_resize_options.html:18 +msgid "There are no images available to resize." +msgstr "هیچ تصویری برای تغییر اندازه در دسترس نیست." + +#: templates/admin/filer/folder/choose_images_resize_options.html:20 +msgid "The following images will be resized:" +msgstr "تصاویر زیر تغییر اندازه داده خواهند شد:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:32 +msgid "Choose an existing thumbnail option or enter resize parameters:" +msgstr "یک گزینه تصویر بندانگشتی موجود را انتخاب کنید یا پارامترهای تغییر اندازه را وارد کنید:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:36 +msgid "" +"Warning: Images will be resized in-place and originals will be lost. Maybe " +"first make a copy of them to retain the originals." +msgstr "" +"هشدار: تصاویر در جای خود تغییر اندازه داده می شوند و نسخه های اصلی از بین می " +"روند. شاید بهتر است ابتدا یک کپی از آنها تهیه کنید تا نسخه های اصلی حفظ شوند." + +#: templates/admin/filer/folder/choose_images_resize_options.html:39 +msgid "Resize" +msgstr "تغییر اندازه" + +#: templates/admin/filer/folder/choose_move_destination.html:35 +msgid "" +"Your account doesn't have permissions to move all of the selected files and/" +"or folders." +msgstr "حساب شما مجوز جابجایی همه فایل ها و/یا پوشه های انتخاب شده را ندارد." + +#: templates/admin/filer/folder/choose_move_destination.html:47 +msgid "There are no files and/or folders available to move." +msgstr "هیچ فایل و/یا پوشه ای برای جابجایی در دسترس نیست." + +#: templates/admin/filer/folder/choose_move_destination.html:52 +msgid "" +"The following files and/or folders will be moved to a destination folder " +"(retaining their tree structure):" +msgstr "فایل ها و/یا پوشه های زیر به یک پوشه مقصد منتقل خواهند شد (ساختار درختی آنها حفظ می شود):" + +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 +msgid "Move" +msgstr "انتقال" + +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "انتقال فایل ها به همان پوشه مجاز نیست" + +#: templates/admin/filer/folder/choose_rename_format.html:15 +msgid "" +"Your account doesn't have permissions to rename all of the selected files." +msgstr "حساب شما مجوز تغییر نام همه فایل های انتخاب شده را ندارد." + +#: templates/admin/filer/folder/choose_rename_format.html:18 +msgid "There are no files available to rename." +msgstr "هیچ فایلی برای تغییر نام در دسترس نیست." + +#: templates/admin/filer/folder/choose_rename_format.html:20 +msgid "" +"The following files will be renamed (they will stay in their folders and " +"keep original filename, only displayed filename will be changed):" +msgstr "فایل های زیر تغییر نام داده خواهند شد (در پوشه های خود باقی می مانند و نام فایل اصلی حفظ می شود، فقط نام نمایش داده شده تغییر می کند):" + +#: templates/admin/filer/folder/choose_rename_format.html:59 +msgid "Rename" +msgstr "تغییر نام" + +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "بازگشت به پوشه والد" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "تغییر جزئیات پوشه فعلی" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "تغییر" + +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "برای جستجوی عبارت وارد شده اینجا کلیک کنید" + +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "جستجو" + +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "بستن" + +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "محدودیت" + +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "برای محدود کردن جستجو به پوشه فعلی آن را بررسی کنید" + +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "محدود کردن جستجو به پوشه فعلی" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "حذف" + +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "افزودن یک پوشه جدید" + +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "پوشه جدید" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "بارگذاری فایل‌ها" + +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "ابتدا باید یک پوشه انتخاب کنید" + +#: templates/admin/filer/folder/directory_table_list.html:16 +msgid "Name" +msgstr "نام" + +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "مالک" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "اندازه" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "عملیات" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 +#, python-format +msgid "Change '%(item_label)s' folder details" +msgstr "تغییر جزئیات پوشه '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "%(counter)s پوشه" +msgstr[1] "%(counter)s پوشه" + +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "%(counter)s فایل" +msgstr[1] "%(counter)s فایل" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "تغییر جزئیات پوشه" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "حذف پوشه" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 +msgid "Select this file" +msgstr "انتخاب این فایل" + +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 +#, python-format +msgid "Change '%(item_label)s' details" +msgstr "تغییر جزئیات '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "Permissions" +msgstr "مجوزها" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "disabled" +msgstr "غیرفعال" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "enabled" +msgstr "فعال" + +#: templates/admin/filer/folder/directory_table_list.html:144 +#, fuzzy +#| msgid "Move selected files to clipboard" +msgid "URL copied to clipboard" +msgstr "آدرس URL به کلیپ‌بورد کپی شد" + +#: templates/admin/filer/folder/directory_table_list.html:147 +#, python-format +msgid "Canonical url '%(item_label)s'" +msgstr "آدرس اصلی '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:151 +#, python-format +msgid "Download '%(item_label)s'" +msgstr "دانلود '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "حذف فایل" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "فایل‌ها را اینجا رها کنید یا از دکمه «بارگذاری فایل‌ها» استفاده کنید" + +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "فایل خود را برای بارگذاری اینجا رها کنید:" + +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "بارگذاری" + +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "لغو" + +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "بارگذاری موفقیت‌آمیز بود!" + +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "بارگذاری لغو شد!" + +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 +msgid "previous" +msgstr "قبلی" + +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 +#, python-format +msgid "Page %(number)s of %(num_pages)s." +msgstr "صفحه %(number)s از %(num_pages)s." + +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 +msgid "next" +msgstr "بعدی" + +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "انتخاب همه %(total_count)s" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +msgid "Select all" +msgstr "انتخاب همه" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +msgid "Files" +msgstr "فایل‌ها" diff --git a/filer/locale/fi/LC_MESSAGES/django.mo b/filer/locale/fi/LC_MESSAGES/django.mo new file mode 100644 index 000000000..984dc53b7 Binary files /dev/null and b/filer/locale/fi/LC_MESSAGES/django.mo differ diff --git a/filer/locale/fi/LC_MESSAGES/django.po b/filer/locale/fi/LC_MESSAGES/django.po new file mode 100644 index 000000000..35fc907e0 --- /dev/null +++ b/filer/locale/fi/LC_MESSAGES/django.po @@ -0,0 +1,1259 @@ +# 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: +# Translators: +# Niklas Jerva , 2016 +# Teemu Gratschev , 2022 +msgid "" +msgstr "" +"Project-Id-Version: django Filer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: Teemu Gratschev , 2022\n" +"Language-Team: Finnish (http://app.transifex.com/divio/django-filer/language/" +"fi/)\n" +"Language: fi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: admin/clipboardadmin.py:17 +msgid "You do not have permission to upload files." +msgstr "" + +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "" + +#: admin/clipboardadmin.py:20 +msgid "Can't use this folder, Permission Denied. Please select another folder." +msgstr "" + +#: admin/fileadmin.py:73 +msgid "Advanced" +msgstr "Edistyneet asetukset" + +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "sääntöjenmukainen URL" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Toiminnon suorittamiseksi pitää valita kohteita. Yhtäänkohdetta ei ole " +"valittu." + +#: admin/folderadmin.py:434 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s valittu" +msgstr[1] "Kaikki %(total_count)s valittu" + +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "Hakemistolistaus kansiolle %(folder_name)s" + +#: admin/folderadmin.py:475 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 / %(cnt)s valittu" + +#: admin/folderadmin.py:612 +msgid "No action selected." +msgstr "Toimintoa ei ole valittu." + +#: admin/folderadmin.py:664 +#, python-format +msgid "Successfully moved %(count)d files to clipboard." +msgstr "%(count)d tiedostoa siirretty leikepöydälle." + +#: admin/folderadmin.py:669 +msgid "Move selected files to clipboard" +msgstr "Siirrä valitut tiedostot leikepöydälle" + +#: admin/folderadmin.py:709 +#, python-format +msgid "Successfully disabled permissions for %(count)d files." +msgstr "%(count)d tiedoston käyttöoikeudet poistettu käytöstä." + +#: admin/folderadmin.py:711 +#, python-format +msgid "Successfully enabled permissions for %(count)d files." +msgstr "Käyttöoikeudet otettu käyttöön %(count)d tiedostolle." + +#: admin/folderadmin.py:719 +msgid "Enable permissions for selected files" +msgstr "Ota käyttöoikeudet käyttöön valituille tiedostoille" + +#: admin/folderadmin.py:725 +msgid "Disable permissions for selected files" +msgstr "Poista käyttöoikeudet käytöstä valituista tiedostoista" + +#: admin/folderadmin.py:789 +#, python-format +msgid "Successfully deleted %(count)d files and/or folders." +msgstr "%(count)d tiedostoa ja/tai kansiota poistettu." + +#: admin/folderadmin.py:794 +msgid "Cannot delete files and/or folders" +msgstr "Kansioita ja/tai tiedostoja ei voida poistaa" + +#: admin/folderadmin.py:796 +msgid "Are you sure?" +msgstr "Oletko varma?" + +#: admin/folderadmin.py:802 +msgid "Delete files and/or folders" +msgstr "Poista tiedostot ja/tai kansiot" + +#: admin/folderadmin.py:823 +msgid "Delete selected files and/or folders" +msgstr "Poista valitut tiedostot ja/tai kansiot" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "%s niminen kansio on jo valitussa kohteessa" + +#: admin/folderadmin.py:934 +#, python-format +msgid "" +"Successfully moved %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" +"%(count)d tiedostoa ja/tai kansiota siirretty kansioon '%(destination)s'." + +#: admin/folderadmin.py:942 admin/folderadmin.py:944 +msgid "Move files and/or folders" +msgstr "Siirrä tiedostot ja/tai kansiot" + +#: admin/folderadmin.py:959 +msgid "Move selected files and/or folders" +msgstr "Siirrä valitut tiedostot ja/tai kansiot" + +#: admin/folderadmin.py:1016 +#, python-format +msgid "Successfully renamed %(count)d files." +msgstr "%(count)d tiedostoa nimetty uudelleen." + +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 +msgid "Rename files" +msgstr "Nimeä tiedostot uudelleen" + +#: admin/folderadmin.py:1137 +#, python-format +msgid "" +"Successfully copied %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" +"%(count)d tiedostoa ja/tai kansiota kopioitu kansioon '%(destination)s'." + +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 +msgid "Copy files and/or folders" +msgstr "Kopioi tiedostot ja/tai kansiot" + +#: admin/folderadmin.py:1174 +msgid "Copy selected files and/or folders" +msgstr "Kopioi valitut tiedostot ja/tai kansiot" + +#: admin/folderadmin.py:1279 +#, python-format +msgid "Successfully resized %(count)d images." +msgstr "%(count)d kuvan kokoa muutettu." + +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 +msgid "Resize images" +msgstr "Muuta kuvien kokoa" + +#: admin/folderadmin.py:1303 +msgid "Resize selected images" +msgstr "Muuta valittujen kuvien kokoa" + +#: admin/forms.py:24 +msgid "Suffix which will be appended to filenames of copied files." +msgstr "Pääte, joka lisätään kopioitujen tiedostojen nimiin." + +#: admin/forms.py:31 +#, python-format +msgid "" +"Suffix should be a valid, simple and lowercase filename part, like " +"\"%(valid)s\"." +msgstr "" +"Päätteen tulee olla käypä, yksinkertainen ja pienellä kirjoitettu osa " +"tiedostonimeä, esim. \"%(valid)s\"." + +#: admin/forms.py:52 +#, python-format +msgid "Unknown rename format value key \"%(key)s\"." +msgstr "Tuntematon uudelleennimeämisarvo \"%(key)s\"." + +#: admin/forms.py:54 +#, python-format +msgid "Invalid rename format: %(error)s." +msgstr "Virheellinen uudelleennimeämismuoto: %(error)s." + +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 +msgid "thumbnail option" +msgstr "pikkukuvan asetus" + +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 +msgid "width" +msgstr "leveys" + +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 +msgid "height" +msgstr "korkeus" + +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 +msgid "crop" +msgstr "rajaus" + +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 +msgid "upscale" +msgstr "suurenna" + +#: admin/forms.py:79 +msgid "Thumbnail option or resize parameters must be choosen." +msgstr "Pikkukuvan asetus tai koon muuttamisen parametrit tulee valita." + +#: admin/imageadmin.py:20 admin/imageadmin.py:112 +msgid "Subject location" +msgstr "Kohteen sijainti" + +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "Kuvan pääkohteen sijainti. Muoto: \"x,y\"." + +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "Virheellinen kohteen sijainnin muoto." + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "Kohteen sijainti kuvan ulkopuolella." + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "Syöttösi: \"{subject_location}\"." + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" +msgstr "" + +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" +msgstr "" + +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "Saman niminen kansio on jo olemassa." + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "Filer" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "Mediakirjasto" + +#: models/abstract.py:62 +msgid "default alt text" +msgstr "oletus alt-teksti" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "oletuskuvateksti" + +#: models/abstract.py:76 +msgid "subject location" +msgstr "kohteen sijainti" + +#: models/abstract.py:91 +msgid "image" +msgstr "kuva" + +#: models/abstract.py:92 +msgid "images" +msgstr "kuvat" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "" + +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." +msgstr "" + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 +msgid "user" +msgstr "käyttäjä" + +#: models/clipboardmodels.py:17 models/filemodels.py:157 +msgid "files" +msgstr "tiedostot" + +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 +msgid "clipboard" +msgstr "leikepöytä" + +#: models/clipboardmodels.py:25 +msgid "clipboards" +msgstr "leikepöydät" + +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 +msgid "file" +msgstr "tiedosto" + +#: models/clipboardmodels.py:56 +msgid "clipboard item" +msgstr "leikepöydän kohde" + +#: models/clipboardmodels.py:57 +msgid "clipboard items" +msgstr "leikepöydän kohteet" + +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "folder" +msgstr "kansio" + +#: models/filemodels.py:81 +msgid "file size" +msgstr "tiedostokoko" + +#: models/filemodels.py:87 +msgid "sha1" +msgstr "sha1" + +#: models/filemodels.py:94 +msgid "has all mandatory data" +msgstr "sisältää kaikki pakolliset tiedot" + +#: models/filemodels.py:100 +msgid "original filename" +msgstr "alkuperäinen tiedostonimi" + +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 +msgid "name" +msgstr "nimi" + +#: models/filemodels.py:116 +msgid "description" +msgstr "kuvaus" + +#: models/filemodels.py:125 models/foldermodels.py:108 +msgid "owner" +msgstr "omistaja" + +#: models/filemodels.py:129 models/foldermodels.py:116 +msgid "uploaded at" +msgstr "ladattu" + +#: models/filemodels.py:134 models/foldermodels.py:126 +msgid "modified at" +msgstr "muokattu" + +#: models/filemodels.py:140 +msgid "Permissions disabled" +msgstr "Käyttöoikeudet pois käytöstä" + +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "" +"Poista käyttöoikeuksien tarkistus tältä tiedostolta. Tiedosto näkyy " +"julkisena kaikille." + +#: models/foldermodels.py:94 +msgid "parent" +msgstr "" + +#: models/foldermodels.py:121 +msgid "created at" +msgstr "luotu" + +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Folder" +msgstr "Kansio" + +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 +msgid "Folders" +msgstr "Kansiot" + +#: models/foldermodels.py:260 +msgid "all items" +msgstr "kaikki kohteet" + +#: models/foldermodels.py:261 +msgid "this item only" +msgstr "vain tämä kohde" + +#: models/foldermodels.py:262 +msgid "this item and all children" +msgstr "tämä kohde ja kaikki lapset" + +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "salli" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "kiellä" + +#: models/foldermodels.py:280 +msgid "type" +msgstr "tyyppi" + +#: models/foldermodels.py:297 +msgid "group" +msgstr "ryhmä" + +#: models/foldermodels.py:304 +msgid "everybody" +msgstr "kaikki" + +#: models/foldermodels.py:309 +msgid "can read" +msgstr "saa lukea" + +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "saa muokata" + +#: models/foldermodels.py:325 +msgid "can add children" +msgstr "saa lisätä lapsia" + +#: models/foldermodels.py:333 +msgid "folder permission" +msgstr "kansion käyttöoikeus" + +#: models/foldermodels.py:334 +msgid "folder permissions" +msgstr "kansion käyttöoikeudet" + +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." +msgstr "" + +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." +msgstr "" + +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." +msgstr "" + +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." +msgstr "" + +#: models/foldermodels.py:360 +msgid "All Folders" +msgstr "" + +#: models/foldermodels.py:362 +msgid "Logical Path" +msgstr "" + +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" +msgstr "" + +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" +msgstr "" + +#: models/foldermodels.py:375 +msgid "Everybody" +msgstr "" + +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "" + +#: models/foldermodels.py:389 +msgid "Read" +msgstr "" + +#: models/foldermodels.py:390 +msgid "Add children" +msgstr "" + +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "päivämäärä" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "tekijä" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "tekijän tiedot on aina julkaistava" + +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "tekijänoikeustiedot on aina julkaistava" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "leveys pikseleinä." + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "korkeus pikseleinä." + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "pikkukuvan asetukset" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "Järjestelemättömät lataukset" + +#: models/virtualitems.py:73 +msgid "files with missing metadata" +msgstr "tiedostot ilman metadataa" + +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "root" +msgstr "juuri" + +#: settings.py:273 +msgid "Show table view" +msgstr "" + +#: settings.py:278 +msgid "Show thumbnail view" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Run the selected action" +msgstr "Suorita valittu toiminto" + +#: templates/admin/filer/actions.html:5 +msgid "Go" +msgstr "Suorita" + +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +msgid "Click here to select the objects across all pages" +msgstr "Valitse kaikki kohteet kaikilta sivuilta" + +#: templates/admin/filer/actions.html:14 +#, python-format +msgid "Select all %(total_count)s files and/or folders" +msgstr "Valitse kaikki %(total_count)s tiedostoa ja/tai kansiota" + +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 +msgid "Clear selection" +msgstr "Tyhjennä valinta" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 +msgid "Go back to admin homepage" +msgstr "Palaa hallinnan etusivulle" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 +msgid "Home" +msgstr "Etusivu" + +#: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 +msgid "Go back to Filer app" +msgstr "Palaa Fileriin" + +#: templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Go back to root folder" +msgstr "Palaa juurikansioon" + +#: templates/admin/filer/breadcrumbs.html:8 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 +#, python-format +msgid "Go back to '%(folder_name)s' folder" +msgstr "Palaa kansioon '%(folder_name)s'" + +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "Kaksoiskappaleet" + +#: templates/admin/filer/delete_selected_files_confirmation.html:11 +msgid "" +"Deleting the selected files and/or folders would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Valittujen tiedostojen ja/tai kansioiden poistaminen vaatii liittyvien " +"objektien poistamista, mutta käyttöoikeutesi eivät riitäseuraavien " +"objektityyppien poistamiseen:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:19 +msgid "" +"Deleting the selected files and/or folders would require deleting the " +"following protected related objects:" +msgstr "" +"Valittujen tiedostojen ja/tai kansioiden poistaminen vaatisi seuraavien " +"suojattujen liittyvien objektien poistamista:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:27 +msgid "" +"Are you sure you want to delete the selected files and/or folders? All of " +"the following objects and their related items will be deleted:" +msgstr "" +"Oletko varma, että haluat poistaa valitut tiedostot ja/tai kansiot? Kaikki " +"seuraavat objektit ja niihin liittyvät kohteet poistetaan:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "Ei, vie minut takaisin" + +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "Kyllä, olen varma" + +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 +msgid "History" +msgstr "Historia" + +#: templates/admin/filer/file/change_form.html:37 +#: templates/admin/filer/folder/change_form.html:23 +#: templates/admin/filer/image/change_form.html:37 +msgid "View on site" +msgstr "Näytä sivustolla" + +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "Palaa kohteeseen" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "hallinnan etusivu" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 +msgid "Folder Icon" +msgstr "Kansion kuvake" + +#: templates/admin/filer/folder/choose_copy_destination.html:23 +msgid "" +"Your account doesn't have permissions to copy all of the selected files and/" +"or folders." +msgstr "" +"Käyttöoikeutesi eivät riitä kaikkien valittujen tiedostojen ja/tai " +"kansioidenkopioimiseen." + +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "Vie minut takaisin" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 +msgid "There are no destination folders available." +msgstr "Kohdekansioita ei ole saatavilla." + +#: templates/admin/filer/folder/choose_copy_destination.html:35 +msgid "There are no files and/or folders available to copy." +msgstr "Kopioitavia tiedostoja ja/tai kansioita ei ole saatavilla." + +#: templates/admin/filer/folder/choose_copy_destination.html:40 +msgid "" +"The following files and/or folders will be copied to a destination folder " +"(retaining their tree structure):" +msgstr "" +"Seuraavat tiedostot ja/tai kansiot kopioidaan kohdekansioon (säilyttäen " +"puurakenteen):" + +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 +msgid "Destination folder:" +msgstr "Kohdekansio:" + +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 +msgid "Copy" +msgstr "Kopioi" + +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "Tiedostojen kopiointi samaan kansioon ei ole sallittu" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 +msgid "" +"Your account doesn't have permissions to resize all of the selected images." +msgstr "" +"Käyttöoikeutesi eivät riitä kaikkien valittujen kuvien koon muuttamiseen." + +#: templates/admin/filer/folder/choose_images_resize_options.html:18 +msgid "There are no images available to resize." +msgstr "Kuvia, joiden kokoa voisi muuttaa ei ole saatavilla." + +#: templates/admin/filer/folder/choose_images_resize_options.html:20 +msgid "The following images will be resized:" +msgstr "Seuraavien kuvien kokoa muutetaan:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:32 +msgid "Choose an existing thumbnail option or enter resize parameters:" +msgstr "Valitse olemassaolevat pikkukuvan asetukset tai syötä kokoparametrit:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:36 +msgid "" +"Warning: Images will be resized in-place and originals will be lost. Maybe " +"first make a copy of them to retain the originals." +msgstr "" +"Varoitus: Kuvien kokoa muuttaessa alkuperäiset versiot menetetään. On hyvä " +"idea tehdä kuvista ensin kopiot alkuperäisten säilyttämiseksi." + +#: templates/admin/filer/folder/choose_images_resize_options.html:39 +msgid "Resize" +msgstr "Muuta kokoa" + +#: templates/admin/filer/folder/choose_move_destination.html:35 +msgid "" +"Your account doesn't have permissions to move all of the selected files and/" +"or folders." +msgstr "" +"Käyttöoikeutesi eivät riitä kaikkien valittujen tiedostojen ja/tai " +"kansioidensiirtämiseen." + +#: templates/admin/filer/folder/choose_move_destination.html:47 +msgid "There are no files and/or folders available to move." +msgstr "Siirrettäviä tiedostoja ja/tai kansioita ei ole saatavilla." + +#: templates/admin/filer/folder/choose_move_destination.html:52 +msgid "" +"The following files and/or folders will be moved to a destination folder " +"(retaining their tree structure):" +msgstr "" +"Seuraavat tiedostot ja/tai kansiot siirretään kohdekansioon (säilyttäen " +"niiden puurakenne):" + +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 +msgid "Move" +msgstr "Siirrä" + +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "Tiedostojen siirto samaan kansioon ei ole sallittua" + +#: templates/admin/filer/folder/choose_rename_format.html:15 +msgid "" +"Your account doesn't have permissions to rename all of the selected files." +msgstr "" +"Käyttöoikeutesi eivät riitä kaikkien valittujen tiedostojen " +"uudelleennimeämiseen." + +#: templates/admin/filer/folder/choose_rename_format.html:18 +msgid "There are no files available to rename." +msgstr "Uudelleennimettäviä tiedostoja ei ole saatavilla." + +#: templates/admin/filer/folder/choose_rename_format.html:20 +msgid "" +"The following files will be renamed (they will stay in their folders and " +"keep original filename, only displayed filename will be changed):" +msgstr "" +"Seuraavat tiedostot uudelleennimetään (ne pysyvät kansioissaan ja " +"alkuperäiset tiedostonimet säilytetään, vain näytettävä tiedostonimi " +"muutetaan):" + +#: templates/admin/filer/folder/choose_rename_format.html:59 +msgid "Rename" +msgstr "Uudelleennimeä" + +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "Palaa ylempään kansioon" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "Muuta nykyisen kansion tietoja" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "Muuta" + +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "Valitse suorittaaksesi haun annetulla hakusanalla" + +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "Hae" + +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "Sulje" + +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "Raja" + +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "Valitse rajoittaaksesi haun nykyiseen kansioon" + +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "Rajoita haku nykyiseen kansioon" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "Poista" + +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "Lisää uusi kansio" + +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "Uusi kansio" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "Lataa tiedostoja" + +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "Sinun tulee valita kansio ensin" + +#: templates/admin/filer/folder/directory_table_list.html:16 +msgid "Name" +msgstr "Nimi" + +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "Omistaja" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "Koko" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "Toiminto" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 +#, python-format +msgid "Change '%(item_label)s' folder details" +msgstr "Muuta kansion '%(item_label)s' tietoja" + +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "%(counter)s kansio" +msgstr[1] "%(counter)s kansiota" + +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "%(counter)s tiedosto" +msgstr[1] "%(counter)s tiedostoa" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "Muuta kansion tietoja" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "Poista kansio" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 +msgid "Select this file" +msgstr "Valitse tämä tiedosto" + +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 +#, python-format +msgid "Change '%(item_label)s' details" +msgstr "Muuta kohteen '%(item_label)s' tietoja" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "Permissions" +msgstr "Käyttöoikeudet" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "disabled" +msgstr "pois käytöstä" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "enabled" +msgstr "käytössä" + +#: templates/admin/filer/folder/directory_table_list.html:144 +#, fuzzy +#| msgid "Move selected files to clipboard" +msgid "URL copied to clipboard" +msgstr "Siirrä valitut tiedostot leikepöydälle" + +#: templates/admin/filer/folder/directory_table_list.html:147 +#, python-format +msgid "Canonical url '%(item_label)s'" +msgstr "Canonical-osoite '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:151 +#, python-format +msgid "Download '%(item_label)s'" +msgstr "Lataa '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "Poista tiedosto" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "Pudota tiedostoja tähän tai käytä \"Lataa tiedostoja\" painiketta" + +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "Pudota tiedostosi:" + +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "Siirrä palvelimelle" + +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "peruuta" + +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "Lataus onnistui!" + +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "Lataus peruttu!" + +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 +msgid "previous" +msgstr "edellinen" + +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 +#, python-format +msgid "Page %(number)s of %(num_pages)s." +msgstr "Sivu %(number)s/%(num_pages)s" + +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 +msgid "next" +msgstr "seuraava" + +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "Valitse kaikki %(total_count)s" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +msgid "Select all" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +msgid "Files" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +msgid "Add new" +msgstr "Lisää uusi" + +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" +msgstr "Django-sivuston ylläpito" + +#: templates/admin/filer/folder/new_folder_form.html:15 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Ole hyvä ja korjaa allaoleva virhe." +msgstr[1] "Ole hyvä ja korjaa allaolevat virheet." + +#: templates/admin/filer/folder/new_folder_form.html:30 +msgid "Save" +msgstr "Tallenna" + +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "Leikepöytä" + +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "Liitä kaikki kohteet tähän" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "Siirrä kaikki leikepöydällä olevat tiedostot" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "Tyhjä leikepöytä" + +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "leikepöytä on tyhjä" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "siirto epäonnistui" + +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +msgid "File is missing" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "Tyyppi" + +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "Tiedostokoko" + +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "Muokattu" + +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "Luotu" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "found" +msgstr "löytyi" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "and" +msgstr "ja" + +#: templates/admin/filer/tools/search_form.html:7 +msgid "cancel search" +msgstr "peruuta haku" + +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "Tyhjennä" + +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "tai pudota tiedostosi tähän" + +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "yhtään tiedostoa ei ole valittu" + +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "Haku" + +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "Valitse tiedosto" + +#: templates/admin/filer/widgets/admin_folder.html:16 +msgid "Choose Folder" +msgstr "" + +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" +msgstr "" + +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" +msgstr "" + +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" +msgstr "" + +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" +msgstr "" + +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" +msgstr "" + +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." + +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" + +#~ msgid "Open file" +#~ msgstr "Open file" + +#~ msgid "Full size preview" +#~ msgstr "Full size preview" + +#~ msgid "Add Description" +#~ msgstr "Add Description" + +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" + +#~ msgid "none selected" +#~ msgstr "none selected" + +#~ msgid "Add Folder" +#~ msgstr "Add Folder" + +#~ msgid "Subject Location" +#~ msgstr "Subject location" + +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" +#~ msgstr[1] "15c0f2d28d6dab1af1f6d94906beb627_pl_1" + +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/fr/LC_MESSAGES/django.mo b/filer/locale/fr/LC_MESSAGES/django.mo index 602810612..9936407bf 100644 Binary files a/filer/locale/fr/LC_MESSAGES/django.mo and b/filer/locale/fr/LC_MESSAGES/django.mo differ diff --git a/filer/locale/fr/LC_MESSAGES/django.po b/filer/locale/fr/LC_MESSAGES/django.po index 662e7b320..5e56554c3 100644 --- a/filer/locale/fr/LC_MESSAGES/django.po +++ b/filer/locale/fr/LC_MESSAGES/django.po @@ -1,935 +1,1249 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: -# Bertrand Bordage , 2012. -# Marion Balensi , 2012. +# Translators: +# Translators: +# Assma Buifruri , 2017 +# Bertrand Bordage , 2012-2013 +# Sylvain Chiron , 2016 +# Corentin Bettiol, 2023 +# Jason Gass Martinez , 2016 +# Marion Balensi , 2012 +# Nicolas PASCAL , 2019 msgid "" msgstr "" -"Project-Id-Version: django-filer\n" +"Project-Id-Version: django Filer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-07-13 19:10+0200\n" -"PO-Revision-Date: 2012-09-03 20:11+0100\n" -"Last-Translator: Stefan Foulis \n" -"Language-Team: French (http://www.transifex.com/projects/p/django-filer/" -"language/fr/)\n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: Corentin Bettiol, 2023\n" +"Language-Team: French (http://app.transifex.com/divio/django-filer/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" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" -#: views.py:103 -msgid "Folder with this name already exists." -msgstr "Il existe déjà un dossier avec ce nom." +#: admin/clipboardadmin.py:17 +#| msgid "" +#| "ccount doesn't have permissions to rename all of the selected files." +msgid "You do not have permission to upload files." +msgstr "Vous n'avez pas la permission d'héberger des fichiers." + +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "Dossier d'hébergement introuvable, rafraîchissez la page et réessayez." -#: admin/fileadmin.py:41 +#: admin/clipboardadmin.py:20 +msgid "" +"Can't use this folder, Permission Denied. Please select another folder." +msgstr "Utilisation du dossier impossible : Permissions insuffisantes. Sélectionnez un autre dossier." + +#: admin/fileadmin.py:73 msgid "Advanced" msgstr "Avancé" -#: admin/folderadmin.py:324 admin/folderadmin.py:427 +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "URL canonique" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 msgid "" "Items must be selected in order to perform actions on them. No items have " "been changed." -msgstr "" -"Des éléments doivent être selectionnés pour effectuer des actions sur eux. " -"Aucun élément n'a été modifié." +msgstr "Des éléments doivent être sélectionnés pour effectuer les actions. Aucun élément n'a été modifié." -#: admin/folderadmin.py:344 +#: admin/folderadmin.py:434 #, python-format msgid "%(total_count)s selected" msgid_plural "All %(total_count)s selected" msgstr[0] "%(total_count)s sélectionné" msgstr[1] "Tous les %(total_count)s sélectionnés" +msgstr[2] "Tous les %(total_count)s sélectionnés" -#: admin/folderadmin.py:377 +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "Liste du répertoire pour %(folder_name)s" + +#: admin/folderadmin.py:475 #, python-format msgid "0 of %(cnt)s selected" msgstr "0 sur %(cnt)s sélectionné" -#: admin/folderadmin.py:456 +#: admin/folderadmin.py:612 msgid "No action selected." msgstr "Pas d'action sélectionnée." -#: admin/folderadmin.py:497 +#: admin/folderadmin.py:664 #, python-format msgid "Successfully moved %(count)d files to clipboard." msgstr "%(count)d fichiers déplacés avec succès vers le presse-papiers." -#: admin/folderadmin.py:503 +#: admin/folderadmin.py:669 msgid "Move selected files to clipboard" -msgstr "Déplacer les fichiers sélectionnés vers le presse-papiers." +msgstr "Déplacer les fichiers sélectionnés vers le presse-papiers" -#: admin/folderadmin.py:537 +#: admin/folderadmin.py:709 #, python-format msgid "Successfully disabled permissions for %(count)d files." msgstr "Permissions désactivées avec succès pour %(count)d fichiers." -#: admin/folderadmin.py:541 +#: admin/folderadmin.py:711 #, python-format msgid "Successfully enabled permissions for %(count)d files." msgstr "Permissions activées avec succès pour %(count)d fichiers." -#: admin/folderadmin.py:550 +#: admin/folderadmin.py:719 msgid "Enable permissions for selected files" msgstr "Activer les permissions pour les fichiers sélectionnés." -#: admin/folderadmin.py:555 +#: admin/folderadmin.py:725 msgid "Disable permissions for selected files" msgstr "Désactiver les permissions pour les fichiers sélectionnés." -#: admin/folderadmin.py:623 +#: admin/folderadmin.py:789 #, python-format msgid "Successfully deleted %(count)d files and/or folders." msgstr "%(count)d fichiers et/ou dossiers supprimés avec succès." -#: admin/folderadmin.py:630 +#: admin/folderadmin.py:794 msgid "Cannot delete files and/or folders" msgstr "Impossible de supprimer les fichiers et/ou dossiers." -#: admin/folderadmin.py:632 +#: admin/folderadmin.py:796 msgid "Are you sure?" msgstr "Êtes-vous sûr(e) ?" -#: admin/folderadmin.py:637 +#: admin/folderadmin.py:802 msgid "Delete files and/or folders" -msgstr "Supprimer les fichiers et/ou dossiers." +msgstr "Supprimer les fichiers et/ou dossiers" -#: admin/folderadmin.py:656 +#: admin/folderadmin.py:823 msgid "Delete selected files and/or folders" -msgstr "Supprimer les fichiers et/ou dossiers sélectionnés." +msgstr "Supprimer les fichiers et/ou dossiers sélectionnés" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "Des dossiers nommés %s existent déjà dans la destination sélectionnée" -#: admin/folderadmin.py:771 +#: admin/folderadmin.py:934 #, python-format msgid "" "Successfully moved %(count)d files and/or folders to folder " "'%(destination)s'." -msgstr "" -"%(count)d fichiers et/ou dossiers déplacés avec succès vers le dossier « " -"%(destination)s »." +msgstr "%(count)d fichiers et/ou dossiers déplacés avec succès vers le dossier « %(destination)s »." -#: admin/folderadmin.py:778 admin/folderadmin.py:780 +#: admin/folderadmin.py:942 admin/folderadmin.py:944 msgid "Move files and/or folders" -msgstr "Déplacer les fichers et/ou dossiers." +msgstr "Déplacer les fichiers et/ou dossiers" -#: admin/folderadmin.py:797 +#: admin/folderadmin.py:959 msgid "Move selected files and/or folders" -msgstr "Déplacer les fichiers et/ou dossiers sélectionnés." +msgstr "Déplacer les fichiers et/ou dossiers sélectionnés" -#: admin/folderadmin.py:854 +#: admin/folderadmin.py:1016 #, python-format msgid "Successfully renamed %(count)d files." msgstr "%(count)d fichiers renommés avec succès." -#: admin/folderadmin.py:862 admin/folderadmin.py:864 admin/folderadmin.py:881 +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 msgid "Rename files" -msgstr "Renommer les fichiers." +msgstr "Renommer les fichiers" -#: admin/folderadmin.py:975 +#: admin/folderadmin.py:1137 #, python-format msgid "" "Successfully copied %(count)d files and/or folders to folder " "'%(destination)s'." -msgstr "" -"%(count)d fichiers et/dossiers copiés avec succès dans le dossier « " -"%(destination)s »." +msgstr "%(count)d fichiers et/dossiers copiés avec succès dans le dossier « %(destination)s »." -#: admin/folderadmin.py:989 admin/folderadmin.py:991 +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 msgid "Copy files and/or folders" -msgstr "Copier les fichiers et/ou dossiers." +msgstr "Copier les fichiers et/ou dossiers" -#: admin/folderadmin.py:1010 +#: admin/folderadmin.py:1174 msgid "Copy selected files and/or folders" -msgstr "Copier les fichiers et/ou dossiers sélectionnés." +msgstr "Copier les fichiers et/ou dossiers sélectionnés" -#: admin/folderadmin.py:1105 +#: admin/folderadmin.py:1279 #, python-format msgid "Successfully resized %(count)d images." msgstr "%(count)d images redimensionnées avec succès." -#: admin/folderadmin.py:1113 admin/folderadmin.py:1115 +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 msgid "Resize images" -msgstr "Redimensionner les images." +msgstr "Redimensionner les images" -#: admin/folderadmin.py:1133 +#: admin/folderadmin.py:1303 msgid "Resize selected images" -msgstr "Redimensionner les images sélectionnées." +msgstr "Redimensionner les images sélectionnées" -#: admin/forms.py:26 +#: admin/forms.py:24 msgid "Suffix which will be appended to filenames of copied files." -msgstr "Suffixe qui sera ajouté aux noms des fichiers copiés." +msgstr "Suffixe qui sera ajouté au nom des fichiers copiés." -#: admin/forms.py:33 +#: admin/forms.py:31 #, python-format msgid "" "Suffix should be a valid, simple and lowercase filename part, like " "\"%(valid)s\"." -msgstr "" -"Le suffixe doit être une partie de nom de fichier simple et en minuscules, " -"comme \"%(valid)s\"." +msgstr "Le suffixe doit être une partie de nom de fichier valide, simple et en minuscules, comme « %(valid)s »." -#: admin/forms.py:54 +#: admin/forms.py:52 #, python-format msgid "Unknown rename format value key \"%(key)s\"." -msgstr "La valeur de la clé de formatage \"%(key)s\" est inconnue." +msgstr "La clé de formatage « %(key)s » est inconnue." -#: admin/forms.py:56 +#: admin/forms.py:54 #, python-format msgid "Invalid rename format: %(error)s." msgstr "Format de renommage non valide : %(error)s." -#: admin/forms.py:62 +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 msgid "thumbnail option" msgstr "option de miniature" -#: admin/forms.py:63 +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 msgid "width" msgstr "largeur" -#: admin/forms.py:64 +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 msgid "height" msgstr "hauteur" -#: admin/forms.py:65 +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 msgid "crop" msgstr "rogner" -#: admin/forms.py:66 +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 msgid "upscale" -msgstr "élargir" +msgstr "agrandir" -#: admin/forms.py:71 +#: admin/forms.py:79 msgid "Thumbnail option or resize parameters must be choosen." -msgstr "" -"Une option de miniature ou des paramètres de redimensionnement doivent être " -"choisis." - -#: admin/forms.py:73 -msgid "Resize parameters must be choosen." -msgstr "Des paramètres de redimensionnement doivent être choisis." +msgstr "Une option de miniature ou des paramètres de dimensionnement doivent être choisis." -#: admin/imageadmin.py:12 +#: admin/imageadmin.py:20 admin/imageadmin.py:112 msgid "Subject location" msgstr "Emplacement du sujet" -#: admin/imageadmin.py:13 -msgid "Location of the main subject of the scene." -msgstr "Emplacement du sujet principal de la scène." +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "Emplacement du sujet principal de la scène. Format : « x,y »." + +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "Format d'emplacement de sujet invalide." + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "L'emplacement du sujet est en dehors de l'image." + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "Votre entrée : « {subject_location} »." + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" +msgstr "Qui" + +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" +msgstr "Quoi" + +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "Il existe déjà un dossier avec ce nom." + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "Filer" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "Bibliotèque multimedia" + +#: models/abstract.py:62 +msgid "default alt text" +msgstr "texte alternatif par défaut" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "légende par défaut" + +#: models/abstract.py:76 +msgid "subject location" +msgstr "emplacement du sujet" + +#: models/abstract.py:91 +msgid "image" +msgstr "image" + +#: models/abstract.py:92 +msgid "images" +msgstr "images" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "Le format de l'image n'est pas reconnu, ou la taille de l'image dépasse la limite de%(max_pixels)d millions pixels deux fois ou plus. Avant d'envoyer l'image à nouveau, vérifiez le format de l'image, ou redimensionnez l'image afin qu'elle aie une résolution de %(width)d x %(height)d pixels ou moins." -#: models/clipboardmodels.py:9 models/foldermodels.py:236 +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." +msgstr "La taille de l'image (%(pixels)d millions de pixels) dépasse la limite de %(max_pixels)d millions de pixels. Avant d'envoyer l'image à nouveau, redimensionnez la pour qu'elle aie une résolution de %(width)d x %(height)d pixels ou moins." + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 msgid "user" msgstr "utilisateur" -#: models/clipboardmodels.py:11 models/filemodels.py:287 +#: models/clipboardmodels.py:17 models/filemodels.py:157 msgid "files" msgstr "fichiers" -#: models/clipboardmodels.py:34 models/clipboardmodels.py:40 +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 msgid "clipboard" msgstr "presse-papiers" -#: models/clipboardmodels.py:35 +#: models/clipboardmodels.py:25 msgid "clipboards" -msgstr "presses-papiers" +msgstr "presse-papiers" -#: models/clipboardmodels.py:39 models/filemodels.py:35 -#: models/filemodels.py:286 +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 msgid "file" -msgstr "fichiers" +msgstr "fichier" -#: models/clipboardmodels.py:44 +#: models/clipboardmodels.py:56 msgid "clipboard item" msgstr "élément du presse-papiers" -#: models/clipboardmodels.py:45 +#: models/clipboardmodels.py:57 msgid "clipboard items" msgstr "éléments du presse-papiers" -#: models/filemodels.py:33 templates/admin/filer/folder/change_form.html:9 -#: templates/admin/filer/folder/directory_listing.html:74 +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 #: templates/admin/filer/folder/new_folder_form.html:4 -#: templates/admin/filer/tools/clipboard/clipboard.html:26 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 msgid "folder" msgstr "dossier" -#: models/filemodels.py:36 +#: models/filemodels.py:81 msgid "file size" msgstr "taille du fichier" -#: models/filemodels.py:38 +#: models/filemodels.py:87 msgid "sha1" msgstr "sha1" -#: models/filemodels.py:40 +#: models/filemodels.py:94 msgid "has all mandatory data" msgstr "possède toutes les données nécessaires" -#: models/filemodels.py:42 +#: models/filemodels.py:100 msgid "original filename" msgstr "nom de fichier originel" -#: models/filemodels.py:44 models/foldermodels.py:99 +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 msgid "name" msgstr "nom" -#: models/filemodels.py:46 +#: models/filemodels.py:116 msgid "description" msgstr "description" -#: models/filemodels.py:50 +#: models/filemodels.py:125 models/foldermodels.py:108 msgid "owner" msgstr "propriétaire" -#: models/filemodels.py:52 models/foldermodels.py:105 +#: models/filemodels.py:129 models/foldermodels.py:116 msgid "uploaded at" -msgstr "transféré le" +msgstr "téléversé le" -#: models/filemodels.py:53 models/foldermodels.py:108 +#: models/filemodels.py:134 models/foldermodels.py:126 msgid "modified at" msgstr "modifié le" -#: models/filemodels.py:57 +#: models/filemodels.py:140 msgid "Permissions disabled" msgstr "Permissions désactivées" -#: models/filemodels.py:58 -msgid "Disable any permission checking for this " -msgstr "" +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "Désactiver la vérification des permissions pour ce fichier. Le fichier sera publiquement accessible à tout le monde." -#: models/foldermodels.py:107 +#: models/foldermodels.py:94 +msgid "parent" +msgstr "parent" + +#: models/foldermodels.py:121 msgid "created at" msgstr "créé le" -#: models/foldermodels.py:211 -#: templates/admin/filer/widgets/admin_folder.html:3 -#: templates/admin/filer/widgets/admin_folder.html:5 +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 msgid "Folder" msgstr "Dossier" -#: models/foldermodels.py:212 +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 msgid "Folders" msgstr "Dossiers" -#: models/foldermodels.py:227 +#: models/foldermodels.py:260 msgid "all items" msgstr "tous les éléments" -#: models/foldermodels.py:228 +#: models/foldermodels.py:261 msgid "this item only" msgstr "cet élément seulement" -#: models/foldermodels.py:229 +#: models/foldermodels.py:262 msgid "this item and all children" msgstr "cet élément et ses enfants" -#: models/foldermodels.py:233 +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "hériter" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "autoriser" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "refuser" + +#: models/foldermodels.py:280 msgid "type" msgstr "type" -#: models/foldermodels.py:239 +#: models/foldermodels.py:297 msgid "group" msgstr "groupe" -#: models/foldermodels.py:240 +#: models/foldermodels.py:304 msgid "everybody" msgstr "tous" -#: models/foldermodels.py:242 -msgid "can edit" -msgstr "peut éditer" - -#: models/foldermodels.py:243 +#: models/foldermodels.py:309 msgid "can read" msgstr "peut lire" -#: models/foldermodels.py:244 +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "peut éditer" + +#: models/foldermodels.py:325 msgid "can add children" msgstr "peut ajouter un enfant" -#: models/foldermodels.py:273 +#: models/foldermodels.py:333 msgid "folder permission" msgstr "permission du dossier" -#: models/foldermodels.py:274 +#: models/foldermodels.py:334 msgid "folder permissions" msgstr "permissions du dossier" -#: models/imagemodels.py:39 -msgid "date taken" -msgstr "date de prise de vue" +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." +msgstr "Le dossier ne peut pas être sélectionné avec le type \"tous les éléments\"." -#: models/imagemodels.py:42 -msgid "default alt text" -msgstr "texte alternatif par défaut" +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." +msgstr "Un dossier doit être sélectionné lorsque le type n'est pas \"tous les éléments\"." -#: models/imagemodels.py:43 -msgid "default caption" -msgstr "légende par défaut" +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." +msgstr "Un utilisateur ou un groupe ne peuvent être sélectionnés lorsque \"tout le monde\" est également sélectionné." -#: models/imagemodels.py:45 templates/image_filer/image.html:6 -msgid "author" -msgstr "auteur" +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." +msgstr "Au moins une option parmi un utilisateur, un groupe, ou \"tout le monde\" doit être sélectionnée." -#: models/imagemodels.py:47 -msgid "must always publish author credit" -msgstr "attribution à l'auteur toujours publiée" +#: models/foldermodels.py:360 +#| msgid "Folders" +msgid "All Folders" +msgstr "Tous les dossiers" -#: models/imagemodels.py:48 -msgid "must always publish copyright" -msgstr "copyright toujours publié" +#: models/foldermodels.py:362 +msgid "Logical Path" +msgstr "Chemin logique" -#: models/imagemodels.py:50 -msgid "subject location" -msgstr "emplacement du sujet" +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" +msgstr "Utilisateur : {user}" -#: models/imagemodels.py:200 -msgid "image" -msgstr "image" +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" +msgstr "Groupe : {group}" -#: models/imagemodels.py:201 -msgid "images" -msgstr "images" +#: models/foldermodels.py:375 +#| msgid "everybody" +msgid "Everybody" +msgstr "Tout le monde" + +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "Modifier" + +#: models/foldermodels.py:389 +msgid "Read" +msgstr "Lire" + +#: models/foldermodels.py:390 +#| msgid "can add children" +msgid "Add children" +msgstr "Ajouter un sous-dossier" -#: models/virtualitems.py:45 -#: templates/admin/filer/tools/clipboard/clipboard.html:26 -msgid "unfiled files" -msgstr "Fichiers non classés" +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "date de prise de vue" -#: models/virtualitems.py:59 +#: models/imagemodels.py:25 +msgid "author" +msgstr "auteur" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "doit toujours publier l'attribution à l'auteur" + +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "doit toujours publier le droit d'auteur" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "largeur en pixels." + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "hauteur en pixels." + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "options de miniature" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "Téléversements non triés" + +#: models/virtualitems.py:73 msgid "files with missing metadata" -msgstr "fichiers aux métadonnées manquantes" +msgstr "fichiers avec des métadonnées manquantes" -#: models/virtualitems.py:73 templates/admin/filer/breadcrumbs.html:6 -#: templates/admin/filer/folder/change_form.html:9 -#: templates/admin/filer/folder/directory_listing.html:74 -#: templates/image_filer/image_export_form.html:10 +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 msgid "root" -msgstr "Dossier racine" +msgstr "racine" + +#: settings.py:273 +msgid "Show table view" +msgstr "Voir la vue en liste" + +#: settings.py:278 +#| msgid "thumbnail option" +msgid "Show thumbnail view" +msgstr "Voir la vue avec des miniatures" -#: templates/admin/filer/actions.html:4 +#: templates/admin/filer/actions.html:5 msgid "Run the selected action" msgstr "Exécuter l'action sélectionnée" -#: templates/admin/filer/actions.html:4 +#: templates/admin/filer/actions.html:5 msgid "Go" msgstr "Envoyer" -#: templates/admin/filer/actions.html:11 +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 msgid "Click here to select the objects across all pages" msgstr "Cliquez ici pour sélectionner tous les objets sur l'ensemble des pages" -#: templates/admin/filer/actions.html:11 +#: templates/admin/filer/actions.html:14 #, python-format msgid "Select all %(total_count)s files and/or folders" msgstr "Sélectionner tous les %(total_count)s fichiers et/ou dossiers" -#: templates/admin/filer/actions.html:13 +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 msgid "Clear selection" msgstr "Effacer la sélection" #: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 msgid "Go back to admin homepage" -msgstr "Retourner à la page d'accueil de l'administrateur." +msgstr "Retourner à la page d'accueil de l'administration" #: templates/admin/filer/breadcrumbs.html:4 -#: templates/admin/filer/folder/change_form.html:7 -#: templates/image_filer/image_export_form.html:7 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 msgid "Home" msgstr "Accueil" #: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 msgid "Go back to Filer app" msgstr "Revenir à l'application Filer" -#: templates/admin/filer/breadcrumbs.html:5 -#: templates/admin/filer/folder/change_form.html:8 -#: templates/image_filer/image_export_form.html:8 -msgid "Filer" -msgstr "Filer" - #: templates/admin/filer/breadcrumbs.html:6 -#: templates/image_filer/image_export_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:35 msgid "Go back to root folder" -msgstr "Retourner au dossier racine" +msgstr "Revenir au dossier racine" #: templates/admin/filer/breadcrumbs.html:8 -#: templates/admin/filer/breadcrumbs.html:11 -#: templates/admin/filer/folder/change_form.html:11 -#: templates/image_filer/image_export_form.html:12 -#: templates/image_filer/image_export_form.html:14 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 #, python-format msgid "Go back to '%(folder_name)s' folder" -msgstr "Retourner au dossier « %(folder_name)s »" +msgstr "Revenir au dossier « %(folder_name)s »" -#: templates/admin/filer/change_form.html:28 -msgid "duplicates" -msgstr "doublons" - -#: templates/admin/filer/delete_confirmation.html:13 -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Supprimer l'objet %(object_name)s « %(escaped_object)s » provoquerait la " -"suppression d'objets liés, mais votre compte ne possède pas la permission de " -"supprimer les types d'objets suivants :" - -#: templates/admin/filer/delete_confirmation.html:21 -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Supprimer l'objet %(object_name)s « %(escaped_object)s » provoquerait la " -"suppression des objets qui lui sont liés, mais votre compte ne possède pas " -"la permission de supprimer les types d'objets suivants :" - -#: templates/admin/filer/delete_confirmation.html:29 -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Voulez vous vraiment supprimer l'objet %(object_name)s « %(escaped_object)s " -"» ? Les éléments suivants sont liés à celui-ci et seront aussi supprimés :" - -#: templates/admin/filer/delete_confirmation.html:34 -#: templates/admin/filer/delete_selected_files_confirmation.html:45 -msgid "Yes, I'm sure" -msgstr "Oui, je suis sûr(e)." +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "Duplicatas" #: templates/admin/filer/delete_selected_files_confirmation.html:11 msgid "" "Deleting the selected files and/or folders would result in deleting related " "objects, but your account doesn't have permission to delete the following " "types of objects:" -msgstr "" -"Supprimer les fichier et/ou dossiers sélectionnés provoquerait la " -"suppression d'objets liés, mais votre compte ne possède pas la permission de " -"supprimer les types d'objets suivants :" +msgstr "Supprimer les fichiers et/ou dossiers sélectionnés devrait provoquer la suppression des objets liés, mais votre compte n'a pas les permissions nécessaires pour supprimer les types d'objets suivants :" #: templates/admin/filer/delete_selected_files_confirmation.html:19 msgid "" "Deleting the selected files and/or folders would require deleting the " "following protected related objects:" -msgstr "" -"Supprimer les fichiers et/ou dossiers provoquerait la suppression des " -"objetsliés protégés suivants :" +msgstr "Supprimer les fichiers et/ou dossiers provoquera la suppression des objets liés protégés suivants :" #: templates/admin/filer/delete_selected_files_confirmation.html:27 msgid "" "Are you sure you want to delete the selected files and/or folders? All of " "the following objects and their related items will be deleted:" -msgstr "" -"Voulez vous vraiment supprimer l'objet les fichiers et/ou dossiers " -"sélectionnés ? Les éléments suivants sont liés à celui-ci et seront aussi " -"supprimés :" +msgstr "Voulez-vous vraiment supprimer les fichiers et/ou dossiers sélectionnés ? Tous les objets suivants et leurs éléments liés seront supprimés :" -#: templates/admin/filer/folder/change_form.html:7 -#: templates/admin/filer/folder/change_form.html:8 -#: templates/admin/filer/folder/change_form.html:9 -#: templates/admin/filer/folder/directory_listing.html:74 -#: templates/image_filer/image_export_form.html:7 -#: templates/image_filer/image_export_form.html:8 -#: templates/image_filer/image_export_form.html:16 -msgid "Go back to" -msgstr "Retourner à" +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "Non, faites-moi revenir" -#: templates/admin/filer/folder/change_form.html:7 -#: templates/image_filer/image_export_form.html:7 -msgid "admin homepage" -msgstr "page d'accueil de l'administrateur" +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "Oui, je suis sûr" -#: templates/admin/filer/folder/change_form.html:22 -#: templates/admin/filer/image/change_form.html:9 +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 msgid "History" msgstr "Historique" +#: templates/admin/filer/file/change_form.html:37 #: templates/admin/filer/folder/change_form.html:23 -#: templates/admin/filer/image/change_form.html:10 +#: templates/admin/filer/image/change_form.html:37 msgid "View on site" msgstr "Voir sur le site" -#: templates/admin/filer/folder/change_form.html:35 -#: templates/admin/filer/folder/directory_listing.html:75 -#: templates/admin/filer/folder/directory_listing.html:85 -#: templates/admin/filer/folder/directory_table.html:23 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "Retourner à" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "page d'accueil de l'administrateur" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 msgid "Folder Icon" msgstr "Icône du dossier" -#: templates/admin/filer/folder/choose_copy_destination.html:12 +#: templates/admin/filer/folder/choose_copy_destination.html:23 msgid "" -"Your account doesn't have permissions to copy all of the selected files and/" -"or folders." -msgstr "" -"Votre compte n'a pas les permissions nécessaires pour copier tous lesfichers " -"et/ou dossiers sélectionnés." - -#: templates/admin/filer/folder/choose_copy_destination.html:15 -#: templates/admin/filer/folder/choose_move_destination.html:15 +"Your account doesn't have permissions to copy all of the selected files " +"and/or folders." +msgstr "Votre compte n'a pas les permissions nécessaires pour copier tous les fichiers et/ou dossiers sélectionnés." + +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "Retour" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 msgid "There are no destination folders available." msgstr "Aucun dossier de destination disponible." -#: templates/admin/filer/folder/choose_copy_destination.html:18 +#: templates/admin/filer/folder/choose_copy_destination.html:35 msgid "There are no files and/or folders available to copy." -msgstr "Aucun fichier ou dossier n'estss disponible à copier." +msgstr "Aucun fichier ou dossier n'est disponible à copier." -#: templates/admin/filer/folder/choose_copy_destination.html:20 +#: templates/admin/filer/folder/choose_copy_destination.html:40 msgid "" "The following files and/or folders will be copied to a destination folder " "(retaining their tree structure):" -msgstr "" -"Les fichiers et/ou dossiers suivants seront copiés vers un dossier de " -"destination (en conservant leur arborescence) :" +msgstr "Les fichiers et/ou dossiers suivants seront copiés vers un dossier de destination (en conservant leur arborescence) :" -#: templates/admin/filer/folder/choose_copy_destination.html:32 -#: templates/admin/filer/folder/choose_move_destination.html:32 +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 msgid "Destination folder:" msgstr "Dossier de destination :" -#: templates/admin/filer/folder/choose_copy_destination.html:39 +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 msgid "Copy" msgstr "Copier" -#: templates/admin/filer/folder/choose_images_resize_options.html:12 +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "Il est impossible de copier des fichiers dans le même dossier" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 msgid "" "Your account doesn't have permissions to resize all of the selected images." -msgstr "" -"Votre compte na pas les permissions necessaires pour redimensionner toutes " -"les images sélectionnées." +msgstr "Votre compte na pas les permissions nécessaires pour redimensionner toutes les images sélectionnées." -#: templates/admin/filer/folder/choose_images_resize_options.html:15 +#: templates/admin/filer/folder/choose_images_resize_options.html:18 msgid "There are no images available to resize." msgstr "Il n'y a aucune image disponible à redimensionner." -#: templates/admin/filer/folder/choose_images_resize_options.html:17 +#: templates/admin/filer/folder/choose_images_resize_options.html:20 msgid "The following images will be resized:" msgstr "Les images suivantes seront redimensionnées :" -#: templates/admin/filer/folder/choose_images_resize_options.html:30 -msgid "Choose an existing thumbnail option or enter resize parameters:" -msgstr "" -"Choisissez une option de miniature ou entrez des paramètres de " -"redimensionnement :" - #: templates/admin/filer/folder/choose_images_resize_options.html:32 -msgid "Choose resize parameters:" -msgstr "Choisissez des paramètres de redimensionnement :" +msgid "Choose an existing thumbnail option or enter resize parameters:" +msgstr "Choisissez une option de miniature existante ou entrez des paramètres de redimensionnement :" -#: templates/admin/filer/folder/choose_images_resize_options.html:35 +#: templates/admin/filer/folder/choose_images_resize_options.html:36 msgid "" "Warning: Images will be resized in-place and originals will be lost. Maybe " "first make a copy of them to retain the originals." -msgstr "" -"Avertissement : Le redimensionnement des images écrasera les originaux. " -"Faites en éventuellement une copie afin de conserver les originaux." +msgstr "Avertissement : Les images seront redimensionnées en place et les originales seront perdues. Faites-en éventuellement une copie préalable afin de les conserver." -#: templates/admin/filer/folder/choose_images_resize_options.html:36 +#: templates/admin/filer/folder/choose_images_resize_options.html:39 msgid "Resize" msgstr "Redimensionner" -#: templates/admin/filer/folder/choose_move_destination.html:12 +#: templates/admin/filer/folder/choose_move_destination.html:35 msgid "" -"Your account doesn't have permissions to move all of the selected files and/" -"or folders." -msgstr "" -"Votre compte n'a pas les permissions nécessaires pour déplacer tous les " -"fichiers et/ou dossiers sélectionnés." +"Your account doesn't have permissions to move all of the selected files " +"and/or folders." +msgstr "Votre compte n'a pas les permissions nécessaires pour déplacer tous les fichiers et/ou dossiers sélectionnés." -#: templates/admin/filer/folder/choose_move_destination.html:18 +#: templates/admin/filer/folder/choose_move_destination.html:47 msgid "There are no files and/or folders available to move." -msgstr "Il n'y a pas de fichiers et/ou de dossiers disponibles à déplacer." +msgstr "Il n'y a pas de fichiers et/ou dossiers disponibles à déplacer." -#: templates/admin/filer/folder/choose_move_destination.html:20 +#: templates/admin/filer/folder/choose_move_destination.html:52 msgid "" "The following files and/or folders will be moved to a destination folder " "(retaining their tree structure):" -msgstr "" -"Les fichiers et/ou dossiers suivants seront déplacés vers un dossier de " -"destination (en conservant leur arborescence) :" +msgstr "Les fichiers et/ou dossiers suivants seront déplacés vers un dossier de destination (en conservant leur arborescence) :" -#: templates/admin/filer/folder/choose_move_destination.html:38 +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 msgid "Move" msgstr "Déplacer" -#: templates/admin/filer/folder/choose_rename_format.html:12 +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "Il est impossible de déplacer des fichiers dans le même dossier" + +#: templates/admin/filer/folder/choose_rename_format.html:15 msgid "" "Your account doesn't have permissions to rename all of the selected files." -msgstr "" -"Votre compte n'a pas les permissions nécessaires pour renommer tous les " -"fichiers sélectionnés." +msgstr "Votre compte n'a pas les permissions nécessaires pour renommer tous les fichiers sélectionnés." -#: templates/admin/filer/folder/choose_rename_format.html:15 +#: templates/admin/filer/folder/choose_rename_format.html:18 msgid "There are no files available to rename." msgstr "Il n'y a pas de fichiers disponibles à renommer." -#: templates/admin/filer/folder/choose_rename_format.html:17 +#: templates/admin/filer/folder/choose_rename_format.html:20 msgid "" "The following files will be renamed (they will stay in their folders and " "keep original filename, only displayed filename will be changed):" -msgstr "" -"Les fichiers suivants seront renommés (ils resteront dans leurs dossiers et " -"conserveront leur nom de fichier d'origine ; seul le nom affiché sera " -"changé) :" +msgstr "Les fichiers suivants seront renommés (ils resteront dans leurs dossiers et conserveront leur nom de fichier d'origine ; seul le nom affiché sera changé) :" -#: templates/admin/filer/folder/choose_rename_format.html:54 +#: templates/admin/filer/folder/choose_rename_format.html:59 msgid "Rename" msgstr "Renommer" -#: templates/admin/filer/folder/directory_listing.html:66 -msgid "Adds a new Folder" -msgstr "Ajoute un nouveau Dossier" +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "Retourner au dossier parent" -#: templates/admin/filer/folder/directory_listing.html:66 -#: templates/image_filer/include/export_dialog.html:34 -msgid "New Folder" -msgstr "Nouveau Dossier" +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "Modifier les détails du dossier actuel" -#: templates/admin/filer/folder/directory_listing.html:67 -msgid "upload files" -msgstr "transférer des fichiers" +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "Modifier" -#: templates/admin/filer/folder/directory_listing.html:67 -msgid "Upload" -msgstr "Transférer" +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "Cliquez ici pour lancer la recherche pour la phrase saisie" -#: templates/admin/filer/folder/directory_listing.html:74 -msgid "Go back to the parent folder" -msgstr "Retourner au dossier parent" +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "Rechercher" -#: templates/admin/filer/folder/directory_listing.html:76 -#: templates/admin/filer/folder/directory_table.html:29 -#: templates/admin/filer/tools/search_form.html:18 -#, python-format -msgid "1 folder" -msgid_plural "%(counter)s folders" -msgstr[0] "1 dossier" -msgstr[1] "%(counter)s dossiers" +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "Fermer" -#: templates/admin/filer/folder/directory_listing.html:76 -#: templates/admin/filer/folder/directory_table.html:29 -#: templates/admin/filer/tools/search_form.html:19 -#, python-format -msgid "1 file" -msgid_plural "%(counter)s files" -msgstr[0] "1 fichier" -msgstr[1] "%(counter)s fichiers" +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "Limite" -#: templates/admin/filer/folder/directory_listing.html:80 -msgid "Change current folder details" -msgstr "Modifie les détails du dossier courant" +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "Cochez pour limiter la recherche au dossier actuel" -#: templates/admin/filer/folder/directory_listing.html:80 -#: templates/admin/filer/folder/directory_table.html:27 -#: templates/admin/filer/folder/directory_table.html:43 -msgid "Change" -msgstr "Modifier" +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "Limiter la recherche au dossier actuel" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "Supprimer" + +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "Ajoute un nouveau dossier" + +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "Nouveau dossier" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "Téléverser des fichiers" + +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "Vous devez d'abord sélectionner un dossier" -#: templates/admin/filer/folder/directory_table.html:13 +#: templates/admin/filer/folder/directory_table_list.html:16 msgid "Name" msgstr "Nom" -#: templates/admin/filer/folder/directory_table.html:23 -#: templates/admin/filer/folder/directory_table.html:27 -#: templates/admin/filer/folder/directory_table.html:29 +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "Propriétaire" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "Taille" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "Action" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 #, python-format msgid "Change '%(item_label)s' folder details" msgstr "Modifier les détails du dossier « %(item_label)s »" -#: templates/admin/filer/folder/directory_table.html:30 -#: templates/admin/filer/folder/directory_table.html:45 -msgid "Owner" -msgstr "Propriétaire" +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "%(counter)s folder" +msgstr[1] "%(counter)s folders" +msgstr[2] "%(counter)s folders" -#: templates/admin/filer/folder/directory_table.html:37 +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "%(counter)s fichier" +msgstr[1] "%(counter)s fichiers" +msgstr[2] "%(counter)s fichiers" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "Changer les détails du dossier" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "Supprimer le dossier" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 msgid "Select this file" msgstr "Sélectionner ce fichier" -#: templates/admin/filer/folder/directory_table.html:39 -#: templates/admin/filer/folder/directory_table.html:43 -#: templates/admin/filer/folder/directory_table.html:44 +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 #, python-format msgid "Change '%(item_label)s' details" msgstr "Change les détails de « %(item_label)s »" -#: templates/admin/filer/folder/directory_table.html:42 -#, python-format -msgid "Delete '%(item_label)s'" -msgstr "Supprimer « %(item_label)s »" - -#: templates/admin/filer/folder/directory_table.html:42 -msgid "Delete" -msgstr "Supprimer" - -#: templates/admin/filer/folder/directory_table.html:46 +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 msgid "Permissions" msgstr "Permissions" -#: templates/admin/filer/folder/directory_table.html:46 +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 msgid "disabled" msgstr "désactivé" -#: templates/admin/filer/folder/directory_table.html:46 +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 msgid "enabled" msgstr "activé" -#: templates/admin/filer/folder/directory_table.html:50 -msgid "Move to clipboard" -msgstr "Déplacer vers le presse-papiers" +#: templates/admin/filer/folder/directory_table_list.html:144 +#| msgid "Move selected files to clipboard" +msgid "URL copied to clipboard" +msgstr "L'URL a été copiée dans le presse-papier" -#: templates/admin/filer/folder/directory_table.html:58 -msgid "there are no files or subfolders" -msgstr "il n'y a pas de fichiers ou de sous-dossiers" +#: templates/admin/filer/folder/directory_table_list.html:147 +#, python-format +#| msgid "Change '%(item_label)s' details" +msgid "Canonical url '%(item_label)s'" +msgstr "url canonique '%(item_label)s' " -#: templates/admin/filer/folder/directory_table.html:65 +#: templates/admin/filer/folder/directory_table_list.html:151 +#, python-format +#| msgid "Change '%(item_label)s' details" +msgid "Download '%(item_label)s'" +msgstr "Télécharger '%(item_label)s' " + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "Supprimer le fichier" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "Déposez des fichiers ici ou utilisez le bouton « Téléverser des fichiers »" + +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "Déposez votre fichier à téléverser dans :" + +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "Téléverser" + +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "annuler" + +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "Téléversement réussi !" + +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "Téléversement annulé !" + +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 msgid "previous" msgstr "précédent" -#: templates/admin/filer/folder/directory_table.html:69 +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 #, python-format -msgid "" -"\n" -" Page %(number)s of %(num_pages)s.\n" -" " -msgstr "" -"\n" -" Page %(number)s de %(num_pages)s.\n" -" " +msgid "Page %(number)s of %(num_pages)s." +msgstr "Page %(number)s sur %(num_pages)s." -#: templates/admin/filer/folder/directory_table.html:75 +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 msgid "next" msgstr "suivant" +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "Sélectionner les %(total_count)s" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +#| msgid "Select this file" +msgid "Select all" +msgstr "Tout sélectionner" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +#| msgid "Filer" +msgid "Files" +msgstr "Fichiers" + #: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 msgid "Add new" -msgstr "Ajouter nouveau" +msgstr "Ajouter un nouveau" + +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" +msgstr "Django site admin" -#: templates/admin/filer/folder/new_folder_form.html:13 +#: templates/admin/filer/folder/new_folder_form.html:15 msgid "Please correct the error below." msgid_plural "Please correct the errors below." msgstr[0] "Veuillez corriger l'erreur suivante." msgstr[1] "Veuillez corriger les erreurs suivantes." +msgstr[2] "Veuillez corriger les erreurs suivantes." -#: templates/admin/filer/folder/new_folder_form.html:28 +#: templates/admin/filer/folder/new_folder_form.html:30 msgid "Save" msgstr "Sauvegarder" -#: templates/admin/filer/image/change_form.html:21 -msgid "Full size preview" -msgstr "Afficher en pleine taille" +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." +msgstr "Votre navigateur ne supporte pas l'audio." -#: templates/admin/filer/tools/search_form.html:8 -#: templates/admin/filer/tools/search_form.html:14 -msgid "Search" -msgstr "Rechercher" +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." +msgstr "Votre navigateur ne supporte pas la vidéo." + +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "Presse-papiers" -#: templates/admin/filer/tools/search_form.html:13 -msgid "Enter your search phrase here" -msgstr "Entrez votre phrase de recherche ici" +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "Coller tous les éléments ici" -#: templates/admin/filer/tools/search_form.html:14 -msgid "Click here to" -msgstr "Cliquez ici pour" +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "Déplacer tous les fichiers du presse-papiers vers" -#: templates/admin/filer/tools/search_form.html:14 -msgid "run search for entered phrase" -msgstr "lancer votre recherche" +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "Vider le presse-papiers" -#: templates/admin/filer/tools/search_form.html:15 -msgid "Check it to" -msgstr "Cochez pour" +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "Le presse-papiers est vide" -#: templates/admin/filer/tools/search_form.html:15 -#: templates/admin/filer/tools/search_form.html:16 -msgid "limit the search to current folder" -msgstr "Limiter la recherche au dossier courant" +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "transfert échoué" -#: templates/admin/filer/tools/search_form.html:18 +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" +msgstr "Télécharger" + +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" +msgstr "Agrandir" + +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +#| msgid "file missing" +msgid "File is missing" +msgstr "Le fichier est manquant" + +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "Type" + +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "Taille de fichier" + +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "Modifié" + +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "Créé" + +#: templates/admin/filer/tools/search_form.html:5 msgid "found" msgstr "trouvé :" -#: templates/admin/filer/tools/search_form.html:18 +#: templates/admin/filer/tools/search_form.html:5 msgid "and" msgstr "et" -#: templates/admin/filer/tools/search_form.html:19 +#: templates/admin/filer/tools/search_form.html:7 msgid "cancel search" msgstr "annuler la recherche" -#: templates/admin/filer/tools/upload_button_js.html:24 -#: templates/admin/filer/widgets/admin_file.html:7 -#: templates/admin/filer/widgets/admin_file.html:8 -msgid "file missing" -msgstr "fichier manquant" +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "Effacer" -#: templates/admin/filer/tools/clipboard/clipboard.html:7 -msgid "Clipboard" -msgstr "Presse-papiers" +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "ou déposez votre fichier ici" -#: templates/admin/filer/tools/clipboard/clipboard.html:19 -msgid "Paste all items here" -msgstr "Coller tous les éléments ici" +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "pas de fichier sélectionné" -#: templates/admin/filer/tools/clipboard/clipboard.html:26 -msgid "discard" -msgstr "Vider" +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "Recherche" -#: templates/admin/filer/tools/clipboard/clipboard.html:26 -msgid "Move all clipboard files to" -msgstr "Déplacer tous les fichiers du presse-papiers vers" +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "Sélectionner un fichier" -#: templates/admin/filer/tools/clipboard/clipboard.html:43 -msgid "the clipboard is empty" -msgstr "Le presse-papiers est vide" +#: templates/admin/filer/widgets/admin_folder.html:16 +#| msgid "Choose File" +msgid "Choose Folder" +msgstr "Choisissez un dossier" -#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:11 -msgid "upload failed" -msgstr "transfert échoué" +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" +msgstr "Fichier \"{file_name}\" : Hébergement refusé par la politique de sécurité du site" -#: templates/admin/filer/widgets/admin_file.html:11 -msgid "no file selected" -msgstr "pas de fichier sélectionné" +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" +msgstr "Fichier \"{file_name}\" : hébergement de {file_type} refusé par la politique de sécurité du site" -#: templates/admin/filer/widgets/admin_file.html:14 -#: templates/admin/filer/widgets/admin_file.html:15 -#: templates/admin/filer/widgets/admin_folder.html:7 -#: templates/admin/filer/widgets/admin_folder.html:8 -msgid "Lookup" -msgstr "Recherche" +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" +msgstr "Fichier \"{file_name}\" : hébergement HTML refusé par la politique de sécurité du site" -#: templates/admin/filer/widgets/admin_file.html:17 -#: templates/admin/filer/widgets/admin_folder.html:10 -msgid "Clear" -msgstr "Effacer" +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" +msgstr "Fichier \"{file_name}\" : Rejeté à cause d'une potentielle vulnérabilité de cross-site scripting" -#: templates/admin/filer/widgets/admin_folder.html:5 -msgid "none selected" -msgstr "aucune sélection" +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" +msgstr "Fichier \"{file_name}\": le format de fichier SVG n'est pas reconnu" -#: templates/image_filer/folder.html:3 -#, python-format -msgid "Folder '%(folder_label)s' files" -msgstr "Fichiers du dossier « %(folder_label)s »" +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." -#: templates/image_filer/folder.html:6 -msgid "File name" -msgstr "Nom de fichier" +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" -#: templates/image_filer/image_export_form.html:17 -msgid "export" -msgstr "exporter" +#~ msgid "Open file" +#~ msgstr "Open file" -#: templates/image_filer/image_export_form.html:27 -msgid "download image" -msgstr "télécharger l'image" +#~ msgid "Full size preview" +#~ msgstr "Full size preview" -#: templates/image_filer/include/export_dialog.html:13 -msgid "Folder name already taken." -msgstr "Nom de dossier déjà utilisé." +#~ msgid "Add Description" +#~ msgstr "Add Description" -#: templates/image_filer/include/export_dialog.html:15 -msgid "Submit" -msgstr "Envoyer" +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" + +#~ msgid "none selected" +#~ msgstr "none selected" + +#~ msgid "Add Folder" +#~ msgstr "Add Folder" + +#~ msgid "Subject Location" +#~ msgstr "Subject location" + +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" +#~ msgstr[1] "15c0f2d28d6dab1af1f6d94906beb627_pl_1" +#~ msgstr[2] "15c0f2d28d6dab1af1f6d94906beb627_pl_2" + +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/gl/LC_MESSAGES/django.mo b/filer/locale/gl/LC_MESSAGES/django.mo new file mode 100644 index 000000000..888daadd0 Binary files /dev/null and b/filer/locale/gl/LC_MESSAGES/django.mo differ diff --git a/filer/locale/gl/LC_MESSAGES/django.po b/filer/locale/gl/LC_MESSAGES/django.po new file mode 100644 index 000000000..57767645d --- /dev/null +++ b/filer/locale/gl/LC_MESSAGES/django.po @@ -0,0 +1,1228 @@ +# 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: +# Translators: +# Pablo, 2015 +# Pablo, 2015 +msgid "" +msgstr "" +"Project-Id-Version: django Filer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: Pablo, 2015\n" +"Language-Team: Galician (http://app.transifex.com/divio/django-filer/" +"language/gl/)\n" +"Language: gl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: admin/clipboardadmin.py:17 +msgid "You do not have permission to upload files." +msgstr "" + +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "" + +#: admin/clipboardadmin.py:20 +msgid "Can't use this folder, Permission Denied. Please select another folder." +msgstr "" + +#: admin/fileadmin.py:73 +msgid "Advanced" +msgstr "Avanzado" + +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" + +#: admin/folderadmin.py:434 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s seleccionados" +msgstr[1] "Os %(total_count)s seleccionados" + +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "" + +#: admin/folderadmin.py:475 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 de %(cnt)s seleccionados" + +#: admin/folderadmin.py:612 +msgid "No action selected." +msgstr "Ningunha acción seleccionada." + +#: admin/folderadmin.py:664 +#, python-format +msgid "Successfully moved %(count)d files to clipboard." +msgstr "Movéronse correctamente %(count)d arquivos ao portapapeis." + +#: admin/folderadmin.py:669 +msgid "Move selected files to clipboard" +msgstr "Mover arquivos seleccionados ao portapapeis." + +#: admin/folderadmin.py:709 +#, python-format +msgid "Successfully disabled permissions for %(count)d files." +msgstr "" + +#: admin/folderadmin.py:711 +#, python-format +msgid "Successfully enabled permissions for %(count)d files." +msgstr "" + +#: admin/folderadmin.py:719 +msgid "Enable permissions for selected files" +msgstr "" + +#: admin/folderadmin.py:725 +msgid "Disable permissions for selected files" +msgstr "" + +#: admin/folderadmin.py:789 +#, python-format +msgid "Successfully deleted %(count)d files and/or folders." +msgstr "" + +#: admin/folderadmin.py:794 +msgid "Cannot delete files and/or folders" +msgstr "Non se poden borrar arquivos e/ou carpetas" + +#: admin/folderadmin.py:796 +msgid "Are you sure?" +msgstr "Estás seguro?" + +#: admin/folderadmin.py:802 +msgid "Delete files and/or folders" +msgstr "Borrar arquivos e/ou carpetas" + +#: admin/folderadmin.py:823 +msgid "Delete selected files and/or folders" +msgstr "" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "" + +#: admin/folderadmin.py:934 +#, python-format +msgid "" +"Successfully moved %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" + +#: admin/folderadmin.py:942 admin/folderadmin.py:944 +msgid "Move files and/or folders" +msgstr "Mover alquivos e/ou carpetas" + +#: admin/folderadmin.py:959 +msgid "Move selected files and/or folders" +msgstr "Mover arquivos e/ou carpetas seleccionados" + +#: admin/folderadmin.py:1016 +#, python-format +msgid "Successfully renamed %(count)d files." +msgstr "" + +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 +msgid "Rename files" +msgstr "" + +#: admin/folderadmin.py:1137 +#, python-format +msgid "" +"Successfully copied %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" + +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 +msgid "Copy files and/or folders" +msgstr "Copiar arquivos e/ou carpetas" + +#: admin/folderadmin.py:1174 +msgid "Copy selected files and/or folders" +msgstr "Copiar arquivos e/ou carpetas seleccionados" + +#: admin/folderadmin.py:1279 +#, python-format +msgid "Successfully resized %(count)d images." +msgstr "" + +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 +msgid "Resize images" +msgstr "Cambiar o tamaño das imaxes" + +#: admin/folderadmin.py:1303 +msgid "Resize selected images" +msgstr "Cambiar o tamaño das imaxes seleccionadas" + +#: admin/forms.py:24 +msgid "Suffix which will be appended to filenames of copied files." +msgstr "" + +#: admin/forms.py:31 +#, python-format +msgid "" +"Suffix should be a valid, simple and lowercase filename part, like " +"\"%(valid)s\"." +msgstr "" + +#: admin/forms.py:52 +#, python-format +msgid "Unknown rename format value key \"%(key)s\"." +msgstr "" + +#: admin/forms.py:54 +#, python-format +msgid "Invalid rename format: %(error)s." +msgstr "Formato para o cambio de nome non válido: %(error)s." + +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 +msgid "thumbnail option" +msgstr "opción da miniatura" + +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 +msgid "width" +msgstr "ancho" + +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 +msgid "height" +msgstr "alto" + +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 +msgid "crop" +msgstr "recortar" + +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 +msgid "upscale" +msgstr "ampliar" + +#: admin/forms.py:79 +msgid "Thumbnail option or resize parameters must be choosen." +msgstr "" + +#: admin/imageadmin.py:20 admin/imageadmin.py:112 +msgid "Subject location" +msgstr "" + +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "" + +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "" + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "" + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "" + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" +msgstr "" + +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" +msgstr "" + +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "" + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "" + +#: models/abstract.py:62 +msgid "default alt text" +msgstr "texto alternativo por defecto" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "lenda por defecto" + +#: models/abstract.py:76 +msgid "subject location" +msgstr "" + +#: models/abstract.py:91 +msgid "image" +msgstr "imaxe" + +#: models/abstract.py:92 +msgid "images" +msgstr "imaxes" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "" + +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." +msgstr "" + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 +msgid "user" +msgstr "usuario" + +#: models/clipboardmodels.py:17 models/filemodels.py:157 +msgid "files" +msgstr "arquivos" + +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 +msgid "clipboard" +msgstr "portapapeis" + +#: models/clipboardmodels.py:25 +msgid "clipboards" +msgstr "portapapeis" + +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 +msgid "file" +msgstr "arquivo" + +#: models/clipboardmodels.py:56 +msgid "clipboard item" +msgstr "elemento do portapapeis" + +#: models/clipboardmodels.py:57 +msgid "clipboard items" +msgstr "elementos do portapapeis" + +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "folder" +msgstr "carpeta" + +#: models/filemodels.py:81 +msgid "file size" +msgstr "tamaño do arquivo" + +#: models/filemodels.py:87 +msgid "sha1" +msgstr "sha1" + +#: models/filemodels.py:94 +msgid "has all mandatory data" +msgstr "ten todos os datos obrigatorios" + +#: models/filemodels.py:100 +msgid "original filename" +msgstr "nome do arquivo orixinal" + +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 +msgid "name" +msgstr "nome" + +#: models/filemodels.py:116 +msgid "description" +msgstr "descrición" + +#: models/filemodels.py:125 models/foldermodels.py:108 +msgid "owner" +msgstr "propietario" + +#: models/filemodels.py:129 models/foldermodels.py:116 +msgid "uploaded at" +msgstr "subido a" + +#: models/filemodels.py:134 models/foldermodels.py:126 +msgid "modified at" +msgstr "modificado o" + +#: models/filemodels.py:140 +msgid "Permissions disabled" +msgstr "Permisos desactivados" + +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "" + +#: models/foldermodels.py:94 +msgid "parent" +msgstr "" + +#: models/foldermodels.py:121 +msgid "created at" +msgstr "creado o" + +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Folder" +msgstr "Carpeta" + +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 +msgid "Folders" +msgstr "Carpetas" + +#: models/foldermodels.py:260 +msgid "all items" +msgstr "todos os elementos" + +#: models/foldermodels.py:261 +msgid "this item only" +msgstr "só este elemento" + +#: models/foldermodels.py:262 +msgid "this item and all children" +msgstr "este elemento e todos os fillos" + +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "" + +#: models/foldermodels.py:280 +msgid "type" +msgstr "tipo" + +#: models/foldermodels.py:297 +msgid "group" +msgstr "grupo" + +#: models/foldermodels.py:304 +msgid "everybody" +msgstr "todos" + +#: models/foldermodels.py:309 +msgid "can read" +msgstr "pode ler" + +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "pode editar" + +#: models/foldermodels.py:325 +msgid "can add children" +msgstr "pode engadir fillos" + +#: models/foldermodels.py:333 +msgid "folder permission" +msgstr "permiso da carpeta" + +#: models/foldermodels.py:334 +msgid "folder permissions" +msgstr "permisos da carpeta" + +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." +msgstr "" + +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." +msgstr "" + +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." +msgstr "" + +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." +msgstr "" + +#: models/foldermodels.py:360 +msgid "All Folders" +msgstr "" + +#: models/foldermodels.py:362 +msgid "Logical Path" +msgstr "" + +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" +msgstr "" + +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" +msgstr "" + +#: models/foldermodels.py:375 +msgid "Everybody" +msgstr "" + +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "" + +#: models/foldermodels.py:389 +msgid "Read" +msgstr "" + +#: models/foldermodels.py:390 +msgid "Add children" +msgstr "" + +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "data" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "autor" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "" + +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "" + +#: models/virtualitems.py:73 +msgid "files with missing metadata" +msgstr "" + +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "root" +msgstr "" + +#: settings.py:273 +msgid "Show table view" +msgstr "" + +#: settings.py:278 +msgid "Show thumbnail view" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Run the selected action" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Go" +msgstr "" + +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +msgid "Click here to select the objects across all pages" +msgstr "" + +#: templates/admin/filer/actions.html:14 +#, python-format +msgid "Select all %(total_count)s files and/or folders" +msgstr "" + +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 +msgid "Clear selection" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 +msgid "Go back to admin homepage" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 +msgid "Home" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 +msgid "Go back to Filer app" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Go back to root folder" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:8 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 +#, python-format +msgid "Go back to '%(folder_name)s' folder" +msgstr "" + +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:11 +msgid "" +"Deleting the selected files and/or folders would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:19 +msgid "" +"Deleting the selected files and/or folders would require deleting the " +"following protected related objects:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:27 +msgid "" +"Are you sure you want to delete the selected files and/or folders? All of " +"the following objects and their related items will be deleted:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "" + +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 +msgid "History" +msgstr "" + +#: templates/admin/filer/file/change_form.html:37 +#: templates/admin/filer/folder/change_form.html:23 +#: templates/admin/filer/image/change_form.html:37 +msgid "View on site" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 +msgid "Folder Icon" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:23 +msgid "" +"Your account doesn't have permissions to copy all of the selected files and/" +"or folders." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 +msgid "There are no destination folders available." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:35 +msgid "There are no files and/or folders available to copy." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:40 +msgid "" +"The following files and/or folders will be copied to a destination folder " +"(retaining their tree structure):" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 +msgid "Destination folder:" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 +msgid "Copy" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 +msgid "" +"Your account doesn't have permissions to resize all of the selected images." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:18 +msgid "There are no images available to resize." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:20 +msgid "The following images will be resized:" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:32 +msgid "Choose an existing thumbnail option or enter resize parameters:" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:36 +msgid "" +"Warning: Images will be resized in-place and originals will be lost. Maybe " +"first make a copy of them to retain the originals." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:39 +msgid "Resize" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:35 +msgid "" +"Your account doesn't have permissions to move all of the selected files and/" +"or folders." +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:47 +msgid "There are no files and/or folders available to move." +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:52 +msgid "" +"The following files and/or folders will be moved to a destination folder " +"(retaining their tree structure):" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 +msgid "Move" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:15 +msgid "" +"Your account doesn't have permissions to rename all of the selected files." +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:18 +msgid "There are no files available to rename." +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:20 +msgid "" +"The following files will be renamed (they will stay in their folders and " +"keep original filename, only displayed filename will be changed):" +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:59 +msgid "Rename" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:16 +msgid "Name" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 +#, python-format +msgid "Change '%(item_label)s' folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "" +msgstr[1] "" + +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "" +msgstr[1] "" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 +msgid "Select this file" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 +#, python-format +msgid "Change '%(item_label)s' details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "Permissions" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "disabled" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "enabled" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:144 +#, fuzzy +#| msgid "Move selected files to clipboard" +msgid "URL copied to clipboard" +msgstr "Mover arquivos seleccionados ao portapapeis." + +#: templates/admin/filer/folder/directory_table_list.html:147 +#, python-format +msgid "Canonical url '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:151 +#, python-format +msgid "Download '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 +msgid "previous" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 +#, python-format +msgid "Page %(number)s of %(num_pages)s." +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 +msgid "next" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +msgid "Select all" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +msgid "Files" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +msgid "Add new" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:15 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "" +msgstr[1] "" + +#: templates/admin/filer/folder/new_folder_form.html:30 +msgid "Save" +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +msgid "File is missing" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "found" +msgstr "atopado" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "and" +msgstr "e" + +#: templates/admin/filer/tools/search_form.html:7 +msgid "cancel search" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "" + +#: templates/admin/filer/widgets/admin_folder.html:16 +msgid "Choose Folder" +msgstr "" + +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" +msgstr "" + +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" +msgstr "" + +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" +msgstr "" + +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" +msgstr "" + +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" +msgstr "" + +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." + +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" + +#~ msgid "Open file" +#~ msgstr "Open file" + +#~ msgid "Full size preview" +#~ msgstr "Full size preview" + +#~ msgid "Add Description" +#~ msgstr "Add Description" + +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" + +#~ msgid "none selected" +#~ msgstr "none selected" + +#~ msgid "Add Folder" +#~ msgstr "Add Folder" + +#~ msgid "Subject Location" +#~ msgstr "Subject location" + +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" +#~ msgstr[1] "15c0f2d28d6dab1af1f6d94906beb627_pl_1" + +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/he/LC_MESSAGES/django.mo b/filer/locale/he/LC_MESSAGES/django.mo new file mode 100644 index 000000000..f1dc779e0 Binary files /dev/null and b/filer/locale/he/LC_MESSAGES/django.mo differ diff --git a/filer/locale/he/LC_MESSAGES/django.po b/filer/locale/he/LC_MESSAGES/django.po new file mode 100644 index 000000000..6bd35b217 --- /dev/null +++ b/filer/locale/he/LC_MESSAGES/django.po @@ -0,0 +1,1249 @@ +# 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: +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django Filer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: Angelo Dini \n" +"Language-Team: Hebrew (http://app.transifex.com/divio/django-filer/language/" +"he/)\n" +"Language: he\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % " +"1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: admin/clipboardadmin.py:17 +msgid "You do not have permission to upload files." +msgstr "" + +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "" + +#: admin/clipboardadmin.py:20 +msgid "Can't use this folder, Permission Denied. Please select another folder." +msgstr "" + +#: admin/fileadmin.py:73 +msgid "Advanced" +msgstr "מתקדם" + +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "יש לבחור פריטים על מנת לבצע עליהם פעולות. לא בוצעו פעולות." + +#: admin/folderadmin.py:434 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "אחד נבחר" +msgstr[1] "כל ה-%(total_count)s נבחרו" +msgstr[2] "כל ה-%(total_count)s נבחרו" +msgstr[3] "כל ה-%(total_count)s נבחרו" + +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "" + +#: admin/folderadmin.py:475 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 מתוך %(cnt)s נבחרו" + +#: admin/folderadmin.py:612 +msgid "No action selected." +msgstr "לא נבחרה פעולה." + +#: admin/folderadmin.py:664 +#, python-format +msgid "Successfully moved %(count)d files to clipboard." +msgstr "הועברו בהצלחה %(count)d קבצים ללוח" + +#: admin/folderadmin.py:669 +msgid "Move selected files to clipboard" +msgstr "העבר קבצים שנבחרו ללוח" + +#: admin/folderadmin.py:709 +#, python-format +msgid "Successfully disabled permissions for %(count)d files." +msgstr "בוטלו בהצלחה הרשאות עבור %(count)d קבצים." + +#: admin/folderadmin.py:711 +#, python-format +msgid "Successfully enabled permissions for %(count)d files." +msgstr "אופשרו בהצלחה הרשאות עבור %(count)d קבצים." + +#: admin/folderadmin.py:719 +msgid "Enable permissions for selected files" +msgstr "אופשרו הרשאות עבור קבצים בחורים" + +#: admin/folderadmin.py:725 +msgid "Disable permissions for selected files" +msgstr "בוטלו הרשאות עבור קבצים בחורים" + +#: admin/folderadmin.py:789 +#, python-format +msgid "Successfully deleted %(count)d files and/or folders." +msgstr "נמחקו בהצלחה %(count)d קבצים ו/או תיקיות." + +#: admin/folderadmin.py:794 +msgid "Cannot delete files and/or folders" +msgstr "לא ניתן למחוק קבצים ו/או תיקיות" + +#: admin/folderadmin.py:796 +msgid "Are you sure?" +msgstr "האם את/ה בטוח/ה?" + +#: admin/folderadmin.py:802 +msgid "Delete files and/or folders" +msgstr "מחק קבצים ו/או תיקיות" + +#: admin/folderadmin.py:823 +msgid "Delete selected files and/or folders" +msgstr "מחק קבצים ו/או תיקיות בחורים" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "" + +#: admin/folderadmin.py:934 +#, python-format +msgid "" +"Successfully moved %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "הועברו בהצלחה %(count)d קבצים ו/או תיקיות לתיקיה '%(destination)s'." + +#: admin/folderadmin.py:942 admin/folderadmin.py:944 +msgid "Move files and/or folders" +msgstr "העבר קבצים ו/או תיקיות" + +#: admin/folderadmin.py:959 +msgid "Move selected files and/or folders" +msgstr "העבר קבצים ו/או תיקיות בחורים" + +#: admin/folderadmin.py:1016 +#, python-format +msgid "Successfully renamed %(count)d files." +msgstr "שונו בהצלחה שמותיהם של %(count)d קבצים." + +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 +msgid "Rename files" +msgstr "שנה שמות קבצים" + +#: admin/folderadmin.py:1137 +#, python-format +msgid "" +"Successfully copied %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "הועתקו בהצלחה %(count)d קבצים ו/או תיקיות לתיקיה '%(destination)s'." + +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 +msgid "Copy files and/or folders" +msgstr "העתק קבצים ו/או תיקיות" + +#: admin/folderadmin.py:1174 +msgid "Copy selected files and/or folders" +msgstr "העתק קבצים ו/או תיקיות בחורים" + +#: admin/folderadmin.py:1279 +#, python-format +msgid "Successfully resized %(count)d images." +msgstr "שונה בהצלחה גודלם של %(count)d תמונות." + +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 +msgid "Resize images" +msgstr "שנה גודל תמונות" + +#: admin/folderadmin.py:1303 +msgid "Resize selected images" +msgstr "שנה גודל תמונות בחורות" + +#: admin/forms.py:24 +msgid "Suffix which will be appended to filenames of copied files." +msgstr "סיומת אשר תתווסף לשמות קבצים שהועתקו." + +#: admin/forms.py:31 +#, python-format +msgid "" +"Suffix should be a valid, simple and lowercase filename part, like " +"\"%(valid)s\"." +msgstr "על הסיומת להיות תקינה, פשוטה ובאותיות קטנות, כגון \"%(valid)s\"." + +#: admin/forms.py:52 +#, python-format +msgid "Unknown rename format value key \"%(key)s\"." +msgstr "ערך מפתח תבנית שינוי השם \"%(key)s\". אינו חוקי." + +#: admin/forms.py:54 +#, python-format +msgid "Invalid rename format: %(error)s." +msgstr "תבנית שינוי שם לא תקינה: %(error)s." + +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 +msgid "thumbnail option" +msgstr "אפשרות תמונה ממוזערת" + +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 +msgid "width" +msgstr "רוחב" + +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 +msgid "height" +msgstr "גובה" + +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 +msgid "crop" +msgstr "חיתוך" + +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 +msgid "upscale" +msgstr "הגדל" + +#: admin/forms.py:79 +msgid "Thumbnail option or resize parameters must be choosen." +msgstr "עליך לבחור אפשרות תמונה ממוזערת או פרמטרי שינוי גודל." + +#: admin/imageadmin.py:20 admin/imageadmin.py:112 +msgid "Subject location" +msgstr "מיקום נושא" + +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "" + +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "" + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "" + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "" + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" +msgstr "" + +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" +msgstr "" + +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "תיקיה בשם זה כבר קיימת." + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "Filer" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "" + +#: models/abstract.py:62 +msgid "default alt text" +msgstr "טקסט חלופי ברירת מחדל" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "כותרת ברירת מחדל" + +#: models/abstract.py:76 +msgid "subject location" +msgstr "מיקום נושא" + +#: models/abstract.py:91 +msgid "image" +msgstr "תמונה" + +#: models/abstract.py:92 +msgid "images" +msgstr "תמונות" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "" + +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." +msgstr "" + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 +msgid "user" +msgstr "משתמש" + +#: models/clipboardmodels.py:17 models/filemodels.py:157 +msgid "files" +msgstr "קבצים" + +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 +msgid "clipboard" +msgstr "לוח" + +#: models/clipboardmodels.py:25 +msgid "clipboards" +msgstr "לוחות" + +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 +msgid "file" +msgstr "קובץ" + +#: models/clipboardmodels.py:56 +msgid "clipboard item" +msgstr "פריט לוח" + +#: models/clipboardmodels.py:57 +msgid "clipboard items" +msgstr "פריטי לוח" + +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "folder" +msgstr "תיקיה" + +#: models/filemodels.py:81 +msgid "file size" +msgstr "גודל קובץ" + +#: models/filemodels.py:87 +msgid "sha1" +msgstr "sha1" + +#: models/filemodels.py:94 +msgid "has all mandatory data" +msgstr "כל המידע הנחוץ קיים" + +#: models/filemodels.py:100 +msgid "original filename" +msgstr "שם קובץ מקורי" + +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 +msgid "name" +msgstr "שם" + +#: models/filemodels.py:116 +msgid "description" +msgstr "תיאור" + +#: models/filemodels.py:125 models/foldermodels.py:108 +msgid "owner" +msgstr "בעלים" + +#: models/filemodels.py:129 models/foldermodels.py:116 +msgid "uploaded at" +msgstr "הועלה ב-" + +#: models/filemodels.py:134 models/foldermodels.py:126 +msgid "modified at" +msgstr "שונה ב-" + +#: models/filemodels.py:140 +msgid "Permissions disabled" +msgstr "הרשאות בוטלו" + +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "" + +#: models/foldermodels.py:94 +msgid "parent" +msgstr "" + +#: models/foldermodels.py:121 +msgid "created at" +msgstr "נוצר ב-" + +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Folder" +msgstr "תיקיה" + +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 +msgid "Folders" +msgstr "תיקיות" + +#: models/foldermodels.py:260 +msgid "all items" +msgstr "כל הפריטים" + +#: models/foldermodels.py:261 +msgid "this item only" +msgstr "פריט זה בלבד" + +#: models/foldermodels.py:262 +msgid "this item and all children" +msgstr "פריט זה וכל ילדיו" + +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "" + +#: models/foldermodels.py:280 +msgid "type" +msgstr "סוג" + +#: models/foldermodels.py:297 +msgid "group" +msgstr "קבוצה" + +#: models/foldermodels.py:304 +msgid "everybody" +msgstr "כל אחד" + +#: models/foldermodels.py:309 +msgid "can read" +msgstr "רשאי לקרוא" + +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "רשאי לערוך" + +#: models/foldermodels.py:325 +msgid "can add children" +msgstr "רשאי להוסיף ילדים" + +#: models/foldermodels.py:333 +msgid "folder permission" +msgstr "הרשאת תיקיה" + +#: models/foldermodels.py:334 +msgid "folder permissions" +msgstr "הרשאות תיקיה" + +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." +msgstr "" + +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." +msgstr "" + +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." +msgstr "" + +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." +msgstr "" + +#: models/foldermodels.py:360 +msgid "All Folders" +msgstr "" + +#: models/foldermodels.py:362 +msgid "Logical Path" +msgstr "" + +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" +msgstr "" + +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" +msgstr "" + +#: models/foldermodels.py:375 +msgid "Everybody" +msgstr "" + +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "" + +#: models/foldermodels.py:389 +msgid "Read" +msgstr "" + +#: models/foldermodels.py:390 +msgid "Add children" +msgstr "" + +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "תאריך צילום" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "מחבר" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "חייב תמיד לפרסם קרדיט מחבר" + +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "חייב תמיד לפרסם זכויות יוצרים" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "" + +#: models/virtualitems.py:73 +msgid "files with missing metadata" +msgstr "קבצים עם מטה נתונים חסרים" + +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "root" +msgstr "שורש" + +#: settings.py:273 +msgid "Show table view" +msgstr "" + +#: settings.py:278 +msgid "Show thumbnail view" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Run the selected action" +msgstr "הרץ את הפעולה הבחורה" + +#: templates/admin/filer/actions.html:5 +msgid "Go" +msgstr "בצע" + +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +msgid "Click here to select the objects across all pages" +msgstr "לחץ כאן כדי לבחור את האובייקטים על פני כל הדפים" + +#: templates/admin/filer/actions.html:14 +#, python-format +msgid "Select all %(total_count)s files and/or folders" +msgstr "בחר את כל ה- %(total_count)s קבצים ו/או התיקיות" + +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 +msgid "Clear selection" +msgstr "נקה בחירה" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 +msgid "Go back to admin homepage" +msgstr "חזור לדף הניהול הראשי" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 +msgid "Home" +msgstr "בית" + +#: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 +msgid "Go back to Filer app" +msgstr "חזור לאפליקציית Filer" + +#: templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Go back to root folder" +msgstr "חזור לתיקיית השורש" + +#: templates/admin/filer/breadcrumbs.html:8 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 +#, python-format +msgid "Go back to '%(folder_name)s' folder" +msgstr "חזור לתיקיה '%(folder_name)s'" + +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:11 +msgid "" +"Deleting the selected files and/or folders would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"עבור מחיקת הקבצים ו/או התיקיות הבחורים יש צורך למחוק אובייקטים מקושרים, אך " +"לחשבונך אין הרשאות למחוק אובייקטים מהסוגים הבאים:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:19 +msgid "" +"Deleting the selected files and/or folders would require deleting the " +"following protected related objects:" +msgstr "" +"עבור מחיקת הקבצים ו/או התיקיות הבחורים יש צורך למחוק את האובייקטים המוגנים " +"הבאים:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:27 +msgid "" +"Are you sure you want to delete the selected files and/or folders? All of " +"the following objects and their related items will be deleted:" +msgstr "" +"האם את/ה בטוח/ה שברצונך למחוק את הקבצים ו/או התיקיות הבחורים? כל הפריטים " +"המקושרים יימחקו:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "" + +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 +msgid "History" +msgstr "היסטוריה" + +#: templates/admin/filer/file/change_form.html:37 +#: templates/admin/filer/folder/change_form.html:23 +#: templates/admin/filer/image/change_form.html:37 +msgid "View on site" +msgstr "צפה בתוך האתר" + +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "חזור ל-" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "דף הניהול הראשי" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 +msgid "Folder Icon" +msgstr "צלמית תיקייה" + +#: templates/admin/filer/folder/choose_copy_destination.html:23 +msgid "" +"Your account doesn't have permissions to copy all of the selected files and/" +"or folders." +msgstr "לחשבונך אין רשות להעתיק את כל הקבצים ו/או התיקיות הבחורים." + +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 +msgid "There are no destination folders available." +msgstr "אין תיקיות יעד זמינות." + +#: templates/admin/filer/folder/choose_copy_destination.html:35 +msgid "There are no files and/or folders available to copy." +msgstr "אין קבצים ו/או תיקיות זמינים להעתקה." + +#: templates/admin/filer/folder/choose_copy_destination.html:40 +msgid "" +"The following files and/or folders will be copied to a destination folder " +"(retaining their tree structure):" +msgstr "" +"הקבצים ו/או התיקיות הבאים יועתקו לתיקיית יעד (תוך שמירה על מבנה העץ שלהם):" + +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 +msgid "Destination folder:" +msgstr "תיקיית יעד:" + +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 +msgid "Copy" +msgstr "העתק" + +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 +msgid "" +"Your account doesn't have permissions to resize all of the selected images." +msgstr "לחשבונך אין רשות לשנות גודלן של כל התמונות הבחורות." + +#: templates/admin/filer/folder/choose_images_resize_options.html:18 +msgid "There are no images available to resize." +msgstr "אין תמונות זמינות לשינוי גודלן." + +#: templates/admin/filer/folder/choose_images_resize_options.html:20 +msgid "The following images will be resized:" +msgstr "התמונות הבאות ישונה גודלן:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:32 +msgid "Choose an existing thumbnail option or enter resize parameters:" +msgstr "בחר אפשרות תמונה ממוזערת קיימת או הזן פרמטרי שינוי גודל:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:36 +msgid "" +"Warning: Images will be resized in-place and originals will be lost. Maybe " +"first make a copy of them to retain the originals." +msgstr "" +"הזהרה: התמונות ישונה גודלן במקום והמקוריות יאבדו. אולי ראשית עשה/י העתק שלהם " +"כדי לשמור על המקויות." + +#: templates/admin/filer/folder/choose_images_resize_options.html:39 +msgid "Resize" +msgstr "שנה גודל" + +#: templates/admin/filer/folder/choose_move_destination.html:35 +msgid "" +"Your account doesn't have permissions to move all of the selected files and/" +"or folders." +msgstr "לחשבונך אין רשות להעביר את כל הקבצים ו/או התיקיות הבחורים." + +#: templates/admin/filer/folder/choose_move_destination.html:47 +msgid "There are no files and/or folders available to move." +msgstr "אין קבצים ו/או תיקיות זמינים להעברה." + +#: templates/admin/filer/folder/choose_move_destination.html:52 +msgid "" +"The following files and/or folders will be moved to a destination folder " +"(retaining their tree structure):" +msgstr "" +"הקבצים ו/או התיקיות הבאים יועברו לתיקיית יעד (תוך שמירה על מבנה העץ שלהם):" + +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 +msgid "Move" +msgstr "העבר" + +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:15 +msgid "" +"Your account doesn't have permissions to rename all of the selected files." +msgstr "לחשבונך אין רשות לשנות שמם של כל הקבצים הבחורים." + +#: templates/admin/filer/folder/choose_rename_format.html:18 +msgid "There are no files available to rename." +msgstr "אין קבצים זמינים לשינוי שמם." + +#: templates/admin/filer/folder/choose_rename_format.html:20 +msgid "" +"The following files will be renamed (they will stay in their folders and " +"keep original filename, only displayed filename will be changed):" +msgstr "" +"הקבצים הבאים ישונו שמותיהם (הם יישארו בתיקיות הנוכחיות שלהם ושמם המקורי " +"יישאר - רק שמות התצוגה שלהם ישונו):" + +#: templates/admin/filer/folder/choose_rename_format.html:59 +msgid "Rename" +msgstr "שנה שם" + +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "חזור לתיקיה ההורה" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "שנה פרטי תיקיה נוכחית" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "שנה" + +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "חיפוש" + +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "מחק" + +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "מוסיף תיקיה חדשה" + +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "תיקיה חדשה" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:16 +msgid "Name" +msgstr "שם" + +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "בעלים" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 +#, python-format +msgid "Change '%(item_label)s' folder details" +msgstr "שנה פרטי תיקיה של '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 +msgid "Select this file" +msgstr "בחר קובץ זה" + +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 +#, python-format +msgid "Change '%(item_label)s' details" +msgstr "שנה פרטים של '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "Permissions" +msgstr "הרשאות" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "disabled" +msgstr "מבוטל" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "enabled" +msgstr "מאופשר" + +#: templates/admin/filer/folder/directory_table_list.html:144 +#, fuzzy +#| msgid "Move selected files to clipboard" +msgid "URL copied to clipboard" +msgstr "העבר קבצים שנבחרו ללוח" + +#: templates/admin/filer/folder/directory_table_list.html:147 +#, python-format +msgid "Canonical url '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:151 +#, python-format +msgid "Download '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "העלאה" + +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 +msgid "previous" +msgstr "הקודם" + +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 +#, python-format +msgid "Page %(number)s of %(num_pages)s." +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 +msgid "next" +msgstr "הבא" + +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +msgid "Select all" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +msgid "Files" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +msgid "Add new" +msgstr "הוסף חדש" + +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:15 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "אנא תקן/י את הטעות מטה." +msgstr[1] "אנא תקן/י את הטעויות מטה." +msgstr[2] "אנא תקן/י את הטעויות מטה." +msgstr[3] "אנא תקן/י את הטעויות מטה." + +#: templates/admin/filer/folder/new_folder_form.html:30 +msgid "Save" +msgstr "שמור" + +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "לוח" + +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "הדבק את כל הפריטים כאן" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "העבר את כל קבצי הלוח ל-" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "הלוח ריק" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "העלאה נכשלה" + +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +msgid "File is missing" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "found" +msgstr "נמצא" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "and" +msgstr "וגם" + +#: templates/admin/filer/tools/search_form.html:7 +msgid "cancel search" +msgstr "בטל חיפוש" + +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "נקה" + +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "אף קובץ לא נבחר" + +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "חיפוש" + +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "" + +#: templates/admin/filer/widgets/admin_folder.html:16 +msgid "Choose Folder" +msgstr "" + +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" +msgstr "" + +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" +msgstr "" + +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" +msgstr "" + +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" +msgstr "" + +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" +msgstr "" + +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." + +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" + +#~ msgid "Open file" +#~ msgstr "Open file" + +#~ msgid "Full size preview" +#~ msgstr "Full size preview" + +#~ msgid "Add Description" +#~ msgstr "Add Description" + +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" + +#~ msgid "none selected" +#~ msgstr "none selected" + +#~ msgid "Add Folder" +#~ msgstr "Add Folder" + +#~ msgid "Subject Location" +#~ msgstr "Subject location" + +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" +#~ msgstr[1] "15c0f2d28d6dab1af1f6d94906beb627_pl_1" +#~ msgstr[2] "15c0f2d28d6dab1af1f6d94906beb627_pl_2" +#~ msgstr[3] "15c0f2d28d6dab1af1f6d94906beb627_pl_3" + +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/hr/LC_MESSAGES/django.mo b/filer/locale/hr/LC_MESSAGES/django.mo new file mode 100644 index 000000000..8a2e68474 Binary files /dev/null and b/filer/locale/hr/LC_MESSAGES/django.mo differ diff --git a/filer/locale/hr/LC_MESSAGES/django.po b/filer/locale/hr/LC_MESSAGES/django.po new file mode 100644 index 000000000..956d76841 --- /dev/null +++ b/filer/locale/hr/LC_MESSAGES/django.po @@ -0,0 +1,1265 @@ +# 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: +# Translators: +# Aleks Acimovic, 2022 +# Damir , 2013 +msgid "" +msgstr "" +"Project-Id-Version: django Filer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: Aleks Acimovic, 2022\n" +"Language-Team: Croatian (http://app.transifex.com/divio/django-filer/" +"language/hr/)\n" +"Language: hr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +#: admin/clipboardadmin.py:17 +msgid "You do not have permission to upload files." +msgstr "" + +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "" + +#: admin/clipboardadmin.py:20 +msgid "Can't use this folder, Permission Denied. Please select another folder." +msgstr "" + +#: admin/fileadmin.py:73 +msgid "Advanced" +msgstr "Napredno" + +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Stavke moraju biti odabrane kako bi se obavila akcija. Nijedna stavka nije " +"promijenjena." + +#: admin/folderadmin.py:434 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s odabrana" +msgstr[1] "%(total_count)s odabrano" +msgstr[2] "Svih %(total_count)s odabrano" + +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "Popis direktorija za %(folder_name)s" + +#: admin/folderadmin.py:475 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 od %(cnt)s odabrano" + +#: admin/folderadmin.py:612 +msgid "No action selected." +msgstr "Nije izabrana akcija." + +#: admin/folderadmin.py:664 +#, python-format +msgid "Successfully moved %(count)d files to clipboard." +msgstr "Uspješno premješteno %(count)d datoteka u spremnik." + +#: admin/folderadmin.py:669 +msgid "Move selected files to clipboard" +msgstr "Premjesti odabrane datoteke u spremnik" + +#: admin/folderadmin.py:709 +#, python-format +msgid "Successfully disabled permissions for %(count)d files." +msgstr "Uspješno onemogućene ovlasti za %(count)d datoteka." + +#: admin/folderadmin.py:711 +#, python-format +msgid "Successfully enabled permissions for %(count)d files." +msgstr "Uspješno omogućene ovlasti za %(count)d datoteka." + +#: admin/folderadmin.py:719 +msgid "Enable permissions for selected files" +msgstr "Omogući ovlasti za odabrane datoteke" + +#: admin/folderadmin.py:725 +msgid "Disable permissions for selected files" +msgstr "Onemogući ovlasti za odabrane datoteke" + +#: admin/folderadmin.py:789 +#, python-format +msgid "Successfully deleted %(count)d files and/or folders." +msgstr "Uspješno obrisano %(count)d datoteka i/ili direktorija." + +#: admin/folderadmin.py:794 +msgid "Cannot delete files and/or folders" +msgstr "Nije moguće obrisati datoteke i/ili direktorije" + +#: admin/folderadmin.py:796 +msgid "Are you sure?" +msgstr "Jeste li sigurni?" + +#: admin/folderadmin.py:802 +msgid "Delete files and/or folders" +msgstr "Obriši datoteke i/ili direktorije" + +#: admin/folderadmin.py:823 +msgid "Delete selected files and/or folders" +msgstr "Obriši odabrane datoteke i/ili direktorije" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "" + +#: admin/folderadmin.py:934 +#, python-format +msgid "" +"Successfully moved %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" +"Uspješno premješteno %(count)d datoteka i/ili direktorija u direktorij " +"'%(destination)s'." + +#: admin/folderadmin.py:942 admin/folderadmin.py:944 +msgid "Move files and/or folders" +msgstr "Premjesti datoteke i/ili direktorije" + +#: admin/folderadmin.py:959 +msgid "Move selected files and/or folders" +msgstr "Premjesti odabrane datoteke i/ili direktorije" + +#: admin/folderadmin.py:1016 +#, python-format +msgid "Successfully renamed %(count)d files." +msgstr "Uspješno preimenovano %(count)d datoteka." + +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 +msgid "Rename files" +msgstr "Preimenuj datoteke" + +#: admin/folderadmin.py:1137 +#, python-format +msgid "" +"Successfully copied %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" +"Uspješno kopirano %(count)d datoteka i/ili direktorija u direktorij " +"'%(destination)s'." + +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 +msgid "Copy files and/or folders" +msgstr "Kopiraj datoteke i/ili direktorije" + +#: admin/folderadmin.py:1174 +msgid "Copy selected files and/or folders" +msgstr "Kopiraj odabrane datoteke i/ili direktorije" + +#: admin/folderadmin.py:1279 +#, python-format +msgid "Successfully resized %(count)d images." +msgstr "Uspješno promijenjena veličina za %(count)d slika." + +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 +msgid "Resize images" +msgstr "Promijeni veličinu slika" + +#: admin/folderadmin.py:1303 +msgid "Resize selected images" +msgstr "Promijeni veličinu odabranih slika" + +#: admin/forms.py:24 +msgid "Suffix which will be appended to filenames of copied files." +msgstr "Sufiks koji će biti dodan imenima kopiranih datoteka." + +#: admin/forms.py:31 +#, python-format +msgid "" +"Suffix should be a valid, simple and lowercase filename part, like " +"\"%(valid)s\"." +msgstr "" +"Sufiks treba biti jednostavan i upisan malim slovima poput \"%(valid)s\"." + +#: admin/forms.py:52 +#, python-format +msgid "Unknown rename format value key \"%(key)s\"." +msgstr "Nepoznata vrijednost formata ključa za preimenovanje \"%(key)s\"." + +#: admin/forms.py:54 +#, python-format +msgid "Invalid rename format: %(error)s." +msgstr "Neispravan format za premenovanje: %(error)s." + +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 +msgid "thumbnail option" +msgstr "opcija sličica" + +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 +msgid "width" +msgstr "širina" + +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 +msgid "height" +msgstr "visina" + +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 +msgid "crop" +msgstr "obreži" + +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 +msgid "upscale" +msgstr "povećaj veličinu" + +#: admin/forms.py:79 +msgid "Thumbnail option or resize parameters must be choosen." +msgstr "" +"Opcija sličica ili parametri za promjenu veličine moraju biti izabrani." + +#: admin/imageadmin.py:20 admin/imageadmin.py:112 +msgid "Subject location" +msgstr "Lokacija subjekta" + +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "" + +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "" + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "" + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "" + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" +msgstr "" + +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" +msgstr "" + +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "Direktorij s ovim imenom već postoji." + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "Filer" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "" + +#: models/abstract.py:62 +msgid "default alt text" +msgstr "predefinirani alt tekst" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "predefinirani opis slike" + +#: models/abstract.py:76 +msgid "subject location" +msgstr "lokacija subjekta" + +#: models/abstract.py:91 +msgid "image" +msgstr "slika" + +#: models/abstract.py:92 +msgid "images" +msgstr "slike" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "" + +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." +msgstr "" + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 +msgid "user" +msgstr "korisnik" + +#: models/clipboardmodels.py:17 models/filemodels.py:157 +msgid "files" +msgstr "datoteke" + +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 +msgid "clipboard" +msgstr "spremnik" + +#: models/clipboardmodels.py:25 +msgid "clipboards" +msgstr "spremnici" + +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 +msgid "file" +msgstr "datoteka" + +#: models/clipboardmodels.py:56 +msgid "clipboard item" +msgstr "stavka spremnika" + +#: models/clipboardmodels.py:57 +msgid "clipboard items" +msgstr "stavke spremnika" + +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "folder" +msgstr "direktorij" + +#: models/filemodels.py:81 +msgid "file size" +msgstr "veličina datoteke" + +#: models/filemodels.py:87 +msgid "sha1" +msgstr "sha1" + +#: models/filemodels.py:94 +msgid "has all mandatory data" +msgstr "sadrži sve obavezne podatke" + +#: models/filemodels.py:100 +msgid "original filename" +msgstr "originalno ime datoteke" + +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 +msgid "name" +msgstr "ime" + +#: models/filemodels.py:116 +msgid "description" +msgstr "opis" + +#: models/filemodels.py:125 models/foldermodels.py:108 +msgid "owner" +msgstr "vlasnik" + +#: models/filemodels.py:129 models/foldermodels.py:116 +msgid "uploaded at" +msgstr "postavljeno" + +#: models/filemodels.py:134 models/foldermodels.py:126 +msgid "modified at" +msgstr "modificirano" + +#: models/filemodels.py:140 +msgid "Permissions disabled" +msgstr "Ovlasti onemogućene" + +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "" + +#: models/foldermodels.py:94 +msgid "parent" +msgstr "" + +#: models/foldermodels.py:121 +msgid "created at" +msgstr "kerirano" + +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Folder" +msgstr "Direktorij" + +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 +msgid "Folders" +msgstr "Direktoriji" + +#: models/foldermodels.py:260 +msgid "all items" +msgstr "sve stavke" + +#: models/foldermodels.py:261 +msgid "this item only" +msgstr "samo ova stavka" + +#: models/foldermodels.py:262 +msgid "this item and all children" +msgstr "ova stavka i sva djeca" + +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "" + +#: models/foldermodels.py:280 +msgid "type" +msgstr "tip" + +#: models/foldermodels.py:297 +msgid "group" +msgstr "grupa" + +#: models/foldermodels.py:304 +msgid "everybody" +msgstr "svi" + +#: models/foldermodels.py:309 +msgid "can read" +msgstr "mogu čitati" + +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "mogu uređivati" + +#: models/foldermodels.py:325 +msgid "can add children" +msgstr "mogu dodavati djecu" + +#: models/foldermodels.py:333 +msgid "folder permission" +msgstr "ovlast direktorija" + +#: models/foldermodels.py:334 +msgid "folder permissions" +msgstr "ovlasti direktorija" + +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." +msgstr "" + +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." +msgstr "" + +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." +msgstr "" + +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." +msgstr "" + +#: models/foldermodels.py:360 +msgid "All Folders" +msgstr "" + +#: models/foldermodels.py:362 +msgid "Logical Path" +msgstr "" + +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" +msgstr "" + +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" +msgstr "" + +#: models/foldermodels.py:375 +msgid "Everybody" +msgstr "" + +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "" + +#: models/foldermodels.py:389 +msgid "Read" +msgstr "" + +#: models/foldermodels.py:390 +msgid "Add children" +msgstr "" + +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "datum nastanka" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "autor" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "zahtijeva se objavljivanje zasluga autora" + +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "zahtjeva se objavljivanje autorskih prava" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "" + +#: models/virtualitems.py:73 +msgid "files with missing metadata" +msgstr "datoteke s nedostajućim metapodacima" + +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "root" +msgstr "korijenski" + +#: settings.py:273 +msgid "Show table view" +msgstr "" + +#: settings.py:278 +msgid "Show thumbnail view" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Run the selected action" +msgstr "Pokreni odabranu akciju" + +#: templates/admin/filer/actions.html:5 +msgid "Go" +msgstr "Idi" + +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +msgid "Click here to select the objects across all pages" +msgstr "Kliknite ovdje za odabir objekata kroz sve stranice" + +#: templates/admin/filer/actions.html:14 +#, python-format +msgid "Select all %(total_count)s files and/or folders" +msgstr "Odaberite sve %(total_count)s datoteke i/ili direktorije" + +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 +msgid "Clear selection" +msgstr "Poništi odabir" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 +msgid "Go back to admin homepage" +msgstr "Povratak na početnu stranicu" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 +msgid "Home" +msgstr "Početna" + +#: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 +msgid "Go back to Filer app" +msgstr "Povratak na Filer aplikaciju" + +#: templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Go back to root folder" +msgstr "Povratak na korijenski direktorij" + +#: templates/admin/filer/breadcrumbs.html:8 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 +#, python-format +msgid "Go back to '%(folder_name)s' folder" +msgstr "Povratak na direktorij '%(folder_name)s'" + +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:11 +msgid "" +"Deleting the selected files and/or folders would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Brisanje odabranih objekata bi rezultiralo brisanjem povezanih objekata, ali " +"Vaš korisnički račun nema ovlasti za brisanje slijedećih tipova objekata:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:19 +msgid "" +"Deleting the selected files and/or folders would require deleting the " +"following protected related objects:" +msgstr "" +"Brisanje odabranih datoteka i/ili direktorija bi zahtijevalo brisanje " +"slijedećih zaštičenih povezanih objekata:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:27 +msgid "" +"Are you sure you want to delete the selected files and/or folders? All of " +"the following objects and their related items will be deleted:" +msgstr "" +"Jeste li sigurni kako želite obrisati odabrane datoteke i/ili direktorije? " +"Svi navedeni objekti i s njima povezane stavke biti će obrisani:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "" + +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 +msgid "History" +msgstr "Povijest" + +#: templates/admin/filer/file/change_form.html:37 +#: templates/admin/filer/folder/change_form.html:23 +#: templates/admin/filer/image/change_form.html:37 +msgid "View on site" +msgstr "Pogledaj na stranicama" + +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "Idi natrag na" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "početna stranica administracije" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 +msgid "Folder Icon" +msgstr "Ikona direktorija" + +#: templates/admin/filer/folder/choose_copy_destination.html:23 +msgid "" +"Your account doesn't have permissions to copy all of the selected files and/" +"or folders." +msgstr "" +"Vaš korisnički račun nema ovlasti za kopiranje odabranih datoteka i/ili " +"direktorija." + +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 +msgid "There are no destination folders available." +msgstr "Nema dostupnih odredišnih direktorija." + +#: templates/admin/filer/folder/choose_copy_destination.html:35 +msgid "There are no files and/or folders available to copy." +msgstr "Nema dostupnih datoteka i/ili direktorija za kopiranje." + +#: templates/admin/filer/folder/choose_copy_destination.html:40 +msgid "" +"The following files and/or folders will be copied to a destination folder " +"(retaining their tree structure):" +msgstr "" +"Slijedeće datoteke i/ili direktoriji biti će kopirani u odredišni direktorij " +"(zadržavajući postojeću strukturu):" + +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 +msgid "Destination folder:" +msgstr "Odredišni direktorij" + +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 +msgid "Copy" +msgstr "Kopiraj" + +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 +msgid "" +"Your account doesn't have permissions to resize all of the selected images." +msgstr "" +"Vaš korisnički račun nema ovlasti za promjenu veličina odabranih slika." + +#: templates/admin/filer/folder/choose_images_resize_options.html:18 +msgid "There are no images available to resize." +msgstr "Nema dostupnih slika kojima bi se promijenila veličina." + +#: templates/admin/filer/folder/choose_images_resize_options.html:20 +msgid "The following images will be resized:" +msgstr "Slijedećim slikama biti će promijenjena veličina:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:32 +msgid "Choose an existing thumbnail option or enter resize parameters:" +msgstr "" +"Izaberite postojeću opciju sličica ili unesite parametre za promjenu " +"veličine:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:36 +msgid "" +"Warning: Images will be resized in-place and originals will be lost. Maybe " +"first make a copy of them to retain the originals." +msgstr "" +"Pažnja: Slikama će biti promijenjena veličina, a originali će biti prepisani " +"sa slikama s novom veličinom. Preporuča se prvo kopirati originalne slike " +"prije promjene veličine." + +#: templates/admin/filer/folder/choose_images_resize_options.html:39 +msgid "Resize" +msgstr "Promjeni veličinu" + +#: templates/admin/filer/folder/choose_move_destination.html:35 +msgid "" +"Your account doesn't have permissions to move all of the selected files and/" +"or folders." +msgstr "" +"Vaš korisnički račun nema ovlasti za premještaj svih odabranih datoteka i/" +"ili direktorija." + +#: templates/admin/filer/folder/choose_move_destination.html:47 +msgid "There are no files and/or folders available to move." +msgstr "Nema dostupnih datoteka i/ili direktorija za premještaj." + +#: templates/admin/filer/folder/choose_move_destination.html:52 +msgid "" +"The following files and/or folders will be moved to a destination folder " +"(retaining their tree structure):" +msgstr "" +"Slijedeće datoteke i/ili direktoriji biti će premješteni u odredišni " +"direktorij (zadržavajući postojeću strukturu):" + +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 +msgid "Move" +msgstr "Premjesti" + +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:15 +msgid "" +"Your account doesn't have permissions to rename all of the selected files." +msgstr "" +"Vaš korisnički račun nema ovlasti za preimenovanje svih odabranih datoteka." + +#: templates/admin/filer/folder/choose_rename_format.html:18 +msgid "There are no files available to rename." +msgstr "Nema dostupnih datoteka i/ili direktorija za preimenovanje." + +#: templates/admin/filer/folder/choose_rename_format.html:20 +msgid "" +"The following files will be renamed (they will stay in their folders and " +"keep original filename, only displayed filename will be changed):" +msgstr "" +"Slijedeće datoteke če biti preimenovane (ostati će u svojim direktorijima i " +"zadržati ime datoteke, samo će prikazano ime biti promijenjeno):" + +#: templates/admin/filer/folder/choose_rename_format.html:59 +msgid "Rename" +msgstr "Preimenuj" + +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "Vrati se u nadređeni direktorij" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "Promijeni detalje trenutnog direktorija" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "Promijeni" + +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "Traži" + +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "Obriši" + +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "Dodaje novi direktorij" + +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "Novi direktorij" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:16 +msgid "Name" +msgstr "Ime" + +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "Vlasnik" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 +#, python-format +msgid "Change '%(item_label)s' folder details" +msgstr "Promijeni detalje direktorija '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 +msgid "Select this file" +msgstr "Odaberi ovu datoteku" + +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 +#, python-format +msgid "Change '%(item_label)s' details" +msgstr "Promijeni detalje za '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "Permissions" +msgstr "Ovlasti" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "disabled" +msgstr "onemogućeno" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "enabled" +msgstr "omogućeno" + +#: templates/admin/filer/folder/directory_table_list.html:144 +#, fuzzy +#| msgid "Move selected files to clipboard" +msgid "URL copied to clipboard" +msgstr "Premjesti odabrane datoteke u spremnik" + +#: templates/admin/filer/folder/directory_table_list.html:147 +#, python-format +msgid "Canonical url '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:151 +#, python-format +msgid "Download '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "Prebaci" + +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 +msgid "previous" +msgstr "prethodni" + +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 +#, python-format +msgid "Page %(number)s of %(num_pages)s." +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 +msgid "next" +msgstr "slijedeći" + +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +msgid "Select all" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +msgid "Files" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +msgid "Add new" +msgstr "Dodaj novi" + +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:15 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Molimo ispravite pogrešku ispod." +msgstr[1] "Molimo ispravite pogreške ispod." +msgstr[2] "Molimo ispravite pogreške ispod." + +#: templates/admin/filer/folder/new_folder_form.html:30 +msgid "Save" +msgstr "Spremi" + +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "Privremeni spremnik" + +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "Premjesti sve stavke ovdje" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "Premjesti sve datoteke iz privremenog spremnika u" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "privremeni spremnik je prazan" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "prebacivanje neuspješno" + +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +msgid "File is missing" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "found" +msgstr "pronađeno" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "and" +msgstr "i" + +#: templates/admin/filer/tools/search_form.html:7 +msgid "cancel search" +msgstr "poništi pretraživanje" + +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "Isprazni" + +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "nema odabranih datoteka" + +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "Pregled" + +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "" + +#: templates/admin/filer/widgets/admin_folder.html:16 +msgid "Choose Folder" +msgstr "" + +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" +msgstr "" + +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" +msgstr "" + +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" +msgstr "" + +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" +msgstr "" + +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" +msgstr "" + +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." + +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" + +#~ msgid "Open file" +#~ msgstr "Open file" + +#~ msgid "Full size preview" +#~ msgstr "Full size preview" + +#~ msgid "Add Description" +#~ msgstr "Add Description" + +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" + +#~ msgid "none selected" +#~ msgstr "none selected" + +#~ msgid "Add Folder" +#~ msgstr "Add Folder" + +#~ msgid "Subject Location" +#~ msgstr "Subject location" + +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" +#~ msgstr[1] "15c0f2d28d6dab1af1f6d94906beb627_pl_1" +#~ msgstr[2] "15c0f2d28d6dab1af1f6d94906beb627_pl_2" + +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/hu/LC_MESSAGES/django.mo b/filer/locale/hu/LC_MESSAGES/django.mo new file mode 100644 index 000000000..4f949fb53 Binary files /dev/null and b/filer/locale/hu/LC_MESSAGES/django.mo differ diff --git a/filer/locale/hu/LC_MESSAGES/django.po b/filer/locale/hu/LC_MESSAGES/django.po new file mode 100644 index 000000000..80b195895 --- /dev/null +++ b/filer/locale/hu/LC_MESSAGES/django.po @@ -0,0 +1,1258 @@ +# 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: +# Translators: +# Istvan Farkas , 2016-2017 +msgid "" +msgstr "" +"Project-Id-Version: django Filer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: Istvan Farkas , 2016-2017\n" +"Language-Team: Hungarian (http://app.transifex.com/divio/django-filer/" +"language/hu/)\n" +"Language: hu\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: admin/clipboardadmin.py:17 +msgid "You do not have permission to upload files." +msgstr "" + +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "" + +#: admin/clipboardadmin.py:20 +msgid "Can't use this folder, Permission Denied. Please select another folder." +msgstr "" + +#: admin/fileadmin.py:73 +msgid "Advanced" +msgstr "Haladó" + +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "egyedi URL" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Az akciók végrehajtásához egy vagy több elemet ki kell választani. Egyetlen " +"elem sem változott." + +#: admin/folderadmin.py:434 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s kiválasztva" +msgstr[1] "Mind (%(total_count)s) kiválasztva" + +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "" + +#: admin/folderadmin.py:475 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 kiválasztva a %(cnt)s elemből" + +#: admin/folderadmin.py:612 +msgid "No action selected." +msgstr "Nincs akció megadva" + +#: admin/folderadmin.py:664 +#, python-format +msgid "Successfully moved %(count)d files to clipboard." +msgstr "%(count)d fájl a vágólapra mozgatva." + +#: admin/folderadmin.py:669 +msgid "Move selected files to clipboard" +msgstr "Kiválasztott fájlok vágólapra mozgatása" + +#: admin/folderadmin.py:709 +#, python-format +msgid "Successfully disabled permissions for %(count)d files." +msgstr "%(count)d fájl jogosultságai kikapcsolva." + +#: admin/folderadmin.py:711 +#, python-format +msgid "Successfully enabled permissions for %(count)d files." +msgstr "%(count)d fájl jogosultságai bekapcsolva." + +#: admin/folderadmin.py:719 +msgid "Enable permissions for selected files" +msgstr "Jogosultságok bekapcsolása a kiválasztott fájlokhoz" + +#: admin/folderadmin.py:725 +msgid "Disable permissions for selected files" +msgstr "Jogosultságok kikapcsolása a kiválasztott fájlokhoz" + +#: admin/folderadmin.py:789 +#, python-format +msgid "Successfully deleted %(count)d files and/or folders." +msgstr "%(count)d fájl és/vagy mappa sikeresen törölve." + +#: admin/folderadmin.py:794 +msgid "Cannot delete files and/or folders" +msgstr "Nem lehet a mappákat és/vagy fájlokat törölni" + +#: admin/folderadmin.py:796 +msgid "Are you sure?" +msgstr "Biztos benne?" + +#: admin/folderadmin.py:802 +msgid "Delete files and/or folders" +msgstr "Fájlok és/vagy mappák törlése" + +#: admin/folderadmin.py:823 +msgid "Delete selected files and/or folders" +msgstr "Kiválasztott fájlok és/vagy mappák törlése" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "A kiválasztott helyen már létezik %s nevű mappa" + +#: admin/folderadmin.py:934 +#, python-format +msgid "" +"Successfully moved %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" +"%(count)d fájl és/vagy mappa sikeresen átmozgatva ebbe a mappába: " +"%(destination)s" + +#: admin/folderadmin.py:942 admin/folderadmin.py:944 +msgid "Move files and/or folders" +msgstr "Fájlok és/vagy mappák mozgatása" + +#: admin/folderadmin.py:959 +msgid "Move selected files and/or folders" +msgstr "Kiválasztott fájlok és/vagy mappák mozgatása" + +#: admin/folderadmin.py:1016 +#, python-format +msgid "Successfully renamed %(count)d files." +msgstr "%(count)d fájl sikeresen átnevezve." + +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 +msgid "Rename files" +msgstr "Fájlok átnevezése" + +#: admin/folderadmin.py:1137 +#, python-format +msgid "" +"Successfully copied %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" +"%(count)d fájl és/vagy mappa sikeresen átmásolva ebbe a mappába: " +"%(destination)s" + +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 +msgid "Copy files and/or folders" +msgstr "Fájlok és/vagy mappák másolása" + +#: admin/folderadmin.py:1174 +msgid "Copy selected files and/or folders" +msgstr "Kiválasztott fájlok és/vagy mappák másolása" + +#: admin/folderadmin.py:1279 +#, python-format +msgid "Successfully resized %(count)d images." +msgstr "%(count)d kép sikeresen átméretezve." + +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 +msgid "Resize images" +msgstr "Képek átméretezése" + +#: admin/folderadmin.py:1303 +msgid "Resize selected images" +msgstr "Kiválasztott képek átméretezése" + +#: admin/forms.py:24 +msgid "Suffix which will be appended to filenames of copied files." +msgstr "Utótag, amely a másolt fájlok nevéhez lesz hozzáadva." + +#: admin/forms.py:31 +#, python-format +msgid "" +"Suffix should be a valid, simple and lowercase filename part, like " +"\"%(valid)s\"." +msgstr "" +"Az utótag lehetőleg egyszerű, kisbetűs fájlnév részlet legyen, például " +"\"%(valid)s\"." + +#: admin/forms.py:52 +#, python-format +msgid "Unknown rename format value key \"%(key)s\"." +msgstr "Ismeretlen átnevezés formázási szó: \"%(key)s\" " + +#: admin/forms.py:54 +#, python-format +msgid "Invalid rename format: %(error)s." +msgstr "Érvénytelen átnevezési formátum: %(error)s." + +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 +msgid "thumbnail option" +msgstr "előnézeti kép beállítás" + +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 +msgid "width" +msgstr "szélesség" + +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 +msgid "height" +msgstr "magasság" + +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 +msgid "crop" +msgstr "vágás" + +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 +msgid "upscale" +msgstr "felméretezés" + +#: admin/forms.py:79 +msgid "Thumbnail option or resize parameters must be choosen." +msgstr "" +"Előnézeti kép beállítást vagy átméretezési paramétert kötelező kiválasztani." + +#: admin/imageadmin.py:20 admin/imageadmin.py:112 +msgid "Subject location" +msgstr "Fókusz helye" + +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "A kép fő fókuszának a helye. Formátuma: \"x,y\"." + +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "Érvénytelen fókusz formátum." + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "A fókusz helye kívül esik a képen." + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "A beírt érték: \"{subject_location}\"." + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" +msgstr "" + +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" +msgstr "" + +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "Már létezik ilyen nevű mappa." + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "Fájlkezelő" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "Médiatár" + +#: models/abstract.py:62 +msgid "default alt text" +msgstr "alapértelmezett alternatív szöveg" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "alapértelmezett képaláírás" + +#: models/abstract.py:76 +msgid "subject location" +msgstr "fókusz helye" + +#: models/abstract.py:91 +msgid "image" +msgstr "kép" + +#: models/abstract.py:92 +msgid "images" +msgstr "képek" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "" + +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." +msgstr "" + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 +msgid "user" +msgstr "felhasználó" + +#: models/clipboardmodels.py:17 models/filemodels.py:157 +msgid "files" +msgstr "fájlok" + +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 +msgid "clipboard" +msgstr "vágólap" + +#: models/clipboardmodels.py:25 +msgid "clipboards" +msgstr "vágólapok" + +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 +msgid "file" +msgstr "fájl" + +#: models/clipboardmodels.py:56 +msgid "clipboard item" +msgstr "vágólap elem" + +#: models/clipboardmodels.py:57 +msgid "clipboard items" +msgstr "vágólap elemek" + +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "folder" +msgstr "mappa" + +#: models/filemodels.py:81 +msgid "file size" +msgstr "fájlméret" + +#: models/filemodels.py:87 +msgid "sha1" +msgstr "sha1" + +#: models/filemodels.py:94 +msgid "has all mandatory data" +msgstr "fontos adatok kitöltve" + +#: models/filemodels.py:100 +msgid "original filename" +msgstr "eredeti fájlnév" + +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 +msgid "name" +msgstr "név" + +#: models/filemodels.py:116 +msgid "description" +msgstr "leírás" + +#: models/filemodels.py:125 models/foldermodels.py:108 +msgid "owner" +msgstr "tulajdonos" + +#: models/filemodels.py:129 models/foldermodels.py:116 +msgid "uploaded at" +msgstr "feltöltés ideje" + +#: models/filemodels.py:134 models/foldermodels.py:126 +msgid "modified at" +msgstr "módosítás ideje" + +#: models/filemodels.py:140 +msgid "Permissions disabled" +msgstr "Jogosultságok kikapcsolva" + +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "" +"Jogosultságok ellenőrzésének kikapcsolása ennél a fájlnál. Ezt a fájlt bárki " +"letöltheti." + +#: models/foldermodels.py:94 +msgid "parent" +msgstr "" + +#: models/foldermodels.py:121 +msgid "created at" +msgstr "létrehozás ideje" + +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Folder" +msgstr "Mappa" + +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 +msgid "Folders" +msgstr "Mappák" + +#: models/foldermodels.py:260 +msgid "all items" +msgstr "minden elem" + +#: models/foldermodels.py:261 +msgid "this item only" +msgstr "csak ez az elem" + +#: models/foldermodels.py:262 +msgid "this item and all children" +msgstr "csak ez az elem, és az alá tartozók" + +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "engedélyez" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "letilt" + +#: models/foldermodels.py:280 +msgid "type" +msgstr "típus" + +#: models/foldermodels.py:297 +msgid "group" +msgstr "csoport" + +#: models/foldermodels.py:304 +msgid "everybody" +msgstr "mindenki" + +#: models/foldermodels.py:309 +msgid "can read" +msgstr "olvashatja" + +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "szerkesztheti" + +#: models/foldermodels.py:325 +msgid "can add children" +msgstr "hozzáadhat gyermekelemet" + +#: models/foldermodels.py:333 +msgid "folder permission" +msgstr "mappa jogosultság" + +#: models/foldermodels.py:334 +msgid "folder permissions" +msgstr "mappa jogosultságok" + +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." +msgstr "" + +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." +msgstr "" + +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." +msgstr "" + +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." +msgstr "" + +#: models/foldermodels.py:360 +msgid "All Folders" +msgstr "" + +#: models/foldermodels.py:362 +msgid "Logical Path" +msgstr "" + +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" +msgstr "" + +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" +msgstr "" + +#: models/foldermodels.py:375 +msgid "Everybody" +msgstr "" + +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "" + +#: models/foldermodels.py:389 +msgid "Read" +msgstr "" + +#: models/foldermodels.py:390 +msgid "Add children" +msgstr "" + +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "fotózás dátuma" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "szerző" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "szerző nevének mindig meg kell jelennie" + +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "copyright információnak mindig meg kell jelennie" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "szélesség pixelben." + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "magasság pixelben." + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "előnézeti kép beállítások" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "Kategorizálatlan feltöltések" + +#: models/virtualitems.py:73 +msgid "files with missing metadata" +msgstr "fájlok hiányzó meta adatokkal" + +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "root" +msgstr "gyökér" + +#: settings.py:273 +msgid "Show table view" +msgstr "" + +#: settings.py:278 +msgid "Show thumbnail view" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Run the selected action" +msgstr "Kiválasztott akció végrehajtása" + +#: templates/admin/filer/actions.html:5 +msgid "Go" +msgstr "Mehet" + +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +msgid "Click here to select the objects across all pages" +msgstr "Ide klikkelve több oldalról is választhatóak elemek" + +#: templates/admin/filer/actions.html:14 +#, python-format +msgid "Select all %(total_count)s files and/or folders" +msgstr "Az összes (%(total_count)s) mappa és fájl kiválasztása" + +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 +msgid "Clear selection" +msgstr "Kiválasztás megszüntetése" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 +msgid "Go back to admin homepage" +msgstr "Vissza az adminisztrációs oldalra" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 +msgid "Home" +msgstr "Nyitólap" + +#: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 +msgid "Go back to Filer app" +msgstr "Vissza a fájlkezelőbe" + +#: templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Go back to root folder" +msgstr "Vissza a gyökérmappába" + +#: templates/admin/filer/breadcrumbs.html:8 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 +#, python-format +msgid "Go back to '%(folder_name)s' folder" +msgstr "Vissza a(z) '%(folder_name)s' mappába" + +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "Duplikátumok" + +#: templates/admin/filer/delete_selected_files_confirmation.html:11 +msgid "" +"Deleting the selected files and/or folders would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"A kiválasztott fájlok és mappák törlése csatlakozó elemek törlésével is " +"járna, viszont a jelenlegi fiók nem rendelkezik a megfelelő jogosultságokkal " +"a következő objektum típusok törléséhez:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:19 +msgid "" +"Deleting the selected files and/or folders would require deleting the " +"following protected related objects:" +msgstr "" +"A kiválasztott fájlok és mappák törlése azzal járna, hogy a következő " +"kapcsolt elemek is törlődnek:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:27 +msgid "" +"Are you sure you want to delete the selected files and/or folders? All of " +"the following objects and their related items will be deleted:" +msgstr "" +"Biztosan törli a kiválasztott fájlokat és/vagy mappákat? A következő " +"objektumok, és a hozzájuk kapcsolt elemek is törlődni fognak:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "Nem, mégsem" + +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "Igen, biztos vagyok benne" + +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 +msgid "History" +msgstr "Történet" + +#: templates/admin/filer/file/change_form.html:37 +#: templates/admin/filer/folder/change_form.html:23 +#: templates/admin/filer/image/change_form.html:37 +msgid "View on site" +msgstr "Megtekintés az oldalon" + +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "Vissza ide:" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "adminisztrációs felület" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 +msgid "Folder Icon" +msgstr "Mappa Ikon" + +#: templates/admin/filer/folder/choose_copy_destination.html:23 +msgid "" +"Your account doesn't have permissions to copy all of the selected files and/" +"or folders." +msgstr "" +"Nincs jogosultsága az összes kiválasztott fájl és/vagy mappa másolásához." + +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "Vissza" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 +msgid "There are no destination folders available." +msgstr "Nincs alkalmas célmappa." + +#: templates/admin/filer/folder/choose_copy_destination.html:35 +msgid "There are no files and/or folders available to copy." +msgstr "Nincsenek másolható fájlok és/vagy könyvtárak" + +#: templates/admin/filer/folder/choose_copy_destination.html:40 +msgid "" +"The following files and/or folders will be copied to a destination folder " +"(retaining their tree structure):" +msgstr "" +"A következő fájlok és/vagy mappák lesznek a célkönyvtárba másolva (megtartva " +"a szerkezetüket):" + +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 +msgid "Destination folder:" +msgstr "Cél mappa:" + +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 +msgid "Copy" +msgstr "Másol" + +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "Nem lehet fájlokat a saját könyvtárukba másolni" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 +msgid "" +"Your account doesn't have permissions to resize all of the selected images." +msgstr "Nincs jogosultsága az összes kiválasztott kép átméretezéséhez." + +#: templates/admin/filer/folder/choose_images_resize_options.html:18 +msgid "There are no images available to resize." +msgstr "Nincsenek átméretezhető képek." + +#: templates/admin/filer/folder/choose_images_resize_options.html:20 +msgid "The following images will be resized:" +msgstr "A következő képek lesznek átméretezve:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:32 +msgid "Choose an existing thumbnail option or enter resize parameters:" +msgstr "" +"Válasszon ki egy meglévő előnézeti kép beállítást, vagy írja be az " +"átméretezési paramétereket:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:36 +msgid "" +"Warning: Images will be resized in-place and originals will be lost. Maybe " +"first make a copy of them to retain the originals." +msgstr "" +"Figyelem: a képek helyben lesznek átméretezve, felülírva az eredetieket. Ha " +"meg szeretné őrizni az eredeti képeket, előbb másolja át őket." + +#: templates/admin/filer/folder/choose_images_resize_options.html:39 +msgid "Resize" +msgstr "Átméretezés" + +#: templates/admin/filer/folder/choose_move_destination.html:35 +msgid "" +"Your account doesn't have permissions to move all of the selected files and/" +"or folders." +msgstr "" +"Nincs jogosultsága az összes kiválasztott fájl és/vagy mappa mozgatásához." + +#: templates/admin/filer/folder/choose_move_destination.html:47 +msgid "There are no files and/or folders available to move." +msgstr "Nincsenek mozgatható fájlok és/vagy mappák." + +#: templates/admin/filer/folder/choose_move_destination.html:52 +msgid "" +"The following files and/or folders will be moved to a destination folder " +"(retaining their tree structure):" +msgstr "" +"A következő fájlok és/vagy mappák lesznek átmozgatva a cél mappába " +"(megtartva a szerkezetüket):" + +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 +msgid "Move" +msgstr "Mozgatás" + +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "Nem lehet fájlokat az eredeti mappájukba mozgatni" + +#: templates/admin/filer/folder/choose_rename_format.html:15 +msgid "" +"Your account doesn't have permissions to rename all of the selected files." +msgstr "Nincs jogosultsága az összes kiválasztott fájl átnevezéséhez." + +#: templates/admin/filer/folder/choose_rename_format.html:18 +msgid "There are no files available to rename." +msgstr "Nincsenek átnevezhető fájlok." + +#: templates/admin/filer/folder/choose_rename_format.html:20 +msgid "" +"The following files will be renamed (they will stay in their folders and " +"keep original filename, only displayed filename will be changed):" +msgstr "" +"A következő fájlok lesznek átnevezve (a mappában maradnak, és az eredeti " +"fájlnév megmarad, csak a megjelenített név változik):" + +#: templates/admin/filer/folder/choose_rename_format.html:59 +msgid "Rename" +msgstr "Átnevezés" + +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "Vissza a szülőmappába" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "Jelenlegi mappa beállításai" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "Szerkeszt" + +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "Kattintson ide a beírt szó kereséséhez" + +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "Keresés" + +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "Bezár" + +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "Korlátozás" + +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "Kattintsa be, hogy a keresést a jelenlegi mappára korlátozza" + +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "Keresés korlátozása a jelenlegi mappára" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "Törlés" + +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "Új mappát hoz létre" + +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "Új mappa" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "Fájlok feltöltése" + +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "Először válasszon mappát" + +#: templates/admin/filer/folder/directory_table_list.html:16 +msgid "Name" +msgstr "Név" + +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "Tulajdonos" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "Méret" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "Akció" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 +#, python-format +msgid "Change '%(item_label)s' folder details" +msgstr "A(z) '%(item_label)s' mappa beállításai" + +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "%(counter)s mappa" +msgstr[1] "%(counter)s mappa" + +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "%(counter)s fájl" +msgstr[1] "%(counter)s fájl" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "Mappa beállításainak szerkesztése" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "Mappa eltávolítása" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 +msgid "Select this file" +msgstr "Fájl kiválasztása" + +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 +#, python-format +msgid "Change '%(item_label)s' details" +msgstr "A(z) '%(item_label)s' szerkesztése" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "Permissions" +msgstr "Jogosultságok" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "disabled" +msgstr "letiltva" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "enabled" +msgstr "engedélyezve" + +#: templates/admin/filer/folder/directory_table_list.html:144 +#, fuzzy +#| msgid "Move selected files to clipboard" +msgid "URL copied to clipboard" +msgstr "Kiválasztott fájlok vágólapra mozgatása" + +#: templates/admin/filer/folder/directory_table_list.html:147 +#, python-format +msgid "Canonical url '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:151 +#, python-format +msgid "Download '%(item_label)s'" +msgstr "'%(item_label)s' letöltése" + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "Fájl eltávolítása" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "" +"Egérrel dobjon ide fájlokat, vagy használja a \"Fájlok feltöltése\" gombot" + +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "Egérre dobja ide a fájl, hogy feltöltse ebbe a mappába:" + +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "Feltöltés" + +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "mégsem" + +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "Sikeres feltöltés!" + +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "Feltöltés megszakítva!" + +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 +msgid "previous" +msgstr "előző" + +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 +#, python-format +msgid "Page %(number)s of %(num_pages)s." +msgstr " %(number)s / %(num_pages)s oldal" + +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 +msgid "next" +msgstr "következő" + +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "Összes (%(total_count)s) kiválasztása" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +msgid "Select all" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +msgid "Files" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +msgid "Add new" +msgstr "Új" + +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:15 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Kérjük javítsa az alábbi hibát." +msgstr[1] "Kérjük javítsa az alábbi hibákat." + +#: templates/admin/filer/folder/new_folder_form.html:30 +msgid "Save" +msgstr "Mentés" + +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "Vágólap" + +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "Összes elem beillesztése ide" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "Összes vágólap elem mozgatása ide: " + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "Üres vágólap" + +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "A vágólap üres" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "sikertelen feltöltés" + +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +msgid "File is missing" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "Típus" + +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "Fájlméret" + +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "Módosítva" + +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "Létrehozva" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "found" +msgstr "találat" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "and" +msgstr "és " + +#: templates/admin/filer/tools/search_form.html:7 +msgid "cancel search" +msgstr "keresés megszakítása" + +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "Törlés" + +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "vagy dobja ide az egérrel a fájlokat" + +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "nincs fájl kiválasztva" + +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "Keresés" + +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "Fájl kiválasztása" + +#: templates/admin/filer/widgets/admin_folder.html:16 +msgid "Choose Folder" +msgstr "" + +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" +msgstr "" + +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" +msgstr "" + +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" +msgstr "" + +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" +msgstr "" + +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" +msgstr "" + +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." + +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" + +#~ msgid "Open file" +#~ msgstr "Open file" + +#~ msgid "Full size preview" +#~ msgstr "Full size preview" + +#~ msgid "Add Description" +#~ msgstr "Add Description" + +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" + +#~ msgid "none selected" +#~ msgstr "none selected" + +#~ msgid "Add Folder" +#~ msgstr "Add Folder" + +#~ msgid "Subject Location" +#~ msgstr "Subject location" + +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" +#~ msgstr[1] "15c0f2d28d6dab1af1f6d94906beb627_pl_1" + +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/it/LC_MESSAGES/django.mo b/filer/locale/it/LC_MESSAGES/django.mo index 28289619f..b15a9a632 100644 Binary files a/filer/locale/it/LC_MESSAGES/django.mo and b/filer/locale/it/LC_MESSAGES/django.mo differ diff --git a/filer/locale/it/LC_MESSAGES/django.po b/filer/locale/it/LC_MESSAGES/django.po index 59d3aaed1..f5d95d4b7 100644 --- a/filer/locale/it/LC_MESSAGES/django.po +++ b/filer/locale/it/LC_MESSAGES/django.po @@ -3,32 +3,49 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: -# Iacopo Spalletti , 2012. -# , 2012. +# Translators: +# Translators: +# yakky , 2012 +# yakky , 2013,2015-2018 +# yakky , 2012 +# yakky , 2012-2013,2015 msgid "" msgstr "" -"Project-Id-Version: django-filer\n" +"Project-Id-Version: django Filer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-07-13 19:10+0200\n" -"PO-Revision-Date: 2012-09-03 20:11+0100\n" -"Last-Translator: Stefan Foulis \n" -"Language-Team: Italian (http://www.transifex.com/projects/p/django-filer/" -"language/it/)\n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: yakky , 2013,2015-2018\n" +"Language-Team: Italian (http://app.transifex.com/divio/django-filer/language/" +"it/)\n" +"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" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? " +"1 : 2;\n" -#: views.py:103 -msgid "Folder with this name already exists." -msgstr "Esiste già una cartella con questo nome." +#: admin/clipboardadmin.py:17 +msgid "You do not have permission to upload files." +msgstr "" -#: admin/fileadmin.py:41 +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "" + +#: admin/clipboardadmin.py:20 +msgid "Can't use this folder, Permission Denied. Please select another folder." +msgstr "" + +#: admin/fileadmin.py:73 msgid "Advanced" msgstr "Avanzato" -#: admin/folderadmin.py:324 admin/folderadmin.py:427 +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "URL standard" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 msgid "" "Items must be selected in order to perform actions on them. No items have " "been changed." @@ -36,470 +53,588 @@ msgstr "" "Gli elementi devono essere selezionati in modo da eseguire azioni su di " "essi. Nessun elemento è stato modificato." -#: admin/folderadmin.py:344 +#: admin/folderadmin.py:434 #, python-format msgid "%(total_count)s selected" msgid_plural "All %(total_count)s selected" -msgstr[0] " %(total_count)s selezionati" -msgstr[1] "Tutti %(total_count)s selezionato" +msgstr[0] " %(total_count)s elemento selezionato" +msgstr[1] "Tutti e %(total_count)s selezionati" +msgstr[2] "Tutti e %(total_count)s selezionati" -#: admin/folderadmin.py:377 +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "%(folder_name)sLista file per " + +#: admin/folderadmin.py:475 #, python-format msgid "0 of %(cnt)s selected" msgstr "0 su %(cnt)s selezionati" -#: admin/folderadmin.py:456 +#: admin/folderadmin.py:612 msgid "No action selected." msgstr "Nessuna azione selezionata." -#: admin/folderadmin.py:497 +#: admin/folderadmin.py:664 #, python-format msgid "Successfully moved %(count)d files to clipboard." msgstr "%(count)d file spostati con successo negli appunti." -#: admin/folderadmin.py:503 +#: admin/folderadmin.py:669 msgid "Move selected files to clipboard" msgstr "Sposta i file selezionati negli Appunti" -#: admin/folderadmin.py:537 +#: admin/folderadmin.py:709 #, python-format msgid "Successfully disabled permissions for %(count)d files." msgstr "Permessi per %(count)d file disabilitati con successo." -#: admin/folderadmin.py:541 +#: admin/folderadmin.py:711 #, python-format msgid "Successfully enabled permissions for %(count)d files." msgstr "Permessi per %(count)d file abilitati con successo." -#: admin/folderadmin.py:550 +#: admin/folderadmin.py:719 msgid "Enable permissions for selected files" msgstr "Attiva i permessi per i file selezionati" -#: admin/folderadmin.py:555 +#: admin/folderadmin.py:725 msgid "Disable permissions for selected files" msgstr "Disabilita i permessi per i file selezionati" -#: admin/folderadmin.py:623 +#: admin/folderadmin.py:789 #, python-format msgid "Successfully deleted %(count)d files and/or folders." msgstr "%(count)d file e/o cartelle cancellati con successo." -#: admin/folderadmin.py:630 +#: admin/folderadmin.py:794 msgid "Cannot delete files and/or folders" msgstr "Non è possibile cancellare i file e/o le cartelle" -#: admin/folderadmin.py:632 +#: admin/folderadmin.py:796 msgid "Are you sure?" msgstr "Sei sicuro?" -#: admin/folderadmin.py:637 +#: admin/folderadmin.py:802 msgid "Delete files and/or folders" msgstr "Elimina i file e/o le cartelle" -#: admin/folderadmin.py:656 +#: admin/folderadmin.py:823 msgid "Delete selected files and/or folders" msgstr "Elimina i file e/o le cartelle selezionati" -#: admin/folderadmin.py:771 +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "Esistono altre cartelle chiamate %s nella destinazione selezionata" + +#: admin/folderadmin.py:934 #, python-format msgid "" "Successfully moved %(count)d files and/or folders to folder " "'%(destination)s'." msgstr "" -"%(count)d file e/o le cartelle nella cartella '%(destination)s' spostati con " -"successo." +"%(count)d file e/o le cartelle spostati con successo nella cartella " +"'%(destination)s'." -#: admin/folderadmin.py:778 admin/folderadmin.py:780 +#: admin/folderadmin.py:942 admin/folderadmin.py:944 msgid "Move files and/or folders" -msgstr "Sposta file e/o le cartelle" +msgstr "Sposta i file e/o le cartelle" -#: admin/folderadmin.py:797 +#: admin/folderadmin.py:959 msgid "Move selected files and/or folders" msgstr "Sposta i file e/o le cartelle selezionati" -#: admin/folderadmin.py:854 +#: admin/folderadmin.py:1016 #, python-format msgid "Successfully renamed %(count)d files." msgstr "%(count)d file rinominati con successo." -#: admin/folderadmin.py:862 admin/folderadmin.py:864 admin/folderadmin.py:881 +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 msgid "Rename files" msgstr "Rinomina file" -#: admin/folderadmin.py:975 +#: admin/folderadmin.py:1137 #, python-format msgid "" "Successfully copied %(count)d files and/or folders to folder " "'%(destination)s'." msgstr "" -"%(count)d file e/o cartelle nella cartella '%(destination)s ' copiati con " -"successo." +"%(count)d file e/o cartelle copiati con successo nella cartella " +"'%(destination)s '." -#: admin/folderadmin.py:989 admin/folderadmin.py:991 +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 msgid "Copy files and/or folders" msgstr "Copia i file e/o le cartelle" -#: admin/folderadmin.py:1010 +#: admin/folderadmin.py:1174 msgid "Copy selected files and/or folders" msgstr "Copia i file e/o le cartelle selezionati" -#: admin/folderadmin.py:1105 +#: admin/folderadmin.py:1279 #, python-format msgid "Successfully resized %(count)d images." msgstr "%(count)d immagini ridimensionate con successo." -#: admin/folderadmin.py:1113 admin/folderadmin.py:1115 +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 msgid "Resize images" msgstr "Ridimensiona le immagini" -#: admin/folderadmin.py:1133 +#: admin/folderadmin.py:1303 msgid "Resize selected images" msgstr "Ridimensiona le immagini selezionate" -#: admin/forms.py:26 +#: admin/forms.py:24 msgid "Suffix which will be appended to filenames of copied files." msgstr "Suffisso che sarà aggiunto al nome dei file copiati." -#: admin/forms.py:33 +#: admin/forms.py:31 #, python-format msgid "" "Suffix should be a valid, simple and lowercase filename part, like " "\"%(valid)s\"." msgstr "" -"Il suffisso dovrebbe essere valido, semplice e minuscolo per quanto riguarda " -"la parte del nome del file, come \"%(valid)s\"." +"Il suffisso deve essere una sezione del nome del file valida, semplice e " +"minuscola, come \"%(valid)s\"." -#: admin/forms.py:54 +#: admin/forms.py:52 #, python-format msgid "Unknown rename format value key \"%(key)s\"." msgstr "Valore del formato di rinomina non valido \"%(key)s\"." -#: admin/forms.py:56 +#: admin/forms.py:54 #, python-format msgid "Invalid rename format: %(error)s." msgstr "Formato di rinomina non valido: %(error)s." -#: admin/forms.py:62 +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 msgid "thumbnail option" msgstr "opzione anteprima immagine" -#: admin/forms.py:63 +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 msgid "width" msgstr "larghezza" -#: admin/forms.py:64 +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 msgid "height" msgstr "altezza" -#: admin/forms.py:65 +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 msgid "crop" msgstr "ritaglia" -#: admin/forms.py:66 +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 msgid "upscale" msgstr "ingrandisci" -#: admin/forms.py:71 +#: admin/forms.py:79 msgid "Thumbnail option or resize parameters must be choosen." msgstr "" -"L'opzione anteprima immagine o parametri di ridimensionamento devono essere " -"selezionati." - -#: admin/forms.py:73 -msgid "Resize parameters must be choosen." -msgstr "Devono essere scelte le opzioni di ridimensionamento." +"Devi selezionare l'opzione anteprima immagine o i parametri di " +"ridimensionamento." -#: admin/imageadmin.py:12 +#: admin/imageadmin.py:20 admin/imageadmin.py:112 msgid "Subject location" msgstr "Posizione del soggetto" -#: admin/imageadmin.py:13 -msgid "Location of the main subject of the scene." -msgstr "Posizione del soggetto principale della scena." +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "Posizione del soggetto principale della scena. Formato: \"x,y\"" + +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "Formato della posizione del soggetto non valida." + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "La posizione del soggetto è esterna all'immagine." + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "Valore fornito: \"{subject_location}\"" + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" +msgstr "" + +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" +msgstr "" + +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "Esiste già una cartella con questo nome." + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "Filer" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "Archivio file" + +#: models/abstract.py:62 +msgid "default alt text" +msgstr "testo predefinito per l'attributo alt " + +#: models/abstract.py:69 +msgid "default caption" +msgstr "didascalia predefinita" -#: models/clipboardmodels.py:9 models/foldermodels.py:236 +#: models/abstract.py:76 +msgid "subject location" +msgstr "posizione del soggetto" + +#: models/abstract.py:91 +msgid "image" +msgstr "immagine" + +#: models/abstract.py:92 +msgid "images" +msgstr "immagini" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "" + +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." +msgstr "" + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 msgid "user" msgstr "utente" -#: models/clipboardmodels.py:11 models/filemodels.py:287 +#: models/clipboardmodels.py:17 models/filemodels.py:157 msgid "files" msgstr "file" -#: models/clipboardmodels.py:34 models/clipboardmodels.py:40 +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 msgid "clipboard" -msgstr "Appunti" +msgstr "appunti" -#: models/clipboardmodels.py:35 +#: models/clipboardmodels.py:25 msgid "clipboards" msgstr "appunti" -#: models/clipboardmodels.py:39 models/filemodels.py:35 -#: models/filemodels.py:286 +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 msgid "file" msgstr "file" -#: models/clipboardmodels.py:44 +#: models/clipboardmodels.py:56 msgid "clipboard item" -msgstr "Elemento Appunti" +msgstr "elemento degli appunti" -#: models/clipboardmodels.py:45 +#: models/clipboardmodels.py:57 msgid "clipboard items" -msgstr "Elementi Appunti" +msgstr "elementi degli appunti" -#: models/filemodels.py:33 templates/admin/filer/folder/change_form.html:9 -#: templates/admin/filer/folder/directory_listing.html:74 +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 #: templates/admin/filer/folder/new_folder_form.html:4 -#: templates/admin/filer/tools/clipboard/clipboard.html:26 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 msgid "folder" msgstr "cartella" -#: models/filemodels.py:36 +#: models/filemodels.py:81 msgid "file size" msgstr "dimensione file" -#: models/filemodels.py:38 +#: models/filemodels.py:87 msgid "sha1" msgstr "sha1" -#: models/filemodels.py:40 +#: models/filemodels.py:94 msgid "has all mandatory data" msgstr "ha tutti i dati obbligatori" -#: models/filemodels.py:42 +#: models/filemodels.py:100 msgid "original filename" msgstr "nome del file originale" -#: models/filemodels.py:44 models/foldermodels.py:99 +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 msgid "name" msgstr "nome" -#: models/filemodels.py:46 +#: models/filemodels.py:116 msgid "description" msgstr "descrizione" -#: models/filemodels.py:50 +#: models/filemodels.py:125 models/foldermodels.py:108 msgid "owner" msgstr "proprietario" -#: models/filemodels.py:52 models/foldermodels.py:105 +#: models/filemodels.py:129 models/foldermodels.py:116 msgid "uploaded at" -msgstr "caricato in " +msgstr "caricato il" -#: models/filemodels.py:53 models/foldermodels.py:108 +#: models/filemodels.py:134 models/foldermodels.py:126 msgid "modified at" -msgstr "modificato in" +msgstr "modificato il" -#: models/filemodels.py:57 +#: models/filemodels.py:140 msgid "Permissions disabled" msgstr "Permessi disabilitati" -#: models/filemodels.py:58 -msgid "Disable any permission checking for this " -msgstr "Disabilitare controllo permessi per questo" +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "" +"Disabilita ogni controllo dei permessi per questo file. Il file sarà " +"accessibile da chiunque" + +#: models/foldermodels.py:94 +msgid "parent" +msgstr "" -#: models/foldermodels.py:107 +#: models/foldermodels.py:121 msgid "created at" -msgstr "creato in" +msgstr "creato il" -#: models/foldermodels.py:211 -#: templates/admin/filer/widgets/admin_folder.html:3 -#: templates/admin/filer/widgets/admin_folder.html:5 +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 msgid "Folder" msgstr "Cartella" -#: models/foldermodels.py:212 +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 msgid "Folders" msgstr "Cartelle" -#: models/foldermodels.py:227 +#: models/foldermodels.py:260 msgid "all items" msgstr "tutti gli elementi" -#: models/foldermodels.py:228 +#: models/foldermodels.py:261 msgid "this item only" msgstr "solo questo elemento" -#: models/foldermodels.py:229 +#: models/foldermodels.py:262 msgid "this item and all children" -msgstr "questa elemento e tutti i figli" +msgstr "questo elemento e tutti i figli" -#: models/foldermodels.py:233 +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "permetti" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "nega" + +#: models/foldermodels.py:280 msgid "type" msgstr "tipo" -#: models/foldermodels.py:239 +#: models/foldermodels.py:297 msgid "group" msgstr "gruppo" -#: models/foldermodels.py:240 +#: models/foldermodels.py:304 msgid "everybody" msgstr "tutti" -#: models/foldermodels.py:242 -msgid "can edit" -msgstr "in grado modificare" - -#: models/foldermodels.py:243 +#: models/foldermodels.py:309 msgid "can read" -msgstr "in grado di leggere" +msgstr "può leggere" + +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "può modificare" -#: models/foldermodels.py:244 +#: models/foldermodels.py:325 msgid "can add children" -msgstr "in grado di aggiungere figli" +msgstr "può aggiungere figli" -#: models/foldermodels.py:273 +#: models/foldermodels.py:333 msgid "folder permission" msgstr "permessi cartella" -#: models/foldermodels.py:274 +#: models/foldermodels.py:334 msgid "folder permissions" msgstr "permessi cartella" -#: models/imagemodels.py:39 -msgid "date taken" -msgstr "data presa" +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." +msgstr "" -#: models/imagemodels.py:42 -msgid "default alt text" -msgstr "testo predefinito per l'attributo alt " +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." +msgstr "" -#: models/imagemodels.py:43 -msgid "default caption" -msgstr "didascalia predefinita" +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." +msgstr "" + +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." +msgstr "" + +#: models/foldermodels.py:360 +msgid "All Folders" +msgstr "" + +#: models/foldermodels.py:362 +msgid "Logical Path" +msgstr "" + +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" +msgstr "" + +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" +msgstr "" + +#: models/foldermodels.py:375 +msgid "Everybody" +msgstr "" -#: models/imagemodels.py:45 templates/image_filer/image.html:6 +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "" + +#: models/foldermodels.py:389 +msgid "Read" +msgstr "" + +#: models/foldermodels.py:390 +msgid "Add children" +msgstr "" + +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "data di creazione" + +#: models/imagemodels.py:25 msgid "author" msgstr "autore" -#: models/imagemodels.py:47 +#: models/imagemodels.py:32 msgid "must always publish author credit" msgstr "pubblica sempre i crediti all'autore" -#: models/imagemodels.py:48 +#: models/imagemodels.py:37 msgid "must always publish copyright" msgstr "pubblica sempre il copyright" -#: models/imagemodels.py:50 -msgid "subject location" -msgstr "posizione del soggetto" +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "larghezza in pixel." -#: models/imagemodels.py:200 -msgid "image" -msgstr "immagine" +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "altezza in pixel." -#: models/imagemodels.py:201 -msgid "images" -msgstr "immagini" +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "opzione anteprima immagine" -#: models/virtualitems.py:45 -#: templates/admin/filer/tools/clipboard/clipboard.html:26 -msgid "unfiled files" -msgstr "file archiviati" +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "File non archiviati" -#: models/virtualitems.py:59 +#: models/virtualitems.py:73 msgid "files with missing metadata" msgstr "file con metadati mancanti" -#: models/virtualitems.py:73 templates/admin/filer/breadcrumbs.html:6 -#: templates/admin/filer/folder/change_form.html:9 -#: templates/admin/filer/folder/directory_listing.html:74 -#: templates/image_filer/image_export_form.html:10 +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 msgid "root" msgstr "cartella principale" -#: templates/admin/filer/actions.html:4 +#: settings.py:273 +msgid "Show table view" +msgstr "" + +#: settings.py:278 +msgid "Show thumbnail view" +msgstr "" + +#: templates/admin/filer/actions.html:5 msgid "Run the selected action" msgstr "Esegui l'azione selezionata" -#: templates/admin/filer/actions.html:4 +#: templates/admin/filer/actions.html:5 msgid "Go" msgstr "Vai" -#: templates/admin/filer/actions.html:11 +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 msgid "Click here to select the objects across all pages" msgstr "Clicca qui per selezionare gli oggetti in tutte le pagine" -#: templates/admin/filer/actions.html:11 +#: templates/admin/filer/actions.html:14 #, python-format msgid "Select all %(total_count)s files and/or folders" msgstr "Seleziona tutti i %(total_count)s file e/o cartelle" -#: templates/admin/filer/actions.html:13 +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 msgid "Clear selection" msgstr "Cancella selezione" #: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 msgid "Go back to admin homepage" msgstr "Torna alla pagina iniziale di admin" #: templates/admin/filer/breadcrumbs.html:4 -#: templates/admin/filer/folder/change_form.html:7 -#: templates/image_filer/image_export_form.html:7 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 msgid "Home" msgstr "Pagina iniziale" #: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 msgid "Go back to Filer app" msgstr "Torna all'app Filer" -#: templates/admin/filer/breadcrumbs.html:5 -#: templates/admin/filer/folder/change_form.html:8 -#: templates/image_filer/image_export_form.html:8 -msgid "Filer" -msgstr "Filer" - #: templates/admin/filer/breadcrumbs.html:6 -#: templates/image_filer/image_export_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:35 msgid "Go back to root folder" msgstr "Torna alla cartella principale" #: templates/admin/filer/breadcrumbs.html:8 -#: templates/admin/filer/breadcrumbs.html:11 -#: templates/admin/filer/folder/change_form.html:11 -#: templates/image_filer/image_export_form.html:12 -#: templates/image_filer/image_export_form.html:14 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 #, python-format msgid "Go back to '%(folder_name)s' folder" msgstr "Torna alla cartella ' %(folder_name)s '" -#: templates/admin/filer/change_form.html:28 -msgid "duplicates" -msgstr "duplicati" - -#: templates/admin/filer/delete_confirmation.html:13 -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"La cancellazione dell'elemento %(object_name)s '%(escaped_object)s' richiede " -"la cancellazione di elementi collegati, ma il tuo account non ha i permessi " -"per cancellare i seguenti tipi di oggetto:" - -#: templates/admin/filer/delete_confirmation.html:21 -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"La cancellazione dell'elemento %(object_name)s '%(escaped_object)s' richiede " -"la cancellazione dei seguenti elementi protetti collegati:" - -#: templates/admin/filer/delete_confirmation.html:29 -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Sei sicuro di voler cancellare l'elemento %(object_name)s " -"\"%(escaped_object)s\"? \n" -"Tutti gli elementi collegati seguenti saranno cancellati:" - -#: templates/admin/filer/delete_confirmation.html:34 -#: templates/admin/filer/delete_selected_files_confirmation.html:45 -msgid "Yes, I'm sure" -msgstr "Sì, sono sicuro" +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "Duplicati" #: templates/admin/filer/delete_selected_files_confirmation.html:11 msgid "" @@ -527,39 +662,52 @@ msgstr "" "Sei sicuro di voler cancellare i file selezionati e/o le cartelle? Tutti gli " "oggetti seguenti e quelli correlati verranno cancellati:" -#: templates/admin/filer/folder/change_form.html:7 -#: templates/admin/filer/folder/change_form.html:8 -#: templates/admin/filer/folder/change_form.html:9 -#: templates/admin/filer/folder/directory_listing.html:74 -#: templates/image_filer/image_export_form.html:7 -#: templates/image_filer/image_export_form.html:8 -#: templates/image_filer/image_export_form.html:16 -msgid "Go back to" -msgstr "Torna a" +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "No, torna indietro" -#: templates/admin/filer/folder/change_form.html:7 -#: templates/image_filer/image_export_form.html:7 -msgid "admin homepage" -msgstr "Pagina iniziale admin" +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "Sì, sono sicuro" -#: templates/admin/filer/folder/change_form.html:22 -#: templates/admin/filer/image/change_form.html:9 +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 msgid "History" msgstr "Storia" +#: templates/admin/filer/file/change_form.html:37 #: templates/admin/filer/folder/change_form.html:23 -#: templates/admin/filer/image/change_form.html:10 +#: templates/admin/filer/image/change_form.html:37 msgid "View on site" msgstr "Vedi sul sito" -#: templates/admin/filer/folder/change_form.html:35 -#: templates/admin/filer/folder/directory_listing.html:75 -#: templates/admin/filer/folder/directory_listing.html:85 -#: templates/admin/filer/folder/directory_table.html:23 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "Torna a" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "Pagina iniziale admin" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 msgid "Folder Icon" msgstr "Icona della cartella" -#: templates/admin/filer/folder/choose_copy_destination.html:12 +#: templates/admin/filer/folder/choose_copy_destination.html:23 msgid "" "Your account doesn't have permissions to copy all of the selected files and/" "or folders." @@ -567,16 +715,25 @@ msgstr "" "Il tuo account non dispone delle autorizzazioni per copiare tutti i file e/o " "cartelle selezionati." -#: templates/admin/filer/folder/choose_copy_destination.html:15 -#: templates/admin/filer/folder/choose_move_destination.html:15 +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "Torna indietro" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 msgid "There are no destination folders available." msgstr "Non ci sono cartelle di destinazione disponibili." -#: templates/admin/filer/folder/choose_copy_destination.html:18 +#: templates/admin/filer/folder/choose_copy_destination.html:35 msgid "There are no files and/or folders available to copy." msgstr "Non ci sono file e/o le cartelle disponibili per la copia." -#: templates/admin/filer/folder/choose_copy_destination.html:20 +#: templates/admin/filer/folder/choose_copy_destination.html:40 msgid "" "The following files and/or folders will be copied to a destination folder " "(retaining their tree structure):" @@ -584,41 +741,43 @@ msgstr "" "I seguenti file e/o cartelle verranno copiati in una cartella di " "destinazione (mantenendo la loro struttura ad albero):" -#: templates/admin/filer/folder/choose_copy_destination.html:32 -#: templates/admin/filer/folder/choose_move_destination.html:32 +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 msgid "Destination folder:" msgstr "Cartella di destinazione:" -#: templates/admin/filer/folder/choose_copy_destination.html:39 +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 msgid "Copy" msgstr "Copia" -#: templates/admin/filer/folder/choose_images_resize_options.html:12 +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "Non è autorizzato a copiare file nella stessa cartella" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 msgid "" "Your account doesn't have permissions to resize all of the selected images." msgstr "" "Il tuo account non dispone delle autorizzazioni per ridimensionare tutte le " "immagini selezionate." -#: templates/admin/filer/folder/choose_images_resize_options.html:15 +#: templates/admin/filer/folder/choose_images_resize_options.html:18 msgid "There are no images available to resize." msgstr "Non ci sono immagini disponibili da ridimensionare." -#: templates/admin/filer/folder/choose_images_resize_options.html:17 +#: templates/admin/filer/folder/choose_images_resize_options.html:20 msgid "The following images will be resized:" msgstr "Le seguenti immagini verranno ridimensionate:" -#: templates/admin/filer/folder/choose_images_resize_options.html:30 +#: templates/admin/filer/folder/choose_images_resize_options.html:32 msgid "Choose an existing thumbnail option or enter resize parameters:" msgstr "" -"Scegli un'opzione esistente miniatura o immettere i parametri di " +"Scegli un'opzione miniatura esistente o immetti i parametri di " "ridimensionamento:" -#: templates/admin/filer/folder/choose_images_resize_options.html:32 -msgid "Choose resize parameters:" -msgstr "Scegli i parametri di ridimensionamento:" - -#: templates/admin/filer/folder/choose_images_resize_options.html:35 +#: templates/admin/filer/folder/choose_images_resize_options.html:36 msgid "" "Warning: Images will be resized in-place and originals will be lost. Maybe " "first make a copy of them to retain the originals." @@ -626,11 +785,11 @@ msgstr "" "Attenzione: Le immagini verranno ridimensionate ora e le immagini originali " "andranno perse. Forse è meglio fare una copia per mantenere i file originali." -#: templates/admin/filer/folder/choose_images_resize_options.html:36 +#: templates/admin/filer/folder/choose_images_resize_options.html:39 msgid "Resize" msgstr "Ridimensiona" -#: templates/admin/filer/folder/choose_move_destination.html:12 +#: templates/admin/filer/folder/choose_move_destination.html:35 msgid "" "Your account doesn't have permissions to move all of the selected files and/" "or folders." @@ -638,11 +797,11 @@ msgstr "" "Il tuo account non dispone delle autorizzazioni per spostare tutti i file e/" "o cartelle selezionati." -#: templates/admin/filer/folder/choose_move_destination.html:18 +#: templates/admin/filer/folder/choose_move_destination.html:47 msgid "There are no files and/or folders available to move." msgstr "Non ci sono file e/o cartelle a disponibili per lo spostamento." -#: templates/admin/filer/folder/choose_move_destination.html:20 +#: templates/admin/filer/folder/choose_move_destination.html:52 msgid "" "The following files and/or folders will be moved to a destination folder " "(retaining their tree structure):" @@ -650,22 +809,28 @@ msgstr "" "I seguenti file e/o cartelle verranno spostati in una cartella di " "destinazione (mantenendo la loro struttura ad albero):" -#: templates/admin/filer/folder/choose_move_destination.html:38 +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 msgid "Move" msgstr "Sposta" -#: templates/admin/filer/folder/choose_rename_format.html:12 +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "Non è autorizzato a spostare file nella stessa cartella" + +#: templates/admin/filer/folder/choose_rename_format.html:15 msgid "" "Your account doesn't have permissions to rename all of the selected files." msgstr "" "Il tuo account non dispone delle autorizzazioni per rinominare tutti i file " "selezionati." -#: templates/admin/filer/folder/choose_rename_format.html:15 +#: templates/admin/filer/folder/choose_rename_format.html:18 msgid "There are no files available to rename." -msgstr "Non ci sono file disponibili da ridimensionare." +msgstr "Non ci sono file disponibili da rinominare." -#: templates/admin/filer/folder/choose_rename_format.html:17 +#: templates/admin/filer/folder/choose_rename_format.html:20 msgid "" "The following files will be renamed (they will stay in their folders and " "keep original filename, only displayed filename will be changed):" @@ -674,260 +839,436 @@ msgstr "" "manterranno il nome del file originario, solo il nome visualizzato sarà " "modificato):" -#: templates/admin/filer/folder/choose_rename_format.html:54 +#: templates/admin/filer/folder/choose_rename_format.html:59 msgid "Rename" msgstr "Rinomina" -#: templates/admin/filer/folder/directory_listing.html:66 -msgid "Adds a new Folder" -msgstr "Aggiungi una nuova cartella" +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "Torna alla cartella superiore" -#: templates/admin/filer/folder/directory_listing.html:66 -#: templates/image_filer/include/export_dialog.html:34 -msgid "New Folder" -msgstr "Nuova cartella" +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "Modifica i dettagli della cartella corrente" -#: templates/admin/filer/folder/directory_listing.html:67 -msgid "upload files" -msgstr "carica file" +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "Modifica" -#: templates/admin/filer/folder/directory_listing.html:67 -msgid "Upload" -msgstr "Carica" +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "Clicca qui per eseguire la ricerca della frase inserita" -#: templates/admin/filer/folder/directory_listing.html:74 -msgid "Go back to the parent folder" -msgstr "Torna alla cartella superiore" +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "Cerca" -#: templates/admin/filer/folder/directory_listing.html:76 -#: templates/admin/filer/folder/directory_table.html:29 -#: templates/admin/filer/tools/search_form.html:18 -#, python-format -msgid "1 folder" -msgid_plural "%(counter)s folders" -msgstr[0] "1 cartella" -msgstr[1] "%(counter)s cartelle" +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "Chiudi" -#: templates/admin/filer/folder/directory_listing.html:76 -#: templates/admin/filer/folder/directory_table.html:29 -#: templates/admin/filer/tools/search_form.html:19 -#, python-format -msgid "1 file" -msgid_plural "%(counter)s files" -msgstr[0] "1 file" -msgstr[1] "%(counter)s file" +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "Limita" -#: templates/admin/filer/folder/directory_listing.html:80 -msgid "Change current folder details" -msgstr "Modifica dettagli cartella corrente" +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "Seleziona per limitare la ricerca alla cartella corrente" -#: templates/admin/filer/folder/directory_listing.html:80 -#: templates/admin/filer/folder/directory_table.html:27 -#: templates/admin/filer/folder/directory_table.html:43 -msgid "Change" -msgstr "Cambia" +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "Limita la ricerca alla cartella corrente" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "Cancella" -#: templates/admin/filer/folder/directory_table.html:13 +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "Aggiungi una nuova cartella" + +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "Nuova cartella" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "Carica file" + +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "E' necessario selezionare prima una cartella" + +#: templates/admin/filer/folder/directory_table_list.html:16 msgid "Name" msgstr "Nome" -#: templates/admin/filer/folder/directory_table.html:23 -#: templates/admin/filer/folder/directory_table.html:27 -#: templates/admin/filer/folder/directory_table.html:29 +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "Proprietario" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "Dimensione" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "Azione" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 #, python-format msgid "Change '%(item_label)s' folder details" -msgstr "Modifica dettagli cartella '%(item_label)s'" +msgstr "Modifica i dettagli della cartella '%(item_label)s'" -#: templates/admin/filer/folder/directory_table.html:30 -#: templates/admin/filer/folder/directory_table.html:45 -msgid "Owner" -msgstr "Proprietario" +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "%(counter)s cartella" +msgstr[1] "%(counter)s cartelle" +msgstr[2] "%(counter)s cartelle" -#: templates/admin/filer/folder/directory_table.html:37 +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "%(counter)s file" +msgstr[1] "%(counter)s file" +msgstr[2] "%(counter)s file" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "Modifica i dettagli della cartella" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "Cancella cartella" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 msgid "Select this file" msgstr "Seleziona questo file" -#: templates/admin/filer/folder/directory_table.html:39 -#: templates/admin/filer/folder/directory_table.html:43 -#: templates/admin/filer/folder/directory_table.html:44 +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 #, python-format msgid "Change '%(item_label)s' details" -msgstr "Cambia dettagli ' %(item_label)s ' " +msgstr "Modifica i dettagli di ' %(item_label)s ' " -#: templates/admin/filer/folder/directory_table.html:42 -#, python-format -msgid "Delete '%(item_label)s'" -msgstr "Cancella '%(item_label)s'" - -#: templates/admin/filer/folder/directory_table.html:42 -msgid "Delete" -msgstr "Cancella" - -#: templates/admin/filer/folder/directory_table.html:46 +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 msgid "Permissions" msgstr "Permessi" -#: templates/admin/filer/folder/directory_table.html:46 +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 msgid "disabled" msgstr "disabilitato" -#: templates/admin/filer/folder/directory_table.html:46 +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 msgid "enabled" msgstr "abilitato" -#: templates/admin/filer/folder/directory_table.html:50 -msgid "Move to clipboard" -msgstr "Sposta negli Appunti" +#: templates/admin/filer/folder/directory_table_list.html:144 +#, fuzzy +#| msgid "Move selected files to clipboard" +msgid "URL copied to clipboard" +msgstr "Sposta i file selezionati negli Appunti" + +#: templates/admin/filer/folder/directory_table_list.html:147 +#, python-format +msgid "Canonical url '%(item_label)s'" +msgstr "URL canonico '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:151 +#, python-format +msgid "Download '%(item_label)s'" +msgstr "Download '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "Cancella file" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "Posiziona qui i file o usa il bottone \"Carica file\"" + +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "Posiziona il file da caricare in:" + +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "Carica" + +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "annulla" + +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "Caricamento avvenuto!" -#: templates/admin/filer/folder/directory_table.html:58 -msgid "there are no files or subfolders" -msgstr "non ci sono file o sottocartelle" +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "Caricamento annullato!" -#: templates/admin/filer/folder/directory_table.html:65 +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 msgid "previous" msgstr "precedente" -#: templates/admin/filer/folder/directory_table.html:69 +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 #, python-format -msgid "" -"\n" -" Page %(number)s of %(num_pages)s.\n" -" " -msgstr "" -"\n" -"Pagina %(number)s su %(num_pages)s ." +msgid "Page %(number)s of %(num_pages)s." +msgstr "Pagina %(number)s su %(num_pages)s." -#: templates/admin/filer/folder/directory_table.html:75 +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 msgid "next" msgstr "prossima" +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "Seleziona tutti %(total_count)s" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +msgid "Select all" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +msgid "Files" +msgstr "" + #: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 msgid "Add new" -msgstr "Aggiungi nuova" +msgstr "Aggiungi nuovo" -#: templates/admin/filer/folder/new_folder_form.html:13 +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" +msgstr "Amministrazione Django" + +#: templates/admin/filer/folder/new_folder_form.html:15 msgid "Please correct the error below." msgid_plural "Please correct the errors below." msgstr[0] "Correggi l'errore qui sotto." msgstr[1] "Correggi gli errori qui sotto." +msgstr[2] "Correggi gli errori qui sotto." -#: templates/admin/filer/folder/new_folder_form.html:28 +#: templates/admin/filer/folder/new_folder_form.html:30 msgid "Save" msgstr "Salva" -#: templates/admin/filer/image/change_form.html:21 -msgid "Full size preview" -msgstr "Anteprima a tutto schermo" +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." +msgstr "" -#: templates/admin/filer/tools/search_form.html:8 -#: templates/admin/filer/tools/search_form.html:14 -msgid "Search" -msgstr "Cerca" +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." +msgstr "" -#: templates/admin/filer/tools/search_form.html:13 -msgid "Enter your search phrase here" -msgstr "Inserisci la tua frase di ricerca qui" +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "Appunti" -#: templates/admin/filer/tools/search_form.html:14 -msgid "Click here to" -msgstr "Clicca qui per" +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "Incolla qui tutti gli elementi" -#: templates/admin/filer/tools/search_form.html:14 -msgid "run search for entered phrase" -msgstr "esegui la ricerca per frase inserita" +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "Sposta tutti i file negli Appunti in" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "Svuota appunti" + +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "gli appunti sono vuoti" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "caricamento fallito" + +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +msgid "File is missing" +msgstr "" -#: templates/admin/filer/tools/search_form.html:15 -msgid "Check it to" -msgstr "Seleziona per" +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "Tipo" -#: templates/admin/filer/tools/search_form.html:15 -#: templates/admin/filer/tools/search_form.html:16 -msgid "limit the search to current folder" -msgstr "limitare la ricerca alla cartella corrente" +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "Dimensione file" -#: templates/admin/filer/tools/search_form.html:18 +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "Modificato" + +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "Creato" + +#: templates/admin/filer/tools/search_form.html:5 msgid "found" msgstr "trovato" -#: templates/admin/filer/tools/search_form.html:18 +#: templates/admin/filer/tools/search_form.html:5 msgid "and" msgstr "e" -#: templates/admin/filer/tools/search_form.html:19 +#: templates/admin/filer/tools/search_form.html:7 msgid "cancel search" msgstr "annulla ricerca" -#: templates/admin/filer/tools/upload_button_js.html:24 -#: templates/admin/filer/widgets/admin_file.html:7 -#: templates/admin/filer/widgets/admin_file.html:8 -msgid "file missing" -msgstr "file mancante" +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "Cancella" + +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "o posiziona il file qui" -#: templates/admin/filer/tools/clipboard/clipboard.html:7 -msgid "Clipboard" -msgstr "Appunti" +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "nessun file selezionato" -#: templates/admin/filer/tools/clipboard/clipboard.html:19 -msgid "Paste all items here" -msgstr "Incolla qui tutti gli elementi" +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "Consultazione" -#: templates/admin/filer/tools/clipboard/clipboard.html:26 -msgid "discard" -msgstr "annulla" +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "Seleziona file" -#: templates/admin/filer/tools/clipboard/clipboard.html:26 -msgid "Move all clipboard files to" -msgstr "Sposta tutti i file negli Appunti in" +#: templates/admin/filer/widgets/admin_folder.html:16 +msgid "Choose Folder" +msgstr "" -#: templates/admin/filer/tools/clipboard/clipboard.html:43 -msgid "the clipboard is empty" -msgstr "gli Appunti sono vuoti" +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" +msgstr "" -#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:11 -msgid "upload failed" -msgstr "caricamento fallito" +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" +msgstr "" -#: templates/admin/filer/widgets/admin_file.html:11 -msgid "no file selected" -msgstr "nessun file selezionato" +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" +msgstr "" -#: templates/admin/filer/widgets/admin_file.html:14 -#: templates/admin/filer/widgets/admin_file.html:15 -#: templates/admin/filer/widgets/admin_folder.html:7 -#: templates/admin/filer/widgets/admin_folder.html:8 -msgid "Lookup" -msgstr "Consultazione" +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" +msgstr "" -#: templates/admin/filer/widgets/admin_file.html:17 -#: templates/admin/filer/widgets/admin_folder.html:10 -msgid "Clear" -msgstr "Cancella" +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" +msgstr "" -#: templates/admin/filer/widgets/admin_folder.html:5 -msgid "none selected" -msgstr "nessun elemento selezionato" +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." -#: templates/image_filer/folder.html:3 -#, python-format -msgid "Folder '%(folder_label)s' files" -msgstr "File cartella ' %(folder_label)s '" +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" + +#~ msgid "Open file" +#~ msgstr "Open file" + +#~ msgid "Full size preview" +#~ msgstr "Full size preview" + +#~ msgid "Add Description" +#~ msgstr "Add Description" + +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" -#: templates/image_filer/folder.html:6 -msgid "File name" -msgstr "Nome file" +#~ msgid "none selected" +#~ msgstr "none selected" -#: templates/image_filer/image_export_form.html:17 -msgid "export" -msgstr "esporta" +#~ msgid "Add Folder" +#~ msgstr "Add Folder" -#: templates/image_filer/image_export_form.html:27 -msgid "download image" -msgstr "scarica immagine" +#~ msgid "Subject Location" +#~ msgstr "Subject location" -#: templates/image_filer/include/export_dialog.html:13 -msgid "Folder name already taken." -msgstr "Nome cartella già utilizzato." +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" +#~ msgstr[1] "15c0f2d28d6dab1af1f6d94906beb627_pl_1" +#~ msgstr[2] "15c0f2d28d6dab1af1f6d94906beb627_pl_2" -#: templates/image_filer/include/export_dialog.html:15 -msgid "Submit" -msgstr "Invia" +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/ja/LC_MESSAGES/django.mo b/filer/locale/ja/LC_MESSAGES/django.mo new file mode 100644 index 000000000..f18d8161c Binary files /dev/null and b/filer/locale/ja/LC_MESSAGES/django.mo differ diff --git a/filer/locale/ja/LC_MESSAGES/django.po b/filer/locale/ja/LC_MESSAGES/django.po new file mode 100644 index 000000000..bb438c591 --- /dev/null +++ b/filer/locale/ja/LC_MESSAGES/django.po @@ -0,0 +1,1219 @@ +# 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: +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django Filer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: Angelo Dini \n" +"Language-Team: Japanese (http://app.transifex.com/divio/django-filer/" +"language/ja/)\n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: admin/clipboardadmin.py:17 +msgid "You do not have permission to upload files." +msgstr "" + +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "" + +#: admin/clipboardadmin.py:20 +msgid "Can't use this folder, Permission Denied. Please select another folder." +msgstr "" + +#: admin/fileadmin.py:73 +msgid "Advanced" +msgstr "" + +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" + +#: admin/folderadmin.py:434 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "" + +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "" + +#: admin/folderadmin.py:475 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "" + +#: admin/folderadmin.py:612 +msgid "No action selected." +msgstr "" + +#: admin/folderadmin.py:664 +#, python-format +msgid "Successfully moved %(count)d files to clipboard." +msgstr "" + +#: admin/folderadmin.py:669 +msgid "Move selected files to clipboard" +msgstr "" + +#: admin/folderadmin.py:709 +#, python-format +msgid "Successfully disabled permissions for %(count)d files." +msgstr "" + +#: admin/folderadmin.py:711 +#, python-format +msgid "Successfully enabled permissions for %(count)d files." +msgstr "" + +#: admin/folderadmin.py:719 +msgid "Enable permissions for selected files" +msgstr "" + +#: admin/folderadmin.py:725 +msgid "Disable permissions for selected files" +msgstr "" + +#: admin/folderadmin.py:789 +#, python-format +msgid "Successfully deleted %(count)d files and/or folders." +msgstr "" + +#: admin/folderadmin.py:794 +msgid "Cannot delete files and/or folders" +msgstr "" + +#: admin/folderadmin.py:796 +msgid "Are you sure?" +msgstr "" + +#: admin/folderadmin.py:802 +msgid "Delete files and/or folders" +msgstr "" + +#: admin/folderadmin.py:823 +msgid "Delete selected files and/or folders" +msgstr "" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "" + +#: admin/folderadmin.py:934 +#, python-format +msgid "" +"Successfully moved %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" + +#: admin/folderadmin.py:942 admin/folderadmin.py:944 +msgid "Move files and/or folders" +msgstr "" + +#: admin/folderadmin.py:959 +msgid "Move selected files and/or folders" +msgstr "" + +#: admin/folderadmin.py:1016 +#, python-format +msgid "Successfully renamed %(count)d files." +msgstr "" + +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 +msgid "Rename files" +msgstr "" + +#: admin/folderadmin.py:1137 +#, python-format +msgid "" +"Successfully copied %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" + +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 +msgid "Copy files and/or folders" +msgstr "" + +#: admin/folderadmin.py:1174 +msgid "Copy selected files and/or folders" +msgstr "" + +#: admin/folderadmin.py:1279 +#, python-format +msgid "Successfully resized %(count)d images." +msgstr "" + +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 +msgid "Resize images" +msgstr "" + +#: admin/folderadmin.py:1303 +msgid "Resize selected images" +msgstr "" + +#: admin/forms.py:24 +msgid "Suffix which will be appended to filenames of copied files." +msgstr "" + +#: admin/forms.py:31 +#, python-format +msgid "" +"Suffix should be a valid, simple and lowercase filename part, like " +"\"%(valid)s\"." +msgstr "" + +#: admin/forms.py:52 +#, python-format +msgid "Unknown rename format value key \"%(key)s\"." +msgstr "" + +#: admin/forms.py:54 +#, python-format +msgid "Invalid rename format: %(error)s." +msgstr "" + +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 +msgid "thumbnail option" +msgstr "" + +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 +msgid "width" +msgstr "" + +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 +msgid "height" +msgstr "" + +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 +msgid "crop" +msgstr "" + +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 +msgid "upscale" +msgstr "" + +#: admin/forms.py:79 +msgid "Thumbnail option or resize parameters must be choosen." +msgstr "" + +#: admin/imageadmin.py:20 admin/imageadmin.py:112 +msgid "Subject location" +msgstr "" + +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "" + +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "" + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "" + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "" + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" +msgstr "" + +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" +msgstr "" + +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "" + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "" + +#: models/abstract.py:62 +msgid "default alt text" +msgstr "" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "" + +#: models/abstract.py:76 +msgid "subject location" +msgstr "" + +#: models/abstract.py:91 +msgid "image" +msgstr "" + +#: models/abstract.py:92 +msgid "images" +msgstr "" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "" + +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." +msgstr "" + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 +msgid "user" +msgstr "" + +#: models/clipboardmodels.py:17 models/filemodels.py:157 +msgid "files" +msgstr "" + +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 +msgid "clipboard" +msgstr "" + +#: models/clipboardmodels.py:25 +msgid "clipboards" +msgstr "" + +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 +msgid "file" +msgstr "" + +#: models/clipboardmodels.py:56 +msgid "clipboard item" +msgstr "" + +#: models/clipboardmodels.py:57 +msgid "clipboard items" +msgstr "" + +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "folder" +msgstr "" + +#: models/filemodels.py:81 +msgid "file size" +msgstr "" + +#: models/filemodels.py:87 +msgid "sha1" +msgstr "" + +#: models/filemodels.py:94 +msgid "has all mandatory data" +msgstr "" + +#: models/filemodels.py:100 +msgid "original filename" +msgstr "" + +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 +msgid "name" +msgstr "" + +#: models/filemodels.py:116 +msgid "description" +msgstr "" + +#: models/filemodels.py:125 models/foldermodels.py:108 +msgid "owner" +msgstr "" + +#: models/filemodels.py:129 models/foldermodels.py:116 +msgid "uploaded at" +msgstr "" + +#: models/filemodels.py:134 models/foldermodels.py:126 +msgid "modified at" +msgstr "" + +#: models/filemodels.py:140 +msgid "Permissions disabled" +msgstr "" + +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "" + +#: models/foldermodels.py:94 +msgid "parent" +msgstr "" + +#: models/foldermodels.py:121 +msgid "created at" +msgstr "" + +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Folder" +msgstr "" + +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 +msgid "Folders" +msgstr "" + +#: models/foldermodels.py:260 +msgid "all items" +msgstr "" + +#: models/foldermodels.py:261 +msgid "this item only" +msgstr "" + +#: models/foldermodels.py:262 +msgid "this item and all children" +msgstr "" + +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "" + +#: models/foldermodels.py:280 +msgid "type" +msgstr "" + +#: models/foldermodels.py:297 +msgid "group" +msgstr "" + +#: models/foldermodels.py:304 +msgid "everybody" +msgstr "" + +#: models/foldermodels.py:309 +msgid "can read" +msgstr "" + +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "" + +#: models/foldermodels.py:325 +msgid "can add children" +msgstr "" + +#: models/foldermodels.py:333 +msgid "folder permission" +msgstr "" + +#: models/foldermodels.py:334 +msgid "folder permissions" +msgstr "" + +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." +msgstr "" + +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." +msgstr "" + +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." +msgstr "" + +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." +msgstr "" + +#: models/foldermodels.py:360 +msgid "All Folders" +msgstr "" + +#: models/foldermodels.py:362 +msgid "Logical Path" +msgstr "" + +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" +msgstr "" + +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" +msgstr "" + +#: models/foldermodels.py:375 +msgid "Everybody" +msgstr "" + +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "" + +#: models/foldermodels.py:389 +msgid "Read" +msgstr "" + +#: models/foldermodels.py:390 +msgid "Add children" +msgstr "" + +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "" + +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "" + +#: models/virtualitems.py:73 +msgid "files with missing metadata" +msgstr "" + +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "root" +msgstr "" + +#: settings.py:273 +msgid "Show table view" +msgstr "" + +#: settings.py:278 +msgid "Show thumbnail view" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Run the selected action" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Go" +msgstr "" + +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +msgid "Click here to select the objects across all pages" +msgstr "" + +#: templates/admin/filer/actions.html:14 +#, python-format +msgid "Select all %(total_count)s files and/or folders" +msgstr "" + +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 +msgid "Clear selection" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 +msgid "Go back to admin homepage" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 +msgid "Home" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 +msgid "Go back to Filer app" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Go back to root folder" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:8 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 +#, python-format +msgid "Go back to '%(folder_name)s' folder" +msgstr "" + +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:11 +msgid "" +"Deleting the selected files and/or folders would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:19 +msgid "" +"Deleting the selected files and/or folders would require deleting the " +"following protected related objects:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:27 +msgid "" +"Are you sure you want to delete the selected files and/or folders? All of " +"the following objects and their related items will be deleted:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "" + +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 +msgid "History" +msgstr "" + +#: templates/admin/filer/file/change_form.html:37 +#: templates/admin/filer/folder/change_form.html:23 +#: templates/admin/filer/image/change_form.html:37 +msgid "View on site" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 +msgid "Folder Icon" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:23 +msgid "" +"Your account doesn't have permissions to copy all of the selected files and/" +"or folders." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 +msgid "There are no destination folders available." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:35 +msgid "There are no files and/or folders available to copy." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:40 +msgid "" +"The following files and/or folders will be copied to a destination folder " +"(retaining their tree structure):" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 +msgid "Destination folder:" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 +msgid "Copy" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 +msgid "" +"Your account doesn't have permissions to resize all of the selected images." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:18 +msgid "There are no images available to resize." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:20 +msgid "The following images will be resized:" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:32 +msgid "Choose an existing thumbnail option or enter resize parameters:" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:36 +msgid "" +"Warning: Images will be resized in-place and originals will be lost. Maybe " +"first make a copy of them to retain the originals." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:39 +msgid "Resize" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:35 +msgid "" +"Your account doesn't have permissions to move all of the selected files and/" +"or folders." +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:47 +msgid "There are no files and/or folders available to move." +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:52 +msgid "" +"The following files and/or folders will be moved to a destination folder " +"(retaining their tree structure):" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 +msgid "Move" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:15 +msgid "" +"Your account doesn't have permissions to rename all of the selected files." +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:18 +msgid "There are no files available to rename." +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:20 +msgid "" +"The following files will be renamed (they will stay in their folders and " +"keep original filename, only displayed filename will be changed):" +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:59 +msgid "Rename" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:16 +msgid "Name" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 +#, python-format +msgid "Change '%(item_label)s' folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "" + +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 +msgid "Select this file" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 +#, python-format +msgid "Change '%(item_label)s' details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "Permissions" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "disabled" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "enabled" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:144 +msgid "URL copied to clipboard" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:147 +#, python-format +msgid "Canonical url '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:151 +#, python-format +msgid "Download '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 +msgid "previous" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 +#, python-format +msgid "Page %(number)s of %(num_pages)s." +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 +msgid "next" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +msgid "Select all" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +msgid "Files" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +msgid "Add new" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:15 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "" + +#: templates/admin/filer/folder/new_folder_form.html:30 +msgid "Save" +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +msgid "File is missing" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "found" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "and" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:7 +msgid "cancel search" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "" + +#: templates/admin/filer/widgets/admin_folder.html:16 +msgid "Choose Folder" +msgstr "" + +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" +msgstr "" + +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" +msgstr "" + +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" +msgstr "" + +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" +msgstr "" + +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" +msgstr "" + +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." + +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" + +#~ msgid "Open file" +#~ msgstr "Open file" + +#~ msgid "Full size preview" +#~ msgstr "Full size preview" + +#~ msgid "Add Description" +#~ msgstr "Add Description" + +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" + +#~ msgid "none selected" +#~ msgstr "none selected" + +#~ msgid "Add Folder" +#~ msgstr "Add Folder" + +#~ msgid "Subject Location" +#~ msgstr "Subject location" + +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" + +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/ja_JP/LC_MESSAGES/django.mo b/filer/locale/ja_JP/LC_MESSAGES/django.mo new file mode 100644 index 000000000..c1581e2b2 Binary files /dev/null and b/filer/locale/ja_JP/LC_MESSAGES/django.mo differ diff --git a/filer/locale/ja_JP/LC_MESSAGES/django.po b/filer/locale/ja_JP/LC_MESSAGES/django.po new file mode 100644 index 000000000..72b1160c9 --- /dev/null +++ b/filer/locale/ja_JP/LC_MESSAGES/django.po @@ -0,0 +1,1219 @@ +# 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: +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django Filer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: Angelo Dini \n" +"Language-Team: Japanese (Japan) (http://app.transifex.com/divio/django-filer/" +"language/ja_JP/)\n" +"Language: ja_JP\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: admin/clipboardadmin.py:17 +msgid "You do not have permission to upload files." +msgstr "" + +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "" + +#: admin/clipboardadmin.py:20 +msgid "Can't use this folder, Permission Denied. Please select another folder." +msgstr "" + +#: admin/fileadmin.py:73 +msgid "Advanced" +msgstr "" + +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" + +#: admin/folderadmin.py:434 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "" + +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "" + +#: admin/folderadmin.py:475 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "" + +#: admin/folderadmin.py:612 +msgid "No action selected." +msgstr "" + +#: admin/folderadmin.py:664 +#, python-format +msgid "Successfully moved %(count)d files to clipboard." +msgstr "" + +#: admin/folderadmin.py:669 +msgid "Move selected files to clipboard" +msgstr "" + +#: admin/folderadmin.py:709 +#, python-format +msgid "Successfully disabled permissions for %(count)d files." +msgstr "" + +#: admin/folderadmin.py:711 +#, python-format +msgid "Successfully enabled permissions for %(count)d files." +msgstr "" + +#: admin/folderadmin.py:719 +msgid "Enable permissions for selected files" +msgstr "" + +#: admin/folderadmin.py:725 +msgid "Disable permissions for selected files" +msgstr "" + +#: admin/folderadmin.py:789 +#, python-format +msgid "Successfully deleted %(count)d files and/or folders." +msgstr "" + +#: admin/folderadmin.py:794 +msgid "Cannot delete files and/or folders" +msgstr "" + +#: admin/folderadmin.py:796 +msgid "Are you sure?" +msgstr "" + +#: admin/folderadmin.py:802 +msgid "Delete files and/or folders" +msgstr "" + +#: admin/folderadmin.py:823 +msgid "Delete selected files and/or folders" +msgstr "" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "" + +#: admin/folderadmin.py:934 +#, python-format +msgid "" +"Successfully moved %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" + +#: admin/folderadmin.py:942 admin/folderadmin.py:944 +msgid "Move files and/or folders" +msgstr "" + +#: admin/folderadmin.py:959 +msgid "Move selected files and/or folders" +msgstr "" + +#: admin/folderadmin.py:1016 +#, python-format +msgid "Successfully renamed %(count)d files." +msgstr "" + +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 +msgid "Rename files" +msgstr "" + +#: admin/folderadmin.py:1137 +#, python-format +msgid "" +"Successfully copied %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" + +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 +msgid "Copy files and/or folders" +msgstr "" + +#: admin/folderadmin.py:1174 +msgid "Copy selected files and/or folders" +msgstr "" + +#: admin/folderadmin.py:1279 +#, python-format +msgid "Successfully resized %(count)d images." +msgstr "" + +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 +msgid "Resize images" +msgstr "" + +#: admin/folderadmin.py:1303 +msgid "Resize selected images" +msgstr "" + +#: admin/forms.py:24 +msgid "Suffix which will be appended to filenames of copied files." +msgstr "" + +#: admin/forms.py:31 +#, python-format +msgid "" +"Suffix should be a valid, simple and lowercase filename part, like " +"\"%(valid)s\"." +msgstr "" + +#: admin/forms.py:52 +#, python-format +msgid "Unknown rename format value key \"%(key)s\"." +msgstr "" + +#: admin/forms.py:54 +#, python-format +msgid "Invalid rename format: %(error)s." +msgstr "" + +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 +msgid "thumbnail option" +msgstr "" + +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 +msgid "width" +msgstr "" + +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 +msgid "height" +msgstr "" + +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 +msgid "crop" +msgstr "" + +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 +msgid "upscale" +msgstr "" + +#: admin/forms.py:79 +msgid "Thumbnail option or resize parameters must be choosen." +msgstr "" + +#: admin/imageadmin.py:20 admin/imageadmin.py:112 +msgid "Subject location" +msgstr "" + +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "" + +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "" + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "" + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "" + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" +msgstr "" + +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" +msgstr "" + +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "" + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "" + +#: models/abstract.py:62 +msgid "default alt text" +msgstr "" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "" + +#: models/abstract.py:76 +msgid "subject location" +msgstr "" + +#: models/abstract.py:91 +msgid "image" +msgstr "" + +#: models/abstract.py:92 +msgid "images" +msgstr "" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "" + +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." +msgstr "" + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 +msgid "user" +msgstr "" + +#: models/clipboardmodels.py:17 models/filemodels.py:157 +msgid "files" +msgstr "" + +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 +msgid "clipboard" +msgstr "" + +#: models/clipboardmodels.py:25 +msgid "clipboards" +msgstr "" + +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 +msgid "file" +msgstr "" + +#: models/clipboardmodels.py:56 +msgid "clipboard item" +msgstr "" + +#: models/clipboardmodels.py:57 +msgid "clipboard items" +msgstr "" + +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "folder" +msgstr "" + +#: models/filemodels.py:81 +msgid "file size" +msgstr "" + +#: models/filemodels.py:87 +msgid "sha1" +msgstr "" + +#: models/filemodels.py:94 +msgid "has all mandatory data" +msgstr "" + +#: models/filemodels.py:100 +msgid "original filename" +msgstr "" + +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 +msgid "name" +msgstr "" + +#: models/filemodels.py:116 +msgid "description" +msgstr "" + +#: models/filemodels.py:125 models/foldermodels.py:108 +msgid "owner" +msgstr "" + +#: models/filemodels.py:129 models/foldermodels.py:116 +msgid "uploaded at" +msgstr "" + +#: models/filemodels.py:134 models/foldermodels.py:126 +msgid "modified at" +msgstr "" + +#: models/filemodels.py:140 +msgid "Permissions disabled" +msgstr "" + +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "" + +#: models/foldermodels.py:94 +msgid "parent" +msgstr "" + +#: models/foldermodels.py:121 +msgid "created at" +msgstr "" + +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Folder" +msgstr "" + +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 +msgid "Folders" +msgstr "" + +#: models/foldermodels.py:260 +msgid "all items" +msgstr "" + +#: models/foldermodels.py:261 +msgid "this item only" +msgstr "" + +#: models/foldermodels.py:262 +msgid "this item and all children" +msgstr "" + +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "" + +#: models/foldermodels.py:280 +msgid "type" +msgstr "" + +#: models/foldermodels.py:297 +msgid "group" +msgstr "" + +#: models/foldermodels.py:304 +msgid "everybody" +msgstr "" + +#: models/foldermodels.py:309 +msgid "can read" +msgstr "" + +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "" + +#: models/foldermodels.py:325 +msgid "can add children" +msgstr "" + +#: models/foldermodels.py:333 +msgid "folder permission" +msgstr "" + +#: models/foldermodels.py:334 +msgid "folder permissions" +msgstr "" + +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." +msgstr "" + +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." +msgstr "" + +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." +msgstr "" + +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." +msgstr "" + +#: models/foldermodels.py:360 +msgid "All Folders" +msgstr "" + +#: models/foldermodels.py:362 +msgid "Logical Path" +msgstr "" + +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" +msgstr "" + +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" +msgstr "" + +#: models/foldermodels.py:375 +msgid "Everybody" +msgstr "" + +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "" + +#: models/foldermodels.py:389 +msgid "Read" +msgstr "" + +#: models/foldermodels.py:390 +msgid "Add children" +msgstr "" + +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "" + +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "" + +#: models/virtualitems.py:73 +msgid "files with missing metadata" +msgstr "" + +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "root" +msgstr "" + +#: settings.py:273 +msgid "Show table view" +msgstr "" + +#: settings.py:278 +msgid "Show thumbnail view" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Run the selected action" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Go" +msgstr "" + +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +msgid "Click here to select the objects across all pages" +msgstr "" + +#: templates/admin/filer/actions.html:14 +#, python-format +msgid "Select all %(total_count)s files and/or folders" +msgstr "" + +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 +msgid "Clear selection" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 +msgid "Go back to admin homepage" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 +msgid "Home" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 +msgid "Go back to Filer app" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Go back to root folder" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:8 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 +#, python-format +msgid "Go back to '%(folder_name)s' folder" +msgstr "" + +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:11 +msgid "" +"Deleting the selected files and/or folders would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:19 +msgid "" +"Deleting the selected files and/or folders would require deleting the " +"following protected related objects:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:27 +msgid "" +"Are you sure you want to delete the selected files and/or folders? All of " +"the following objects and their related items will be deleted:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "" + +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 +msgid "History" +msgstr "" + +#: templates/admin/filer/file/change_form.html:37 +#: templates/admin/filer/folder/change_form.html:23 +#: templates/admin/filer/image/change_form.html:37 +msgid "View on site" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 +msgid "Folder Icon" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:23 +msgid "" +"Your account doesn't have permissions to copy all of the selected files and/" +"or folders." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 +msgid "There are no destination folders available." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:35 +msgid "There are no files and/or folders available to copy." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:40 +msgid "" +"The following files and/or folders will be copied to a destination folder " +"(retaining their tree structure):" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 +msgid "Destination folder:" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 +msgid "Copy" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 +msgid "" +"Your account doesn't have permissions to resize all of the selected images." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:18 +msgid "There are no images available to resize." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:20 +msgid "The following images will be resized:" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:32 +msgid "Choose an existing thumbnail option or enter resize parameters:" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:36 +msgid "" +"Warning: Images will be resized in-place and originals will be lost. Maybe " +"first make a copy of them to retain the originals." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:39 +msgid "Resize" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:35 +msgid "" +"Your account doesn't have permissions to move all of the selected files and/" +"or folders." +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:47 +msgid "There are no files and/or folders available to move." +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:52 +msgid "" +"The following files and/or folders will be moved to a destination folder " +"(retaining their tree structure):" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 +msgid "Move" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:15 +msgid "" +"Your account doesn't have permissions to rename all of the selected files." +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:18 +msgid "There are no files available to rename." +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:20 +msgid "" +"The following files will be renamed (they will stay in their folders and " +"keep original filename, only displayed filename will be changed):" +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:59 +msgid "Rename" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:16 +msgid "Name" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 +#, python-format +msgid "Change '%(item_label)s' folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "" + +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 +msgid "Select this file" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 +#, python-format +msgid "Change '%(item_label)s' details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "Permissions" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "disabled" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "enabled" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:144 +msgid "URL copied to clipboard" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:147 +#, python-format +msgid "Canonical url '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:151 +#, python-format +msgid "Download '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 +msgid "previous" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 +#, python-format +msgid "Page %(number)s of %(num_pages)s." +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 +msgid "next" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +msgid "Select all" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +msgid "Files" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +msgid "Add new" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:15 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "" + +#: templates/admin/filer/folder/new_folder_form.html:30 +msgid "Save" +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +msgid "File is missing" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "found" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "and" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:7 +msgid "cancel search" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "" + +#: templates/admin/filer/widgets/admin_folder.html:16 +msgid "Choose Folder" +msgstr "" + +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" +msgstr "" + +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" +msgstr "" + +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" +msgstr "" + +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" +msgstr "" + +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" +msgstr "" + +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." + +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" + +#~ msgid "Open file" +#~ msgstr "Open file" + +#~ msgid "Full size preview" +#~ msgstr "Full size preview" + +#~ msgid "Add Description" +#~ msgstr "Add Description" + +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" + +#~ msgid "none selected" +#~ msgstr "none selected" + +#~ msgid "Add Folder" +#~ msgstr "Add Folder" + +#~ msgid "Subject Location" +#~ msgstr "Subject location" + +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" + +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/lt/LC_MESSAGES/django.mo b/filer/locale/lt/LC_MESSAGES/django.mo new file mode 100644 index 000000000..de0708e70 Binary files /dev/null and b/filer/locale/lt/LC_MESSAGES/django.mo differ diff --git a/filer/locale/lt/LC_MESSAGES/django.po b/filer/locale/lt/LC_MESSAGES/django.po new file mode 100644 index 000000000..fdd11fd6a --- /dev/null +++ b/filer/locale/lt/LC_MESSAGES/django.po @@ -0,0 +1,1273 @@ +# 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: +# Translators: +# Matas Dailyda , 2015-2018 +msgid "" +msgstr "" +"Project-Id-Version: django Filer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: Matas Dailyda , 2015-2018\n" +"Language-Team: Lithuanian (http://app.transifex.com/divio/django-filer/" +"language/lt/)\n" +"Language: lt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < " +"11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? " +"1 : n % 1 != 0 ? 2: 3);\n" + +#: admin/clipboardadmin.py:17 +msgid "You do not have permission to upload files." +msgstr "" + +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "" + +#: admin/clipboardadmin.py:20 +msgid "Can't use this folder, Permission Denied. Please select another folder." +msgstr "" + +#: admin/fileadmin.py:73 +msgid "Advanced" +msgstr "Išplėstinės funkcijos" + +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "kanoninis URL" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Objektai turi būti pasirinkti, kad su jais būtų galima atlikti veiksmus. " +"Jokie objektai nebuvo pakeisti." + +#: admin/folderadmin.py:434 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "pasirinkta %(total_count)s" +msgstr[1] "pasirinkta %(total_count)s" +msgstr[2] "pasirinkta %(total_count)s" +msgstr[3] "pasirinkta %(total_count)s" + +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "%(folder_name)svidinių aplankų sąrašas " + +#: admin/folderadmin.py:475 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 iš %(cnt)s pasirinkta" + +#: admin/folderadmin.py:612 +msgid "No action selected." +msgstr "Nepasirinktas joks veiksmas." + +#: admin/folderadmin.py:664 +#, python-format +msgid "Successfully moved %(count)d files to clipboard." +msgstr "Sėkmingai perkelta %(count)d failai į iškarpinę." + +#: admin/folderadmin.py:669 +msgid "Move selected files to clipboard" +msgstr "Perkelti pažymėtus failus į iškarpinę" + +#: admin/folderadmin.py:709 +#, python-format +msgid "Successfully disabled permissions for %(count)d files." +msgstr "Sėkmingai išjungti leidimai %(count)d failams." + +#: admin/folderadmin.py:711 +#, python-format +msgid "Successfully enabled permissions for %(count)d files." +msgstr "Sėkmingai įjungti leidimai %(count)d failams." + +#: admin/folderadmin.py:719 +msgid "Enable permissions for selected files" +msgstr "Įjungti leidimus pasirinktiems failams" + +#: admin/folderadmin.py:725 +msgid "Disable permissions for selected files" +msgstr "Išjungti leidimus pasirinktiems failams" + +#: admin/folderadmin.py:789 +#, python-format +msgid "Successfully deleted %(count)d files and/or folders." +msgstr "Sėkmingai pašalino %(count)d failus ir / ar aplankus." + +#: admin/folderadmin.py:794 +msgid "Cannot delete files and/or folders" +msgstr "Negalima pašalinti failų ir / ar aplankų" + +#: admin/folderadmin.py:796 +msgid "Are you sure?" +msgstr "Ar jūs esate tikri?" + +#: admin/folderadmin.py:802 +msgid "Delete files and/or folders" +msgstr "Pašalinti failus ir / ar aplankus" + +#: admin/folderadmin.py:823 +msgid "Delete selected files and/or folders" +msgstr "Pašalinti pasirinktus failus ir / ar aplankus" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "" +"Aplankai su %s pavadinimais jau egzistuoja pasirinktoje paskirties vietoje." + +#: admin/folderadmin.py:934 +#, python-format +msgid "" +"Successfully moved %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" +"Sėkmingai perkelti %(count)d failai ir / ar aplankai į aplanką " +"'%(destination)s'." + +#: admin/folderadmin.py:942 admin/folderadmin.py:944 +msgid "Move files and/or folders" +msgstr "Perkelti failus ir / ar aplankus" + +#: admin/folderadmin.py:959 +msgid "Move selected files and/or folders" +msgstr "Perkelti pasirinktus failus ir / ar aplankus" + +#: admin/folderadmin.py:1016 +#, python-format +msgid "Successfully renamed %(count)d files." +msgstr "Sėkmingai pervardinti %(count)d failai." + +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 +msgid "Rename files" +msgstr "Pervardinti failus" + +#: admin/folderadmin.py:1137 +#, python-format +msgid "" +"Successfully copied %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" +"Sėkmingai nukopijuoti %(count)d failai ir / ar aplankai į aplanką " +"'%(destination)s'." + +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 +msgid "Copy files and/or folders" +msgstr "Kopijuoti failus ir / ar aplankus" + +#: admin/folderadmin.py:1174 +msgid "Copy selected files and/or folders" +msgstr "Kopijuoti pasirinktus failus ir / ar aplankus" + +#: admin/folderadmin.py:1279 +#, python-format +msgid "Successfully resized %(count)d images." +msgstr "Sėkmingai pakeistas %(count)d paveikslėlių dydis." + +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 +msgid "Resize images" +msgstr "Pakeisti paveikslėlių dydžius" + +#: admin/folderadmin.py:1303 +msgid "Resize selected images" +msgstr "Pakeisti pasirinktų paveikslėlių dydžius" + +#: admin/forms.py:24 +msgid "Suffix which will be appended to filenames of copied files." +msgstr "Priesaga kuri bus pridėta prie nukopijuotų failų pavadinimų." + +#: admin/forms.py:31 +#, python-format +msgid "" +"Suffix should be a valid, simple and lowercase filename part, like " +"\"%(valid)s\"." +msgstr "" +"Priesaga turi būti paprasta ir taisyklinga bylos pavadinimo dalis pvz. " +"\"%(valid)s\"." + +#: admin/forms.py:52 +#, python-format +msgid "Unknown rename format value key \"%(key)s\"." +msgstr "Nežinomas pervardinimo formato reikšmės raktažodis \"%(key)s\"." + +#: admin/forms.py:54 +#, python-format +msgid "Invalid rename format: %(error)s." +msgstr "Negalimas pervardinimo formatas: %(error)s." + +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 +msgid "thumbnail option" +msgstr "miniatiūros nustatymas" + +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 +msgid "width" +msgstr "plotis" + +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 +msgid "height" +msgstr "aukštis" + +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 +msgid "crop" +msgstr "apkirpti" + +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 +msgid "upscale" +msgstr "išdidinti" + +#: admin/forms.py:79 +msgid "Thumbnail option or resize parameters must be choosen." +msgstr "" +"Miniatiūros nustatymas arba dydžio keitimo parametrai turi būti pasirinkti." + +#: admin/imageadmin.py:20 admin/imageadmin.py:112 +msgid "Subject location" +msgstr "Subjekto vieta" + +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "Pagrindinio subjekto vieta vaizde. Fomatas: \"x,y\"." + +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "Netinkamas subjekto vietos formatas." + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "Subjekto vieta yra už paveikslėlio." + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "Jūsų įvestis: \"{subject_location}\". " + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" +msgstr "" + +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" +msgstr "" + +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "Aplankas su tokiu pavadinimu jau egzistuoja." + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "Filer'is" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "Medijos biblioteka" + +#: models/abstract.py:62 +msgid "default alt text" +msgstr "numatytasis alternatyvus tekstas" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "numatytoji antraštė" + +#: models/abstract.py:76 +msgid "subject location" +msgstr "subjekto vieta" + +#: models/abstract.py:91 +msgid "image" +msgstr "paveikslėlis" + +#: models/abstract.py:92 +msgid "images" +msgstr "paveikslėliai" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "" + +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." +msgstr "" + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 +msgid "user" +msgstr "vartotojas" + +#: models/clipboardmodels.py:17 models/filemodels.py:157 +msgid "files" +msgstr "failai" + +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 +msgid "clipboard" +msgstr "iškarpinė" + +#: models/clipboardmodels.py:25 +msgid "clipboards" +msgstr "iškarpinės" + +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 +msgid "file" +msgstr "failas" + +#: models/clipboardmodels.py:56 +msgid "clipboard item" +msgstr "iškarpinės objektas" + +#: models/clipboardmodels.py:57 +msgid "clipboard items" +msgstr "iškarpinės objektai" + +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "folder" +msgstr "aplankas" + +#: models/filemodels.py:81 +msgid "file size" +msgstr "failo dydis" + +#: models/filemodels.py:87 +msgid "sha1" +msgstr "sha1" + +#: models/filemodels.py:94 +msgid "has all mandatory data" +msgstr "turi visus privalomus duomenis" + +#: models/filemodels.py:100 +msgid "original filename" +msgstr "originalus failo pavadinimas" + +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 +msgid "name" +msgstr "pavadinimas" + +#: models/filemodels.py:116 +msgid "description" +msgstr "apibūdinimas" + +#: models/filemodels.py:125 models/foldermodels.py:108 +msgid "owner" +msgstr "savininkas" + +#: models/filemodels.py:129 models/foldermodels.py:116 +msgid "uploaded at" +msgstr "įkelta" + +#: models/filemodels.py:134 models/foldermodels.py:126 +msgid "modified at" +msgstr "pakeista" + +#: models/filemodels.py:140 +msgid "Permissions disabled" +msgstr "Leidimai išjungti" + +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "" +"Įšjungti bet kokius leidimų tikrinimus šiai bylai. Byla bus viešai " +"pasiekiama bet kam." + +#: models/foldermodels.py:94 +msgid "parent" +msgstr "" + +#: models/foldermodels.py:121 +msgid "created at" +msgstr "sukurta" + +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Folder" +msgstr "Aplankas" + +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 +msgid "Folders" +msgstr "Aplankai" + +#: models/foldermodels.py:260 +msgid "all items" +msgstr "visi objektai" + +#: models/foldermodels.py:261 +msgid "this item only" +msgstr "tik šį objektą" + +#: models/foldermodels.py:262 +msgid "this item and all children" +msgstr "šį objektą ir visus vidinius" + +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "leisti" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "neleisti" + +#: models/foldermodels.py:280 +msgid "type" +msgstr "tipas" + +#: models/foldermodels.py:297 +msgid "group" +msgstr "grupė" + +#: models/foldermodels.py:304 +msgid "everybody" +msgstr "visi" + +#: models/foldermodels.py:309 +msgid "can read" +msgstr "gali skaityti" + +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "gali redaguoti" + +#: models/foldermodels.py:325 +msgid "can add children" +msgstr "gali pridėti vidinius" + +#: models/foldermodels.py:333 +msgid "folder permission" +msgstr "aplanko leidimas" + +#: models/foldermodels.py:334 +msgid "folder permissions" +msgstr "aplanko leidimai" + +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." +msgstr "" + +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." +msgstr "" + +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." +msgstr "" + +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." +msgstr "" + +#: models/foldermodels.py:360 +msgid "All Folders" +msgstr "" + +#: models/foldermodels.py:362 +msgid "Logical Path" +msgstr "" + +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" +msgstr "" + +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" +msgstr "" + +#: models/foldermodels.py:375 +msgid "Everybody" +msgstr "" + +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "" + +#: models/foldermodels.py:389 +msgid "Read" +msgstr "" + +#: models/foldermodels.py:390 +msgid "Add children" +msgstr "" + +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "paimta data" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "autorius" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "visada turi publikuoti autorystę" + +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "visada turi publikuoti autorių teises" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "plotis pikseliais." + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "aukštis pikseliais." + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "miniatiūros nustatymai" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "Nerūšiuotos įkeltos bylos" + +#: models/virtualitems.py:73 +msgid "files with missing metadata" +msgstr "failai su trūkstamais meta duomenimis" + +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "root" +msgstr "pradinis" + +#: settings.py:273 +msgid "Show table view" +msgstr "" + +#: settings.py:278 +msgid "Show thumbnail view" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Run the selected action" +msgstr "Vykdyti pasirinktą veiksmą" + +#: templates/admin/filer/actions.html:5 +msgid "Go" +msgstr "Eiti" + +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +msgid "Click here to select the objects across all pages" +msgstr "Spauskite čia kad pasirinktumete objektus per visus puslapius" + +#: templates/admin/filer/actions.html:14 +#, python-format +msgid "Select all %(total_count)s files and/or folders" +msgstr "Pasirinkti visus %(total_count)s failus ir / ar aplankus" + +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 +msgid "Clear selection" +msgstr "Išvalyti pasirinkimus" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 +msgid "Go back to admin homepage" +msgstr "Grįžti į pradinį administravimo puslapį" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 +msgid "Home" +msgstr "Pradinis" + +#: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 +msgid "Go back to Filer app" +msgstr "Grįžti į Failer'io apklikaciją" + +#: templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Go back to root folder" +msgstr "Grįžti į pradinį aplanką" + +#: templates/admin/filer/breadcrumbs.html:8 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 +#, python-format +msgid "Go back to '%(folder_name)s' folder" +msgstr "Grįžti į '%(folder_name)s' aplanką" + +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "Dublikatai" + +#: templates/admin/filer/delete_selected_files_confirmation.html:11 +msgid "" +"Deleting the selected files and/or folders would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Pasirintų failų ir / ar aplankų šalinimas pašalintų susijusius objektus, " +"tačiau jūsų vartotojas neturi leidimo šalinti šių objektų tipų:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:19 +msgid "" +"Deleting the selected files and/or folders would require deleting the " +"following protected related objects:" +msgstr "" +"Pasirinktų failų ir / ar aplankų šalinimas reikalautų pašalinti šiuos " +"apsaugotus susijusius objektus:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:27 +msgid "" +"Are you sure you want to delete the selected files and/or folders? All of " +"the following objects and their related items will be deleted:" +msgstr "" +"Ar tikrai norite pašalinti pasirinktus failus ir / ar aplankus? Visi susiję " +"objektai bus pašalinti:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "Ne, grįžti atgal" + +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "Taip, esu tikras" + +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 +msgid "History" +msgstr "Istorija" + +#: templates/admin/filer/file/change_form.html:37 +#: templates/admin/filer/folder/change_form.html:23 +#: templates/admin/filer/image/change_form.html:37 +msgid "View on site" +msgstr "Žiūrėti puslapyje" + +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "Grįžti į" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "administravimo pradinis puslapis" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 +msgid "Folder Icon" +msgstr "Aplanko piktograma" + +#: templates/admin/filer/folder/choose_copy_destination.html:23 +msgid "" +"Your account doesn't have permissions to copy all of the selected files and/" +"or folders." +msgstr "" +"Jūsų vartotojas neturi leidimų kopijuoti visus pasirinktus failus ir / ar " +"aplankus." + +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "Grįžti atgal" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 +msgid "There are no destination folders available." +msgstr "Nėra jokių paskyrimo aplankų." + +#: templates/admin/filer/folder/choose_copy_destination.html:35 +msgid "There are no files and/or folders available to copy." +msgstr "Nėra jokiu failų ir / ar aplankų kopijavimui." + +#: templates/admin/filer/folder/choose_copy_destination.html:40 +msgid "" +"The following files and/or folders will be copied to a destination folder " +"(retaining their tree structure):" +msgstr "" +"Šie failai ir / ar aplankai bus nukopijuoti į paskirtą aplanką (išlaikant jų " +"medžio struktūrą):" + +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 +msgid "Destination folder:" +msgstr "Paskyrimo aplankas:" + +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 +msgid "Copy" +msgstr "Kopijuoti" + +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "Neleidžiama kopijuoti bylų į tą patį aplanką" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 +msgid "" +"Your account doesn't have permissions to resize all of the selected images." +msgstr "" +"Jūsų vartotojas neturi leidimų keisti dydžius visiems pasirinktiems " +"paveikslėliams." + +#: templates/admin/filer/folder/choose_images_resize_options.html:18 +msgid "There are no images available to resize." +msgstr "Nėra jokiu paveikslėlių dydžio keitimui." + +#: templates/admin/filer/folder/choose_images_resize_options.html:20 +msgid "The following images will be resized:" +msgstr "Šių paveikslėlių dydis bus pakeistas:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:32 +msgid "Choose an existing thumbnail option or enter resize parameters:" +msgstr "" +"Pasirinkite esamą miniatiūros nustatymą, arba įveskite dydžio keitimo " +"parametrus:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:36 +msgid "" +"Warning: Images will be resized in-place and originals will be lost. Maybe " +"first make a copy of them to retain the originals." +msgstr "" +"Įspėjimas: Paveikslėlių dydžiai bus pakeisti vietoje, ir originalas bus " +"pašalintas. Patartina atsikopijuoti paveikslėlį, kad nedingtų originalas." + +#: templates/admin/filer/folder/choose_images_resize_options.html:39 +msgid "Resize" +msgstr "Pakeisti dydį" + +#: templates/admin/filer/folder/choose_move_destination.html:35 +msgid "" +"Your account doesn't have permissions to move all of the selected files and/" +"or folders." +msgstr "" +"Jūsų vartotojas neturi leidimų perkelti visus pasirinktus failus ir / ar " +"aplankus." + +#: templates/admin/filer/folder/choose_move_destination.html:47 +msgid "There are no files and/or folders available to move." +msgstr "Nėra jokiu failų ir / ar aplankų perkelimui." + +#: templates/admin/filer/folder/choose_move_destination.html:52 +msgid "" +"The following files and/or folders will be moved to a destination folder " +"(retaining their tree structure):" +msgstr "" +"Šie failai ir / ar aplankai bus perkelti į paskirtą aplanką (išlaikant jų " +"medžio struktūrą):" + +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 +msgid "Move" +msgstr "Perkelti" + +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "Neleidžiama perkelti bylų į tą patį aplanką" + +#: templates/admin/filer/folder/choose_rename_format.html:15 +msgid "" +"Your account doesn't have permissions to rename all of the selected files." +msgstr "Jūsų vartotojas neturi leidimų pervardinti visus pasirinktus failus." + +#: templates/admin/filer/folder/choose_rename_format.html:18 +msgid "There are no files available to rename." +msgstr "Nėra jokių failų pervardinimui." + +#: templates/admin/filer/folder/choose_rename_format.html:20 +msgid "" +"The following files will be renamed (they will stay in their folders and " +"keep original filename, only displayed filename will be changed):" +msgstr "" +"Šie failai bus pervardinti (jie liks savo aplankuose ir pasiliks savo " +"originalius pavadinimus, pasikeis tik atvaizduojamas failo pavadinimas):" + +#: templates/admin/filer/folder/choose_rename_format.html:59 +msgid "Rename" +msgstr "Pervardinti" + +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "Grįžti į pirminį aplanką" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "Keisti dabartinio aplanko detales" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "Keisti" + +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "Spausti čia kad būtų paleista paieška visai frazei" + +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "Ieškoti" + +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "Uždaryti" + +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "Limitas" + +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "Pažymėti, kad paieška būtų apribota tik dabartiniame aplanke" + +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "Apriboti paieška tik dabartiniame aplanke" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "Pašalinti" + +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "Sukuria naują aplanką" + +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "Naujas aplankas" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "įkelti bylas" + +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "Pirma turite pasirinkti aplanką" + +#: templates/admin/filer/folder/directory_table_list.html:16 +msgid "Name" +msgstr "Pavadinimas" + +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "Savininkas" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "Dydis" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "Veiksmas" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 +#, python-format +msgid "Change '%(item_label)s' folder details" +msgstr "Keisti '%(item_label)s' aplanko detales" + +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "%(counter)s aplankas" +msgstr[1] "%(counter)s aplankai" +msgstr[2] "%(counter)s aplankų" +msgstr[3] "%(counter)s aplankų" + +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "%(counter)s byla" +msgstr[1] "%(counter)s bylos" +msgstr[2] "%(counter)s bylų" +msgstr[3] "%(counter)s bylų" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "Keisti aplanko detales" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "Pašalinti aplanką" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 +msgid "Select this file" +msgstr "Pasirinkti šį failą" + +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 +#, python-format +msgid "Change '%(item_label)s' details" +msgstr "Keisti '%(item_label)s' detales" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "Permissions" +msgstr "Leidimai" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "disabled" +msgstr "išjungta" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "enabled" +msgstr "įjungta" + +#: templates/admin/filer/folder/directory_table_list.html:144 +#, fuzzy +#| msgid "Move selected files to clipboard" +msgid "URL copied to clipboard" +msgstr "Perkelti pažymėtus failus į iškarpinę" + +#: templates/admin/filer/folder/directory_table_list.html:147 +#, python-format +msgid "Canonical url '%(item_label)s'" +msgstr "Kanoninis url '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:151 +#, python-format +msgid "Download '%(item_label)s'" +msgstr "Parsisiųsti '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "Pašalinti bylą" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "Meskite bylas čia arba naudokit \"Įkelti bylas\" mygtuką" + +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "Meskite bylą kad įkelti į:" + +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "Įkelti" + +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "atšaukti" + +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "Įkelimas pavyko!" + +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "Įkelimas atšauktas!" + +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 +msgid "previous" +msgstr "buvęs" + +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 +#, python-format +msgid "Page %(number)s of %(num_pages)s." +msgstr "Puslapis %(number)s iš %(num_pages)s." + +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 +msgid "next" +msgstr "kitas" + +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "Pasirinkti visus %(total_count)s" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +msgid "Select all" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +msgid "Files" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +msgid "Add new" +msgstr "Pridėti naują" + +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" +msgstr "Django tinklalapio administravimas" + +#: templates/admin/filer/folder/new_folder_form.html:15 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Ištaisykite žemiau esančias klaidas." +msgstr[1] "Ištaisykite žemiau esančias klaidas." +msgstr[2] "Ištaisykite žemiau esančias klaidas." +msgstr[3] "Ištaisykite žemiau esančias klaidas." + +#: templates/admin/filer/folder/new_folder_form.html:30 +msgid "Save" +msgstr "Išsaugoti" + +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "Iškarpinė" + +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "Įkopijuoti visus objektus čia" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "Perkelti visus iškarpinėje esančius failus į" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "Išvalyti iškarpinę" + +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "iškarpinė tuščia" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "įkelimas nepavyko" + +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +msgid "File is missing" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "Tipas" + +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "Failo dydis" + +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "Pakeistas" + +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "Sukurtas" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "found" +msgstr "rasta" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "and" +msgstr "ir" + +#: templates/admin/filer/tools/search_form.html:7 +msgid "cancel search" +msgstr "atšaukti paiešką" + +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "Išvalyti" + +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "arba meskite bylą čia" + +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "joks failas nepasirinktas" + +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "Informacijos ieškojimas" + +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "Pasirinkti bylą" + +#: templates/admin/filer/widgets/admin_folder.html:16 +msgid "Choose Folder" +msgstr "" + +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" +msgstr "" + +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" +msgstr "" + +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" +msgstr "" + +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" +msgstr "" + +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" +msgstr "" + +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." + +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" + +#~ msgid "Open file" +#~ msgstr "Open file" + +#~ msgid "Full size preview" +#~ msgstr "Full size preview" + +#~ msgid "Add Description" +#~ msgstr "Add Description" + +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" + +#~ msgid "none selected" +#~ msgstr "none selected" + +#~ msgid "Add Folder" +#~ msgstr "Add Folder" + +#~ msgid "Subject Location" +#~ msgstr "Subject location" + +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" +#~ msgstr[1] "15c0f2d28d6dab1af1f6d94906beb627_pl_1" +#~ msgstr[2] "15c0f2d28d6dab1af1f6d94906beb627_pl_2" +#~ msgstr[3] "15c0f2d28d6dab1af1f6d94906beb627_pl_3" + +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/lt_LT/LC_MESSAGES/django.mo b/filer/locale/lt_LT/LC_MESSAGES/django.mo new file mode 100644 index 000000000..5e380751c Binary files /dev/null and b/filer/locale/lt_LT/LC_MESSAGES/django.mo differ diff --git a/filer/locale/lt_LT/LC_MESSAGES/django.po b/filer/locale/lt_LT/LC_MESSAGES/django.po new file mode 100644 index 000000000..a7dcb78dc --- /dev/null +++ b/filer/locale/lt_LT/LC_MESSAGES/django.po @@ -0,0 +1,1236 @@ +# 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: +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django Filer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: Angelo Dini \n" +"Language-Team: Lithuanian (Lithuania) (http://app.transifex.com/divio/django-" +"filer/language/lt_LT/)\n" +"Language: lt_LT\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < " +"11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? " +"1 : n % 1 != 0 ? 2: 3);\n" + +#: admin/clipboardadmin.py:17 +msgid "You do not have permission to upload files." +msgstr "" + +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "" + +#: admin/clipboardadmin.py:20 +msgid "Can't use this folder, Permission Denied. Please select another folder." +msgstr "" + +#: admin/fileadmin.py:73 +msgid "Advanced" +msgstr "" + +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" + +#: admin/folderadmin.py:434 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "" + +#: admin/folderadmin.py:475 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "" + +#: admin/folderadmin.py:612 +msgid "No action selected." +msgstr "" + +#: admin/folderadmin.py:664 +#, python-format +msgid "Successfully moved %(count)d files to clipboard." +msgstr "" + +#: admin/folderadmin.py:669 +msgid "Move selected files to clipboard" +msgstr "" + +#: admin/folderadmin.py:709 +#, python-format +msgid "Successfully disabled permissions for %(count)d files." +msgstr "" + +#: admin/folderadmin.py:711 +#, python-format +msgid "Successfully enabled permissions for %(count)d files." +msgstr "" + +#: admin/folderadmin.py:719 +msgid "Enable permissions for selected files" +msgstr "" + +#: admin/folderadmin.py:725 +msgid "Disable permissions for selected files" +msgstr "" + +#: admin/folderadmin.py:789 +#, python-format +msgid "Successfully deleted %(count)d files and/or folders." +msgstr "" + +#: admin/folderadmin.py:794 +msgid "Cannot delete files and/or folders" +msgstr "" + +#: admin/folderadmin.py:796 +msgid "Are you sure?" +msgstr "" + +#: admin/folderadmin.py:802 +msgid "Delete files and/or folders" +msgstr "" + +#: admin/folderadmin.py:823 +msgid "Delete selected files and/or folders" +msgstr "" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "" + +#: admin/folderadmin.py:934 +#, python-format +msgid "" +"Successfully moved %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" + +#: admin/folderadmin.py:942 admin/folderadmin.py:944 +msgid "Move files and/or folders" +msgstr "" + +#: admin/folderadmin.py:959 +msgid "Move selected files and/or folders" +msgstr "" + +#: admin/folderadmin.py:1016 +#, python-format +msgid "Successfully renamed %(count)d files." +msgstr "" + +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 +msgid "Rename files" +msgstr "" + +#: admin/folderadmin.py:1137 +#, python-format +msgid "" +"Successfully copied %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" + +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 +msgid "Copy files and/or folders" +msgstr "" + +#: admin/folderadmin.py:1174 +msgid "Copy selected files and/or folders" +msgstr "" + +#: admin/folderadmin.py:1279 +#, python-format +msgid "Successfully resized %(count)d images." +msgstr "" + +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 +msgid "Resize images" +msgstr "" + +#: admin/folderadmin.py:1303 +msgid "Resize selected images" +msgstr "" + +#: admin/forms.py:24 +msgid "Suffix which will be appended to filenames of copied files." +msgstr "" + +#: admin/forms.py:31 +#, python-format +msgid "" +"Suffix should be a valid, simple and lowercase filename part, like " +"\"%(valid)s\"." +msgstr "" + +#: admin/forms.py:52 +#, python-format +msgid "Unknown rename format value key \"%(key)s\"." +msgstr "" + +#: admin/forms.py:54 +#, python-format +msgid "Invalid rename format: %(error)s." +msgstr "" + +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 +msgid "thumbnail option" +msgstr "" + +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 +msgid "width" +msgstr "" + +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 +msgid "height" +msgstr "" + +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 +msgid "crop" +msgstr "" + +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 +msgid "upscale" +msgstr "" + +#: admin/forms.py:79 +msgid "Thumbnail option or resize parameters must be choosen." +msgstr "" + +#: admin/imageadmin.py:20 admin/imageadmin.py:112 +msgid "Subject location" +msgstr "" + +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "" + +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "" + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "" + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "" + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" +msgstr "" + +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" +msgstr "" + +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "" + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "" + +#: models/abstract.py:62 +msgid "default alt text" +msgstr "" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "" + +#: models/abstract.py:76 +msgid "subject location" +msgstr "" + +#: models/abstract.py:91 +msgid "image" +msgstr "" + +#: models/abstract.py:92 +msgid "images" +msgstr "" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "" + +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." +msgstr "" + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 +msgid "user" +msgstr "" + +#: models/clipboardmodels.py:17 models/filemodels.py:157 +msgid "files" +msgstr "" + +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 +msgid "clipboard" +msgstr "" + +#: models/clipboardmodels.py:25 +msgid "clipboards" +msgstr "" + +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 +msgid "file" +msgstr "" + +#: models/clipboardmodels.py:56 +msgid "clipboard item" +msgstr "" + +#: models/clipboardmodels.py:57 +msgid "clipboard items" +msgstr "" + +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "folder" +msgstr "" + +#: models/filemodels.py:81 +msgid "file size" +msgstr "" + +#: models/filemodels.py:87 +msgid "sha1" +msgstr "" + +#: models/filemodels.py:94 +msgid "has all mandatory data" +msgstr "" + +#: models/filemodels.py:100 +msgid "original filename" +msgstr "" + +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 +msgid "name" +msgstr "" + +#: models/filemodels.py:116 +msgid "description" +msgstr "" + +#: models/filemodels.py:125 models/foldermodels.py:108 +msgid "owner" +msgstr "" + +#: models/filemodels.py:129 models/foldermodels.py:116 +msgid "uploaded at" +msgstr "" + +#: models/filemodels.py:134 models/foldermodels.py:126 +msgid "modified at" +msgstr "" + +#: models/filemodels.py:140 +msgid "Permissions disabled" +msgstr "" + +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "" + +#: models/foldermodels.py:94 +msgid "parent" +msgstr "" + +#: models/foldermodels.py:121 +msgid "created at" +msgstr "" + +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Folder" +msgstr "" + +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 +msgid "Folders" +msgstr "" + +#: models/foldermodels.py:260 +msgid "all items" +msgstr "" + +#: models/foldermodels.py:261 +msgid "this item only" +msgstr "" + +#: models/foldermodels.py:262 +msgid "this item and all children" +msgstr "" + +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "" + +#: models/foldermodels.py:280 +msgid "type" +msgstr "" + +#: models/foldermodels.py:297 +msgid "group" +msgstr "" + +#: models/foldermodels.py:304 +msgid "everybody" +msgstr "" + +#: models/foldermodels.py:309 +msgid "can read" +msgstr "" + +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "" + +#: models/foldermodels.py:325 +msgid "can add children" +msgstr "" + +#: models/foldermodels.py:333 +msgid "folder permission" +msgstr "" + +#: models/foldermodels.py:334 +msgid "folder permissions" +msgstr "" + +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." +msgstr "" + +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." +msgstr "" + +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." +msgstr "" + +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." +msgstr "" + +#: models/foldermodels.py:360 +msgid "All Folders" +msgstr "" + +#: models/foldermodels.py:362 +msgid "Logical Path" +msgstr "" + +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" +msgstr "" + +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" +msgstr "" + +#: models/foldermodels.py:375 +msgid "Everybody" +msgstr "" + +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "" + +#: models/foldermodels.py:389 +msgid "Read" +msgstr "" + +#: models/foldermodels.py:390 +msgid "Add children" +msgstr "" + +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "" + +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "" + +#: models/virtualitems.py:73 +msgid "files with missing metadata" +msgstr "" + +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "root" +msgstr "" + +#: settings.py:273 +msgid "Show table view" +msgstr "" + +#: settings.py:278 +msgid "Show thumbnail view" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Run the selected action" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Go" +msgstr "" + +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +msgid "Click here to select the objects across all pages" +msgstr "" + +#: templates/admin/filer/actions.html:14 +#, python-format +msgid "Select all %(total_count)s files and/or folders" +msgstr "" + +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 +msgid "Clear selection" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 +msgid "Go back to admin homepage" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 +msgid "Home" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 +msgid "Go back to Filer app" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Go back to root folder" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:8 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 +#, python-format +msgid "Go back to '%(folder_name)s' folder" +msgstr "" + +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:11 +msgid "" +"Deleting the selected files and/or folders would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:19 +msgid "" +"Deleting the selected files and/or folders would require deleting the " +"following protected related objects:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:27 +msgid "" +"Are you sure you want to delete the selected files and/or folders? All of " +"the following objects and their related items will be deleted:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "" + +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 +msgid "History" +msgstr "" + +#: templates/admin/filer/file/change_form.html:37 +#: templates/admin/filer/folder/change_form.html:23 +#: templates/admin/filer/image/change_form.html:37 +msgid "View on site" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 +msgid "Folder Icon" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:23 +msgid "" +"Your account doesn't have permissions to copy all of the selected files and/" +"or folders." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 +msgid "There are no destination folders available." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:35 +msgid "There are no files and/or folders available to copy." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:40 +msgid "" +"The following files and/or folders will be copied to a destination folder " +"(retaining their tree structure):" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 +msgid "Destination folder:" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 +msgid "Copy" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 +msgid "" +"Your account doesn't have permissions to resize all of the selected images." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:18 +msgid "There are no images available to resize." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:20 +msgid "The following images will be resized:" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:32 +msgid "Choose an existing thumbnail option or enter resize parameters:" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:36 +msgid "" +"Warning: Images will be resized in-place and originals will be lost. Maybe " +"first make a copy of them to retain the originals." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:39 +msgid "Resize" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:35 +msgid "" +"Your account doesn't have permissions to move all of the selected files and/" +"or folders." +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:47 +msgid "There are no files and/or folders available to move." +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:52 +msgid "" +"The following files and/or folders will be moved to a destination folder " +"(retaining their tree structure):" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 +msgid "Move" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:15 +msgid "" +"Your account doesn't have permissions to rename all of the selected files." +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:18 +msgid "There are no files available to rename." +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:20 +msgid "" +"The following files will be renamed (they will stay in their folders and " +"keep original filename, only displayed filename will be changed):" +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:59 +msgid "Rename" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:16 +msgid "Name" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 +#, python-format +msgid "Change '%(item_label)s' folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 +msgid "Select this file" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 +#, python-format +msgid "Change '%(item_label)s' details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "Permissions" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "disabled" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "enabled" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:144 +msgid "URL copied to clipboard" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:147 +#, python-format +msgid "Canonical url '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:151 +#, python-format +msgid "Download '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 +msgid "previous" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 +#, python-format +msgid "Page %(number)s of %(num_pages)s." +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 +msgid "next" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +msgid "Select all" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +msgid "Files" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +msgid "Add new" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:15 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: templates/admin/filer/folder/new_folder_form.html:30 +msgid "Save" +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +msgid "File is missing" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "found" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "and" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:7 +msgid "cancel search" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "" + +#: templates/admin/filer/widgets/admin_folder.html:16 +msgid "Choose Folder" +msgstr "" + +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" +msgstr "" + +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" +msgstr "" + +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" +msgstr "" + +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" +msgstr "" + +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" +msgstr "" + +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." + +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" + +#~ msgid "Open file" +#~ msgstr "Open file" + +#~ msgid "Full size preview" +#~ msgstr "Full size preview" + +#~ msgid "Add Description" +#~ msgstr "Add Description" + +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" + +#~ msgid "none selected" +#~ msgstr "none selected" + +#~ msgid "Add Folder" +#~ msgstr "Add Folder" + +#~ msgid "Subject Location" +#~ msgstr "Subject location" + +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" +#~ msgstr[1] "15c0f2d28d6dab1af1f6d94906beb627_pl_1" +#~ msgstr[2] "15c0f2d28d6dab1af1f6d94906beb627_pl_2" +#~ msgstr[3] "15c0f2d28d6dab1af1f6d94906beb627_pl_3" + +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/nb/LC_MESSAGES/django.mo b/filer/locale/nb/LC_MESSAGES/django.mo new file mode 100644 index 000000000..cc24295a7 Binary files /dev/null and b/filer/locale/nb/LC_MESSAGES/django.mo differ diff --git a/filer/locale/nb/LC_MESSAGES/django.po b/filer/locale/nb/LC_MESSAGES/django.po new file mode 100644 index 000000000..05d3f22b3 --- /dev/null +++ b/filer/locale/nb/LC_MESSAGES/django.po @@ -0,0 +1,1256 @@ +# 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: +# Translators: +# Eirik Krogstad , 2013 +msgid "" +msgstr "" +"Project-Id-Version: django Filer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: Eirik Krogstad , 2013\n" +"Language-Team: Norwegian Bokmål (http://app.transifex.com/divio/django-filer/" +"language/nb/)\n" +"Language: nb\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: admin/clipboardadmin.py:17 +msgid "You do not have permission to upload files." +msgstr "" + +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "" + +#: admin/clipboardadmin.py:20 +msgid "Can't use this folder, Permission Denied. Please select another folder." +msgstr "" + +#: admin/fileadmin.py:73 +msgid "Advanced" +msgstr "Avansert" + +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Du må velge noen elementer for å utføre handlinger på dem. Ingen elementer " +"er endret." + +#: admin/folderadmin.py:434 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s valgt" +msgstr[1] "Alle %(total_count)s valgt" + +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "" + +#: admin/folderadmin.py:475 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 av %(cnt)s valgt" + +#: admin/folderadmin.py:612 +msgid "No action selected." +msgstr "Ingen handling valgt." + +#: admin/folderadmin.py:664 +#, python-format +msgid "Successfully moved %(count)d files to clipboard." +msgstr "Flyttet %(count)d filer til utklippstavlen." + +#: admin/folderadmin.py:669 +msgid "Move selected files to clipboard" +msgstr "Flytt valgte filer til utklippstavlen" + +#: admin/folderadmin.py:709 +#, python-format +msgid "Successfully disabled permissions for %(count)d files." +msgstr "Fjernet tillatelser for %(count)d filer." + +#: admin/folderadmin.py:711 +#, python-format +msgid "Successfully enabled permissions for %(count)d files." +msgstr "Satte tillatelser for %(count)d filer." + +#: admin/folderadmin.py:719 +msgid "Enable permissions for selected files" +msgstr "Sett tillatelser for valgte filer" + +#: admin/folderadmin.py:725 +msgid "Disable permissions for selected files" +msgstr "Fjern tillatelser for valgte filer" + +#: admin/folderadmin.py:789 +#, python-format +msgid "Successfully deleted %(count)d files and/or folders." +msgstr "Slettet %(count)d filer og/eller mapper." + +#: admin/folderadmin.py:794 +msgid "Cannot delete files and/or folders" +msgstr "Kan ikke slette filer og/eller mapper" + +#: admin/folderadmin.py:796 +msgid "Are you sure?" +msgstr "Er du sikker?" + +#: admin/folderadmin.py:802 +msgid "Delete files and/or folders" +msgstr "Slett filer og/eller mapper" + +#: admin/folderadmin.py:823 +msgid "Delete selected files and/or folders" +msgstr "Slett valgte filer og/eller mapper" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "" + +#: admin/folderadmin.py:934 +#, python-format +msgid "" +"Successfully moved %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" +"Flyttet %(count)d filer og/eller mapper til mappen \"%(destination)s\"." + +#: admin/folderadmin.py:942 admin/folderadmin.py:944 +msgid "Move files and/or folders" +msgstr "Flytt filer og/eller mapper" + +#: admin/folderadmin.py:959 +msgid "Move selected files and/or folders" +msgstr "Flytt valgte filer og/eller mapper" + +#: admin/folderadmin.py:1016 +#, python-format +msgid "Successfully renamed %(count)d files." +msgstr "Endret navn på %(count)d filer." + +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 +msgid "Rename files" +msgstr "Endre navn på filer" + +#: admin/folderadmin.py:1137 +#, python-format +msgid "" +"Successfully copied %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" +"Kopierte %(count)d filer og/eller mapper til mappen \"%(destination)s\"." + +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 +msgid "Copy files and/or folders" +msgstr "Kopier filer og/eller mapper" + +#: admin/folderadmin.py:1174 +msgid "Copy selected files and/or folders" +msgstr "Kopier valgte filer og/eller mapper" + +#: admin/folderadmin.py:1279 +#, python-format +msgid "Successfully resized %(count)d images." +msgstr "Endret størrelse på %(count)d bilder." + +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 +msgid "Resize images" +msgstr "Endre størrelse på bilder" + +#: admin/folderadmin.py:1303 +msgid "Resize selected images" +msgstr "Endre størrelse på valgte bilder" + +#: admin/forms.py:24 +msgid "Suffix which will be appended to filenames of copied files." +msgstr "Endelse som vil tilføyes filnavn på kopierte filer." + +#: admin/forms.py:31 +#, python-format +msgid "" +"Suffix should be a valid, simple and lowercase filename part, like " +"\"%(valid)s\"." +msgstr "" +"Endelse bør være en gyldig, enkel del av filnavnet med små bokstaver, som " +"\"%(valid)s\"." + +#: admin/forms.py:52 +#, python-format +msgid "Unknown rename format value key \"%(key)s\"." +msgstr "Ugyldig nøkkel \"%(key)s\" for endring av navn." + +#: admin/forms.py:54 +#, python-format +msgid "Invalid rename format: %(error)s." +msgstr "Ugyldig format for endring av navn: %(error)s" + +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 +msgid "thumbnail option" +msgstr "miniatyrbildevalg" + +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 +msgid "width" +msgstr "bredde" + +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 +msgid "height" +msgstr "høyde" + +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 +msgid "crop" +msgstr "beskjæring" + +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 +msgid "upscale" +msgstr "oppskalering" + +#: admin/forms.py:79 +msgid "Thumbnail option or resize parameters must be choosen." +msgstr "Miniatyrbildevalg eller parametre for endring av størrelse må velges." + +#: admin/imageadmin.py:20 admin/imageadmin.py:112 +msgid "Subject location" +msgstr "Fokuseringsområde" + +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "" + +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "" + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "" + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "" + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" +msgstr "" + +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" +msgstr "" + +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "En mappe med dette navnet eksisterer allerede." + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "Filer" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "" + +#: models/abstract.py:62 +msgid "default alt text" +msgstr "standard alternativtekst" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "standard undertekst" + +#: models/abstract.py:76 +msgid "subject location" +msgstr "fokuseringsområde" + +#: models/abstract.py:91 +msgid "image" +msgstr "bilde" + +#: models/abstract.py:92 +msgid "images" +msgstr "bilder" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "" + +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." +msgstr "" + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 +msgid "user" +msgstr "bruker" + +#: models/clipboardmodels.py:17 models/filemodels.py:157 +msgid "files" +msgstr "filer" + +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 +msgid "clipboard" +msgstr "utklippstavle" + +#: models/clipboardmodels.py:25 +msgid "clipboards" +msgstr "utklippstavler" + +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 +msgid "file" +msgstr "fil" + +#: models/clipboardmodels.py:56 +msgid "clipboard item" +msgstr "element på utklippstavle" + +#: models/clipboardmodels.py:57 +msgid "clipboard items" +msgstr "elementer på utklippstavle" + +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "folder" +msgstr "mappe" + +#: models/filemodels.py:81 +msgid "file size" +msgstr "filstørrelse" + +#: models/filemodels.py:87 +msgid "sha1" +msgstr "sha1" + +#: models/filemodels.py:94 +msgid "has all mandatory data" +msgstr "har alle påkrevde data" + +#: models/filemodels.py:100 +msgid "original filename" +msgstr "originalt filnavn" + +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 +msgid "name" +msgstr "navn" + +#: models/filemodels.py:116 +msgid "description" +msgstr "beskrivelse" + +#: models/filemodels.py:125 models/foldermodels.py:108 +msgid "owner" +msgstr "eier" + +#: models/filemodels.py:129 models/foldermodels.py:116 +msgid "uploaded at" +msgstr "lastet opp" + +#: models/filemodels.py:134 models/foldermodels.py:126 +msgid "modified at" +msgstr "endret" + +#: models/filemodels.py:140 +msgid "Permissions disabled" +msgstr "Tillatelser er deaktivert" + +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "" + +#: models/foldermodels.py:94 +msgid "parent" +msgstr "" + +#: models/foldermodels.py:121 +msgid "created at" +msgstr "opprettet" + +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Folder" +msgstr "Mappe" + +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 +msgid "Folders" +msgstr "Mapper" + +#: models/foldermodels.py:260 +msgid "all items" +msgstr "alle elementer" + +#: models/foldermodels.py:261 +msgid "this item only" +msgstr "kun dette elementet" + +#: models/foldermodels.py:262 +msgid "this item and all children" +msgstr "dette elementet og alle underliggende nivå" + +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "" + +#: models/foldermodels.py:280 +msgid "type" +msgstr "type" + +#: models/foldermodels.py:297 +msgid "group" +msgstr "gruppe" + +#: models/foldermodels.py:304 +msgid "everybody" +msgstr "alle" + +#: models/foldermodels.py:309 +msgid "can read" +msgstr "kan lese" + +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "kan redigere" + +#: models/foldermodels.py:325 +msgid "can add children" +msgstr "kan legge til undernivåer" + +#: models/foldermodels.py:333 +msgid "folder permission" +msgstr "tillatelse for mappe" + +#: models/foldermodels.py:334 +msgid "folder permissions" +msgstr "tillatelser for mappe" + +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." +msgstr "" + +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." +msgstr "" + +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." +msgstr "" + +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." +msgstr "" + +#: models/foldermodels.py:360 +msgid "All Folders" +msgstr "" + +#: models/foldermodels.py:362 +msgid "Logical Path" +msgstr "" + +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" +msgstr "" + +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" +msgstr "" + +#: models/foldermodels.py:375 +msgid "Everybody" +msgstr "" + +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "" + +#: models/foldermodels.py:389 +msgid "Read" +msgstr "" + +#: models/foldermodels.py:390 +msgid "Add children" +msgstr "" + +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "dato bildet ble tatt" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "opphavsperson" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "må alltid publisere opphavsperson" + +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "må alltid publisere opphavsrett" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "" + +#: models/virtualitems.py:73 +msgid "files with missing metadata" +msgstr "filer med manglende metadata" + +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "root" +msgstr "rot" + +#: settings.py:273 +msgid "Show table view" +msgstr "" + +#: settings.py:278 +msgid "Show thumbnail view" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Run the selected action" +msgstr "Utfør den valgte handlingen" + +#: templates/admin/filer/actions.html:5 +msgid "Go" +msgstr "Utfør" + +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +msgid "Click here to select the objects across all pages" +msgstr "Klikk her for å velge objekter på tvers av alle sider" + +#: templates/admin/filer/actions.html:14 +#, python-format +msgid "Select all %(total_count)s files and/or folders" +msgstr "Velg alle %(total_count)s filer og/eller mapper" + +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 +msgid "Clear selection" +msgstr "Tøm utvalg" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 +msgid "Go back to admin homepage" +msgstr "Gå tilbake til administrasjonssiden" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 +msgid "Home" +msgstr "Hjem" + +#: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 +msgid "Go back to Filer app" +msgstr "Gå tilbake til Filer" + +#: templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Go back to root folder" +msgstr "Gå tilbake til rotmappen" + +#: templates/admin/filer/breadcrumbs.html:8 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 +#, python-format +msgid "Go back to '%(folder_name)s' folder" +msgstr "Gå tilbake til mappen \"%(folder_name)s\"" + +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:11 +msgid "" +"Deleting the selected files and/or folders would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Å slette de valgte filene og/eller mappene ville resultere i sletting av " +"relaterte objekter, men din konto har ikke tillatelse til å slette objekter " +"av følgende typer:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:19 +msgid "" +"Deleting the selected files and/or folders would require deleting the " +"following protected related objects:" +msgstr "" +"Å slette de valgte filene og/eller mappene ville kreve å slette følgende " +"beskyttede relaterte objekter:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:27 +msgid "" +"Are you sure you want to delete the selected files and/or folders? All of " +"the following objects and their related items will be deleted:" +msgstr "" +"Er du sikker på at du vil slette de valgte filene og/eller mappene? Alle de " +"følgende objektene og deres relaterte elementer vil bli slettet:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "" + +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 +msgid "History" +msgstr "Historie" + +#: templates/admin/filer/file/change_form.html:37 +#: templates/admin/filer/folder/change_form.html:23 +#: templates/admin/filer/image/change_form.html:37 +msgid "View on site" +msgstr "Se på nettstedet" + +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "Gå tilbake til" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "administrasjonssiden" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 +msgid "Folder Icon" +msgstr "Mappeikon" + +#: templates/admin/filer/folder/choose_copy_destination.html:23 +msgid "" +"Your account doesn't have permissions to copy all of the selected files and/" +"or folders." +msgstr "" +"Din konto har ikke tillatelse til å kopiere alle de valgte filene og/eller " +"mappene." + +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 +msgid "There are no destination folders available." +msgstr "Det er ingen målmapper tilgjengelig." + +#: templates/admin/filer/folder/choose_copy_destination.html:35 +msgid "There are no files and/or folders available to copy." +msgstr "Det er ingen filer og/eller mapper å kopiere." + +#: templates/admin/filer/folder/choose_copy_destination.html:40 +msgid "" +"The following files and/or folders will be copied to a destination folder " +"(retaining their tree structure):" +msgstr "" +"De følgende filene og/eller mappene vil bli kopiert til en målmappe " +"(mappestruktur vil beholdes):" + +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 +msgid "Destination folder:" +msgstr "Målmappe:" + +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 +msgid "Copy" +msgstr "Kopier" + +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 +msgid "" +"Your account doesn't have permissions to resize all of the selected images." +msgstr "" +"Din konto har ikke tillatelse til å endre størrelse på alle valgte bilder." + +#: templates/admin/filer/folder/choose_images_resize_options.html:18 +msgid "There are no images available to resize." +msgstr "Det er ingen bilder å endre størrelse på." + +#: templates/admin/filer/folder/choose_images_resize_options.html:20 +msgid "The following images will be resized:" +msgstr "De følgende bildene vil få endret størrelse:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:32 +msgid "Choose an existing thumbnail option or enter resize parameters:" +msgstr "" +"Velg et eksisterende miniatyrbildevalg eller skriv inn parametre for endring " +"av størrelse:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:36 +msgid "" +"Warning: Images will be resized in-place and originals will be lost. Maybe " +"first make a copy of them to retain the originals." +msgstr "" +"Advarsel: Bilder vil få sin størrelse endret, og originalene vil gå tapt. " +"Det kan være ønskelig å først gjøre en kopi for å beholde originalene." + +#: templates/admin/filer/folder/choose_images_resize_options.html:39 +msgid "Resize" +msgstr "Endre størrelse" + +#: templates/admin/filer/folder/choose_move_destination.html:35 +msgid "" +"Your account doesn't have permissions to move all of the selected files and/" +"or folders." +msgstr "" +"Din konto har ikke tillatelse til å flytte alle de valgte filene og/eller " +"mappene." + +#: templates/admin/filer/folder/choose_move_destination.html:47 +msgid "There are no files and/or folders available to move." +msgstr "Det er ingen filer og/eller mapper å flytte." + +#: templates/admin/filer/folder/choose_move_destination.html:52 +msgid "" +"The following files and/or folders will be moved to a destination folder " +"(retaining their tree structure):" +msgstr "" +"De følgende filene og/eller mappene vil bli flyttet til en målmappe " +"(mappestruktur vil beholdes):" + +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 +msgid "Move" +msgstr "Flytt" + +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:15 +msgid "" +"Your account doesn't have permissions to rename all of the selected files." +msgstr "" +"Din konto har ikke tillatelse til å endre navn på alle de valgte filene." + +#: templates/admin/filer/folder/choose_rename_format.html:18 +msgid "There are no files available to rename." +msgstr "Det er ingen filer å endre navn på." + +#: templates/admin/filer/folder/choose_rename_format.html:20 +msgid "" +"The following files will be renamed (they will stay in their folders and " +"keep original filename, only displayed filename will be changed):" +msgstr "" +"De følgende filene vil få endret navn (de vil forbli på samme sted og " +"beholde originalt filnavn, bare visningsnavn vil endres):" + +#: templates/admin/filer/folder/choose_rename_format.html:59 +msgid "Rename" +msgstr "Endre navn" + +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "Gå tilbake til overordnet nivå" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "Endre detaljer for gjeldende mappe" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "Endre" + +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "Søk" + +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "Slett" + +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "Legger til en ny mappe" + +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "Ny mappe" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:16 +msgid "Name" +msgstr "Navn" + +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "Eier" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 +#, python-format +msgid "Change '%(item_label)s' folder details" +msgstr "Endre detaljer for mappen \"%(item_label)s\"" + +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "" +msgstr[1] "" + +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "" +msgstr[1] "" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 +msgid "Select this file" +msgstr "Velg denne filen" + +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 +#, python-format +msgid "Change '%(item_label)s' details" +msgstr "Endre detaljer for \"%(item_label)s\"" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "Permissions" +msgstr "Tillatelser" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "disabled" +msgstr "deaktivert" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "enabled" +msgstr "aktivert" + +#: templates/admin/filer/folder/directory_table_list.html:144 +#, fuzzy +#| msgid "Move selected files to clipboard" +msgid "URL copied to clipboard" +msgstr "Flytt valgte filer til utklippstavlen" + +#: templates/admin/filer/folder/directory_table_list.html:147 +#, python-format +msgid "Canonical url '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:151 +#, python-format +msgid "Download '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "Last opp" + +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 +msgid "previous" +msgstr "forrige" + +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 +#, python-format +msgid "Page %(number)s of %(num_pages)s." +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 +msgid "next" +msgstr "neste" + +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +msgid "Select all" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +msgid "Files" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +msgid "Add new" +msgstr "Legg til ny" + +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:15 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Vennligst rett feilen under" +msgstr[1] "Vennligst rett feilene under." + +#: templates/admin/filer/folder/new_folder_form.html:30 +msgid "Save" +msgstr "Lagre" + +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "Utklippstavle" + +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "Lim inn alle elementer her" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "Flytt alle filer på utklippstavlen til" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "utklippstavlen er tom" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "feil ved opplasting" + +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +msgid "File is missing" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "found" +msgstr "funnet" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "and" +msgstr "og" + +#: templates/admin/filer/tools/search_form.html:7 +msgid "cancel search" +msgstr "avbryt søk" + +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "Tøm" + +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "ingen fil valgt" + +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "Slå opp" + +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "" + +#: templates/admin/filer/widgets/admin_folder.html:16 +msgid "Choose Folder" +msgstr "" + +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" +msgstr "" + +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" +msgstr "" + +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" +msgstr "" + +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" +msgstr "" + +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" +msgstr "" + +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." + +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" + +#~ msgid "Open file" +#~ msgstr "Open file" + +#~ msgid "Full size preview" +#~ msgstr "Full size preview" + +#~ msgid "Add Description" +#~ msgstr "Add Description" + +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" + +#~ msgid "none selected" +#~ msgstr "none selected" + +#~ msgid "Add Folder" +#~ msgstr "Add Folder" + +#~ msgid "Subject Location" +#~ msgstr "Subject location" + +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" +#~ msgstr[1] "15c0f2d28d6dab1af1f6d94906beb627_pl_1" + +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/nl_NL/LC_MESSAGES/django.mo b/filer/locale/nl_NL/LC_MESSAGES/django.mo new file mode 100644 index 000000000..c9e62df2f Binary files /dev/null and b/filer/locale/nl_NL/LC_MESSAGES/django.mo differ diff --git a/filer/locale/nl_NL/LC_MESSAGES/django.po b/filer/locale/nl_NL/LC_MESSAGES/django.po new file mode 100644 index 000000000..0cbda5a3f --- /dev/null +++ b/filer/locale/nl_NL/LC_MESSAGES/django.po @@ -0,0 +1,1245 @@ +# 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: +# Translators: +# Alexander Schoemaker , 2012 +# Alexander Schoemaker , 2012 +# Edwin Janssen, 2023 +# Evelijn Saaltink , 2017 +# Jeroen, 2018 +# Maikel Wever, 2013 +# Maikel Wever, 2013 +# Stefan van den Eertwegh , 2023 +msgid "" +msgstr "" +"Project-Id-Version: django Filer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: Stefan van den Eertwegh , 2023\n" +"Language-Team: Dutch (Netherlands) (http://app.transifex.com/divio/django-filer/language/nl_NL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nl_NL\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: admin/clipboardadmin.py:17 +#| msgid "" +#| "ccount doesn't have permissions to rename all of the selected files." +msgid "You do not have permission to upload files." +msgstr "Je hebt geen rechten om bestanden te uploaden." + +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "Kan map niet vinden om te uploaden. Herlaad de pagina en probeer het opnieuw." + +#: admin/clipboardadmin.py:20 +msgid "" +"Can't use this folder, Permission Denied. Please select another folder." +msgstr "Kan deze map niet gebruiken, rechten geweigerd. Kies een andere map." + +#: admin/fileadmin.py:73 +msgid "Advanced" +msgstr "Geavanceerd" + +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "canonieke URL" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "De actie kan niet worden uitgevoerd omdat er zijn geen items geselecteerd." + +#: admin/folderadmin.py:434 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s geselecteerd" +msgstr[1] "Alle %(total_count)s geselecteerd" + +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "Inhoud van map %(folder_name)s" + +#: admin/folderadmin.py:475 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 van %(cnt)s geselecteerd" + +#: admin/folderadmin.py:612 +msgid "No action selected." +msgstr "Geen actie geselecteerd." + +#: admin/folderadmin.py:664 +#, python-format +msgid "Successfully moved %(count)d files to clipboard." +msgstr "%(count)d bestanden zijn succesvol verplaatst naar het klembord." + +#: admin/folderadmin.py:669 +msgid "Move selected files to clipboard" +msgstr "Verplaats geselecteerde bestanden naar het klembord" + +#: admin/folderadmin.py:709 +#, python-format +msgid "Successfully disabled permissions for %(count)d files." +msgstr "Toegangsrechten succesvol uitgeschakeld voor %(count)d bestanden." + +#: admin/folderadmin.py:711 +#, python-format +msgid "Successfully enabled permissions for %(count)d files." +msgstr "Toegangsrechten succesvol ingeschakeld voor %(count)d bestanden." + +#: admin/folderadmin.py:719 +msgid "Enable permissions for selected files" +msgstr "Schakel toegangsrechten in voor geselecteerde bestanden" + +#: admin/folderadmin.py:725 +msgid "Disable permissions for selected files" +msgstr "Schakel toegangsrechten uit voor geselecteerde bestanden" + +#: admin/folderadmin.py:789 +#, python-format +msgid "Successfully deleted %(count)d files and/or folders." +msgstr "%(count)d bestanden en/of mappen zijn succesvol verwijderd." + +#: admin/folderadmin.py:794 +msgid "Cannot delete files and/or folders" +msgstr "Bestanden en/of mappen kunnen niet worden verwijderd" + +#: admin/folderadmin.py:796 +msgid "Are you sure?" +msgstr "Weet je het zeker?" + +#: admin/folderadmin.py:802 +msgid "Delete files and/or folders" +msgstr "Verwijder bestanden en/of mappen" + +#: admin/folderadmin.py:823 +msgid "Delete selected files and/or folders" +msgstr "Verwijder geselecteerde bestanden en/of mappen" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "Er bestaan al mappen met de namen %s op de geselecteerde bestemming" + +#: admin/folderadmin.py:934 +#, python-format +msgid "" +"Successfully moved %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "%(count)d bestanden en of mappen zijn succesvol verplaatst naar map '%(destination)s'." + +#: admin/folderadmin.py:942 admin/folderadmin.py:944 +msgid "Move files and/or folders" +msgstr "Verplaats bestanden en/of mappen" + +#: admin/folderadmin.py:959 +msgid "Move selected files and/or folders" +msgstr "Verplaats geselecteerde bestanden en/of mappen" + +#: admin/folderadmin.py:1016 +#, python-format +msgid "Successfully renamed %(count)d files." +msgstr "%(count)d bestanden zijn succesvol hernoemd." + +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 +msgid "Rename files" +msgstr "Hernoem bestanden" + +#: admin/folderadmin.py:1137 +#, python-format +msgid "" +"Successfully copied %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "%(count)d bestanden en/of mappen zijn succesvol gekopieerd naar map '%(destination)s'." + +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 +msgid "Copy files and/or folders" +msgstr "Kopieer bestanden en/of mappen" + +#: admin/folderadmin.py:1174 +msgid "Copy selected files and/or folders" +msgstr "Kopieer geselecteerde bestanden en/of mappen" + +#: admin/folderadmin.py:1279 +#, python-format +msgid "Successfully resized %(count)d images." +msgstr "Afmetingen van %(count)d afbeeldingen zijn succesvol aangepast." + +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 +msgid "Resize images" +msgstr "Afmetingen aanpassen" + +#: admin/folderadmin.py:1303 +msgid "Resize selected images" +msgstr "Afmetingen aanpassen van geselecteerde afbeeldingen" + +#: admin/forms.py:24 +msgid "Suffix which will be appended to filenames of copied files." +msgstr "Achtervoegsel wordt toegevoegd aan bestandsnaam van gekopieerde bestanden" + +#: admin/forms.py:31 +#, python-format +msgid "" +"Suffix should be a valid, simple and lowercase filename part, like " +"\"%(valid)s\"." +msgstr "Achtervoegsel moet een geldige waarde zijn in kleine letters, bv. \"%(valid)s\"." + +#: admin/forms.py:52 +#, python-format +msgid "Unknown rename format value key \"%(key)s\"." +msgstr "Type \"%(key)s\" voor het hernoemen van bestandsnamen is ongeldig." + +#: admin/forms.py:54 +#, python-format +msgid "Invalid rename format: %(error)s." +msgstr "Ongeldige waarde voor het hernoemen van bestandsnamen: %(error)s." + +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 +msgid "thumbnail option" +msgstr "thumbnail optie" + +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 +msgid "width" +msgstr "breedte" + +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 +msgid "height" +msgstr "hoogte" + +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 +msgid "crop" +msgstr "uitsnijden" + +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 +msgid "upscale" +msgstr "opschalen" + +#: admin/forms.py:79 +msgid "Thumbnail option or resize parameters must be choosen." +msgstr "Thumbnail optie of afmetingsopties moet zijn geselecteerd" + +#: admin/imageadmin.py:20 admin/imageadmin.py:112 +msgid "Subject location" +msgstr "Locatie van onderwerp" + +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "Locatie van het hoofdonderwerp van de scène. Formaat: \"x,y\"." + +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "Ongeldig locatieformaat van het onderwerp" + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "Locatie van het onderwerp bevindt zich buiten de afbeelding." + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "Je invoer: \"{subject_location}\"." + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" +msgstr "Wie" + +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" +msgstr "Wat" + +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "Er bestaat al een map met deze naam." + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "Bestandsbeheer" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "Mediabibliotheek" + +#: models/abstract.py:62 +msgid "default alt text" +msgstr "standaard alt. tekst" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "standaard titel" + +#: models/abstract.py:76 +msgid "subject location" +msgstr "locatie van onderwerp" + +#: models/abstract.py:91 +msgid "image" +msgstr "afbeelding" + +#: models/abstract.py:92 +msgid "images" +msgstr "afbeeldingen" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "Afbeelding formaat niet herkend of afbeelding grootte overtreft limiet van %(max_pixels)d miljoen pixels bij een factor twee of meer. Voor opnieuw uploaden, check bestandsformaat of wijzig grootte afbeelding van %(width)d x %(height)d resolutie of lager." + +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." +msgstr "Afbeelding grootte (%(pixels)d miljoen pixels) overtreft limiet van %(max_pixels)d miljoen pixels. Voor het opnieuw uploaden, afbeelding grootte van %(width)d x %(height)d resolutie of lager." + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 +msgid "user" +msgstr "gebruiker" + +#: models/clipboardmodels.py:17 models/filemodels.py:157 +msgid "files" +msgstr "bestanden" + +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 +msgid "clipboard" +msgstr "klembord" + +#: models/clipboardmodels.py:25 +msgid "clipboards" +msgstr "klemborden" + +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 +msgid "file" +msgstr "bestand" + +#: models/clipboardmodels.py:56 +msgid "clipboard item" +msgstr "klembord item" + +#: models/clipboardmodels.py:57 +msgid "clipboard items" +msgstr "klembord items" + +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "folder" +msgstr "map" + +#: models/filemodels.py:81 +msgid "file size" +msgstr "bestandsgrootte" + +#: models/filemodels.py:87 +msgid "sha1" +msgstr "sha1" + +#: models/filemodels.py:94 +msgid "has all mandatory data" +msgstr "heeft allen verplichte eigenschappen" + +#: models/filemodels.py:100 +msgid "original filename" +msgstr "oorspronkelijke bestandsnaam" + +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 +msgid "name" +msgstr "naam" + +#: models/filemodels.py:116 +msgid "description" +msgstr "omschrijving" + +#: models/filemodels.py:125 models/foldermodels.py:108 +msgid "owner" +msgstr "eigenaar" + +#: models/filemodels.py:129 models/foldermodels.py:116 +msgid "uploaded at" +msgstr "geüpload op" + +#: models/filemodels.py:134 models/foldermodels.py:126 +msgid "modified at" +msgstr "gewijzigd op" + +#: models/filemodels.py:140 +msgid "Permissions disabled" +msgstr "Toegangsrechten uitgeschakeld" + +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "Schakel controle op toegangsrechten uit voor dit bestand. Het bestand zal publiek toegankelijk zijn voor iedereen" + +#: models/foldermodels.py:94 +msgid "parent" +msgstr "ouder" + +#: models/foldermodels.py:121 +msgid "created at" +msgstr "aangemaakt op" + +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Folder" +msgstr "Map" + +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 +msgid "Folders" +msgstr "Mappen" + +#: models/foldermodels.py:260 +msgid "all items" +msgstr "alle items" + +#: models/foldermodels.py:261 +msgid "this item only" +msgstr "alleen dit item" + +#: models/foldermodels.py:262 +msgid "this item and all children" +msgstr "dit item en alle onderliggende items" + +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "overerven" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "toestaan" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "afwijzen" + +#: models/foldermodels.py:280 +msgid "type" +msgstr "type" + +#: models/foldermodels.py:297 +msgid "group" +msgstr "groep" + +#: models/foldermodels.py:304 +msgid "everybody" +msgstr "iedereen" + +#: models/foldermodels.py:309 +msgid "can read" +msgstr "mag lezen" + +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "mag wijzigen" + +#: models/foldermodels.py:325 +msgid "can add children" +msgstr "mag onderliggende items toevoegen" + +#: models/foldermodels.py:333 +msgid "folder permission" +msgstr "toegangsrecht folder" + +#: models/foldermodels.py:334 +msgid "folder permissions" +msgstr "toegangsrechten folder" + +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." +msgstr "Map kan niet geselecteerd worden met type \"alle items\"." + +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." +msgstr "Map moet geselecteerd worden wanneer type niet \"alle items\" is." + +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." +msgstr "Gebruiker of groep kan niet geselecteerd worden samen met \"iedereen\"." + +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." +msgstr "Ten minste één gebruiker, groep of \"iedereen\" moet worden geselecteerd." + +#: models/foldermodels.py:360 +#| msgid "Folders" +msgid "All Folders" +msgstr "Alle Mappen" + +#: models/foldermodels.py:362 +msgid "Logical Path" +msgstr "Logisch Pad" + +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" +msgstr "Gebruiker:{user}" + +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" +msgstr "Groep: {group}" + +#: models/foldermodels.py:375 +#| msgid "everybody" +msgid "Everybody" +msgstr "Iedereen" + +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "Bewerken" + +#: models/foldermodels.py:389 +msgid "Read" +msgstr "Lezen" + +#: models/foldermodels.py:390 +#| msgid "can add children" +msgid "Add children" +msgstr "Toevoegen kinderen" + +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "datum" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "auteur" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "naam auteur altijd publiceren" + +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "auteursrechten altijd publiceren" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "breedte in pixel." + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "hoogte in pixel." + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "thumbnail-opties" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "Ongesorteerde uploads" + +#: models/virtualitems.py:73 +msgid "files with missing metadata" +msgstr "bestanden met ontbrekende meta gegevens" + +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "root" +msgstr "hoofdmap" + +#: settings.py:273 +msgid "Show table view" +msgstr "Toon tabel weergave" + +#: settings.py:278 +#| msgid "thumbnail option" +msgid "Show thumbnail view" +msgstr "Toon thumbnail weergave" + +#: templates/admin/filer/actions.html:5 +msgid "Run the selected action" +msgstr "Geselecteerde actie uitvoeren" + +#: templates/admin/filer/actions.html:5 +msgid "Go" +msgstr "Uitvoeren" + +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +msgid "Click here to select the objects across all pages" +msgstr "Klik hier om objecten over alle pagina's te selecteren" + +#: templates/admin/filer/actions.html:14 +#, python-format +msgid "Select all %(total_count)s files and/or folders" +msgstr "Selecteer alle %(total_count)s bestanden en/of mappen" + +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 +msgid "Clear selection" +msgstr "Selectie wissen" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 +msgid "Go back to admin homepage" +msgstr "Ga terug naar admin homepage" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 +msgid "Home" +msgstr "Home" + +#: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 +msgid "Go back to Filer app" +msgstr "Ga terug naar Bestandsbeheer" + +#: templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Go back to root folder" +msgstr "Ga terug naar de hoofdmap" + +#: templates/admin/filer/breadcrumbs.html:8 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 +#, python-format +msgid "Go back to '%(folder_name)s' folder" +msgstr "Ga terug naar map '%(folder_name)s'" + +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "Duplicaten" + +#: templates/admin/filer/delete_selected_files_confirmation.html:11 +msgid "" +"Deleting the selected files and/or folders would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "Het verwijderen van de geselecteerde bestanden en/of mappen resulteert in het verwijderen van gerelateerde objecten. Je hebt echter geen toegangsrechten voor het verwijderen van de volgende objecttypes:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:19 +msgid "" +"Deleting the selected files and/or folders would require deleting the " +"following protected related objects:" +msgstr "Het verwijderen van de geselecteerde bestanden en/of mappen leidt tot het verwijderen van de volgende beschermde gerelateerde objecten:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:27 +msgid "" +"Are you sure you want to delete the selected files and/or folders? All of " +"the following objects and their related items will be deleted:" +msgstr "Weet je zeker dat je de geselecteerde bestanden en/of folders wilt verwijderen? Alle volgende objecten en gerelateerde items zullen worden verwijderd: " + +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "Nee, ga terug" + +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "Ja, ik weet het zeker" + +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 +msgid "History" +msgstr "Geschiedenis" + +#: templates/admin/filer/file/change_form.html:37 +#: templates/admin/filer/folder/change_form.html:23 +#: templates/admin/filer/image/change_form.html:37 +msgid "View on site" +msgstr "Bekijk op site" + +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "Ga terug naar" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "admin homepage" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 +msgid "Folder Icon" +msgstr "Map icoon" + +#: templates/admin/filer/folder/choose_copy_destination.html:23 +msgid "" +"Your account doesn't have permissions to copy all of the selected files " +"and/or folders." +msgstr "Je account heeft geen toegangsrechten voor het kopiëren van de geselecteerde bestanden en/of mappen" + +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "Neem me mee terug" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 +msgid "There are no destination folders available." +msgstr "Er zijn geen bestemmingsmappen beschikbaar." + +#: templates/admin/filer/folder/choose_copy_destination.html:35 +msgid "There are no files and/or folders available to copy." +msgstr "Er zijn geen bestanden en/of mappen beschikbaar om te kopiëren." + +#: templates/admin/filer/folder/choose_copy_destination.html:40 +msgid "" +"The following files and/or folders will be copied to a destination folder " +"(retaining their tree structure):" +msgstr "De volgende bestanden en/of mappen zullen worden gekopieerd naar een bestemmingsmap (structuur blijft behouden):" + +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 +msgid "Destination folder:" +msgstr "Bestemmingsmap:" + +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 +msgid "Copy" +msgstr "Kopiëren" + +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "Het is niet toegestaan om bestanden naar dezelfde map te kopiëren" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 +msgid "" +"Your account doesn't have permissions to resize all of the selected images." +msgstr "Je account heeft geen toegangsrechten om afmetingen van alle geselecteerde afbeeldingen aan te passen." + +#: templates/admin/filer/folder/choose_images_resize_options.html:18 +msgid "There are no images available to resize." +msgstr "Er zijn geen afbeeldingen beschikbaar voor het aanpassen van afmetingen." + +#: templates/admin/filer/folder/choose_images_resize_options.html:20 +msgid "The following images will be resized:" +msgstr "De afmetingen van de volgende afbeeldingen zullen worden aangepast:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:32 +msgid "Choose an existing thumbnail option or enter resize parameters:" +msgstr "Kies een bestaande thumbnail optie of voer afmetingsopties in:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:36 +msgid "" +"Warning: Images will be resized in-place and originals will be lost. Maybe " +"first make a copy of them to retain the originals." +msgstr "Waarschuwing: bestaande afmetingen van afbeeldingen zullen worden aangepast. Oorspronkelijke bestanden zullen verloren gaan. Maak eventueel eerst een kopie om de oorspronkelijke bestanden te behouden." + +#: templates/admin/filer/folder/choose_images_resize_options.html:39 +msgid "Resize" +msgstr "Afmetingen aanpassen" + +#: templates/admin/filer/folder/choose_move_destination.html:35 +msgid "" +"Your account doesn't have permissions to move all of the selected files " +"and/or folders." +msgstr "Je account heeft geen toegangsrechten om alle geselecteerde bestanden en/of mappen te verplaatsen." + +#: templates/admin/filer/folder/choose_move_destination.html:47 +msgid "There are no files and/or folders available to move." +msgstr "Er zijn geen bestanden en/of mappen beschikbaar om te verplaatsen." + +#: templates/admin/filer/folder/choose_move_destination.html:52 +msgid "" +"The following files and/or folders will be moved to a destination folder " +"(retaining their tree structure):" +msgstr "De volgende bestanden en/of mappen zullen worden verplaatst naar een bestemmingsmap (huidige mapstructuur blijft behouden): " + +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 +msgid "Move" +msgstr "Verplaatsen" + +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "Het is niet toegestaan om bestanden naar dezelfde map te verplaatsen" + +#: templates/admin/filer/folder/choose_rename_format.html:15 +msgid "" +"Your account doesn't have permissions to rename all of the selected files." +msgstr "Je account heeft onvoldoende toegangsrechten om alle geselecteerde bestanden te hernoemen." + +#: templates/admin/filer/folder/choose_rename_format.html:18 +msgid "There are no files available to rename." +msgstr "Er zijn geen bestanden beschikbaar om te hernoemen." + +#: templates/admin/filer/folder/choose_rename_format.html:20 +msgid "" +"The following files will be renamed (they will stay in their folders and " +"keep original filename, only displayed filename will be changed):" +msgstr "De volgende bestanden zullen worden hernoemd (de oorspronkelijke mapstructuur en bestandsnamen blijven behouden, alleen de weergave zal worden gewijzigd):" + +#: templates/admin/filer/folder/choose_rename_format.html:59 +msgid "Rename" +msgstr "Hernoemen" + +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "Ga terug naar de bovenliggende folder" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "Wijzig eigenschappen van huidige map" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "Wijzigen" + +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "Klik hier om een zoekopdracht te doen voor de ingevoerde woorden" + +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "Zoeken" + +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "Sluiten" + +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "Limiteren" + +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "Vink het aan om de zoekopdracht te beperken tot de huidige map" + +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "Zoekopdracht beperken tot huidige map" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "Verwijderen" + +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "Voegt een nieuwe map toe" + +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "Nieuwe map" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "Bestanden uploaden" + +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "Je moet eerst een map selecteren" + +#: templates/admin/filer/folder/directory_table_list.html:16 +msgid "Name" +msgstr "Naam" + +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "Eigenaar" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "Grootte" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "Actie" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 +#, python-format +msgid "Change '%(item_label)s' folder details" +msgstr "Wijzig eigenschappen map '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "%(counter)s map" +msgstr[1] "%(counter)s mappen" + +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "%(counter)s bestand" +msgstr[1] "%(counter)s bestanden" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "Wijzig eigenschappen van de map" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "Verwijder map" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 +msgid "Select this file" +msgstr "Selecteer dit bestand" + +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 +#, python-format +msgid "Change '%(item_label)s' details" +msgstr "Wijzig eigenschappen '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "Permissions" +msgstr "Toegangsrechten" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "disabled" +msgstr "uitgeschakeld" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "enabled" +msgstr "ingeschakeld" + +#: templates/admin/filer/folder/directory_table_list.html:144 +#| msgid "Move selected files to clipboard" +msgid "URL copied to clipboard" +msgstr "URL gekopieerd naar het klembord" + +#: templates/admin/filer/folder/directory_table_list.html:147 +#, python-format +#| msgid "Change '%(item_label)s' details" +msgid "Canonical url '%(item_label)s'" +msgstr "Gebruikelijke url '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:151 +#, python-format +#| msgid "Change '%(item_label)s' details" +msgid "Download '%(item_label)s'" +msgstr "Download '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "Verwijder bestand" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "Sleep hier bestanden naartoe of gebruik de \"Bestanden uploaden\"-knop" + +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "Sleep je bestand om te uploaden naar:" + +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "Uploaden" + +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "annuleer" + +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "Upload succesvol!" + +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "Upload geannuleerd!" + +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 +msgid "previous" +msgstr "vorige" + +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 +#, python-format +msgid "Page %(number)s of %(num_pages)s." +msgstr "Pagina %(number)s van %(num_pages)s." + +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 +msgid "next" +msgstr "volgende" + +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "Selecteer alle %(total_count)s" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +#| msgid "Select this file" +msgid "Select all" +msgstr "Alles selecteren" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +#| msgid "Filer" +msgid "Files" +msgstr "Bestanden" + +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +msgid "Add new" +msgstr "Toevoegen nieuwe" + +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" +msgstr "Django site beheer" + +#: templates/admin/filer/folder/new_folder_form.html:15 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Herstel onderstaande fout." +msgstr[1] "Herstel onderstaande fouten." + +#: templates/admin/filer/folder/new_folder_form.html:30 +msgid "Save" +msgstr "Opslaan" + +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." +msgstr "Je browser ondersteunt geen audio." + +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." +msgstr "Je browser ondersteunt geen video." + +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "Klembord" + +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "Alle items hier plakken" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "Verplaats alle klembord items naar" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "Leeg klembord" + +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "het klembord is leeg" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "upload mislukt" + +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" +msgstr "Download" + +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" +msgstr "Uitvouwen" + +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +#| msgid "file missing" +msgid "File is missing" +msgstr "Bestand ontbreekt" + +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "Type" + +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "Bestandsgrootte" + +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "Gewijzigd" + +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "Aangemaakt" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "found" +msgstr "gevonden" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "and" +msgstr "en" + +#: templates/admin/filer/tools/search_form.html:7 +msgid "cancel search" +msgstr "annuleer zoekopdracht" + +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "Wissen" + +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "of sleep je bestand hier naartoe" + +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "geen bestand geselecteerd" + +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "Opzoeken" + +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "Kies bestand" + +#: templates/admin/filer/widgets/admin_folder.html:16 +#| msgid "Choose File" +msgid "Choose Folder" +msgstr "Kies Map" + +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" +msgstr "Bestand \"{file_name}\": Upload geweigerd door het beveiligingsbeleid van de site" + +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" +msgstr "Bestand \"{file_name}\": {file_type} upload geweigerd door het beveiligingsbeleid van de site" + +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" +msgstr "Bestand \"{file_name}\": HTML upload geweigerd door het beveiligingsbeleid van de site" + +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" +msgstr "Bestand \"{file_name}\": Afgewezen wegens mogelijke kwetsbaarheid voor cross-site scripting" + +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" +msgstr "Bestand \"{file_name}\": SVG bestandsformaat niet herkend" + +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." + +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" + +#~ msgid "Open file" +#~ msgstr "Open file" + +#~ msgid "Full size preview" +#~ msgstr "Full size preview" + +#~ msgid "Add Description" +#~ msgstr "Add Description" + +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" + +#~ msgid "none selected" +#~ msgstr "none selected" + +#~ msgid "Add Folder" +#~ msgstr "Add Folder" + +#~ msgid "Subject Location" +#~ msgstr "Subject location" + +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" +#~ msgstr[1] "15c0f2d28d6dab1af1f6d94906beb627_pl_1" + +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/nn/LC_MESSAGES/django.mo b/filer/locale/nn/LC_MESSAGES/django.mo new file mode 100644 index 000000000..379659ff7 Binary files /dev/null and b/filer/locale/nn/LC_MESSAGES/django.mo differ diff --git a/filer/locale/nn/LC_MESSAGES/django.po b/filer/locale/nn/LC_MESSAGES/django.po new file mode 100644 index 000000000..255a1f963 --- /dev/null +++ b/filer/locale/nn/LC_MESSAGES/django.po @@ -0,0 +1,1253 @@ +# 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: +# Translators: +# Eirik Krogstad , 2013 +# Eirik Krogstad , 2013 +msgid "" +msgstr "" +"Project-Id-Version: django Filer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: Eirik Krogstad , 2013\n" +"Language-Team: Norwegian Nynorsk (http://app.transifex.com/divio/django-" +"filer/language/nn/)\n" +"Language: nn\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: admin/clipboardadmin.py:17 +msgid "You do not have permission to upload files." +msgstr "" + +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "" + +#: admin/clipboardadmin.py:20 +msgid "Can't use this folder, Permission Denied. Please select another folder." +msgstr "" + +#: admin/fileadmin.py:73 +msgid "Advanced" +msgstr "Avansert" + +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Element må vere vald for å utføre handlingar på dei. Ingen element vart " +"endra." + +#: admin/folderadmin.py:434 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s vald" +msgstr[1] "Alle %(total_count)s vald" + +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "" + +#: admin/folderadmin.py:475 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 av %(cnt)s vald" + +#: admin/folderadmin.py:612 +msgid "No action selected." +msgstr "Ingen handling vald." + +#: admin/folderadmin.py:664 +#, python-format +msgid "Successfully moved %(count)d files to clipboard." +msgstr "Flytta %(count)d filer til utklippstavla." + +#: admin/folderadmin.py:669 +msgid "Move selected files to clipboard" +msgstr "Flytt valde filer til utklippstavla" + +#: admin/folderadmin.py:709 +#, python-format +msgid "Successfully disabled permissions for %(count)d files." +msgstr "Fjerna løyve for %(count)d filer." + +#: admin/folderadmin.py:711 +#, python-format +msgid "Successfully enabled permissions for %(count)d files." +msgstr "Satte løyve for %(count)d filer." + +#: admin/folderadmin.py:719 +msgid "Enable permissions for selected files" +msgstr "Sett løyve for valde filer" + +#: admin/folderadmin.py:725 +msgid "Disable permissions for selected files" +msgstr "Fjern løyve for valde filer" + +#: admin/folderadmin.py:789 +#, python-format +msgid "Successfully deleted %(count)d files and/or folders." +msgstr "Sletta %(count)d filer og/eller mapper." + +#: admin/folderadmin.py:794 +msgid "Cannot delete files and/or folders" +msgstr "Kan ikkje slette filer og/eller mapper" + +#: admin/folderadmin.py:796 +msgid "Are you sure?" +msgstr "Er du sikker?" + +#: admin/folderadmin.py:802 +msgid "Delete files and/or folders" +msgstr "Slett filer og/eller mapper" + +#: admin/folderadmin.py:823 +msgid "Delete selected files and/or folders" +msgstr "Slett valde filer og/eller mapper" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "" + +#: admin/folderadmin.py:934 +#, python-format +msgid "" +"Successfully moved %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "Flytta %(count)d filer og/eller mapper til mappa \"%(destination)s\"." + +#: admin/folderadmin.py:942 admin/folderadmin.py:944 +msgid "Move files and/or folders" +msgstr "Flytt filer og/eller mapper" + +#: admin/folderadmin.py:959 +msgid "Move selected files and/or folders" +msgstr "Flytt valde filer og/eller mapper" + +#: admin/folderadmin.py:1016 +#, python-format +msgid "Successfully renamed %(count)d files." +msgstr "Endra namn på %(count)d filer." + +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 +msgid "Rename files" +msgstr "Endre namn på filer" + +#: admin/folderadmin.py:1137 +#, python-format +msgid "" +"Successfully copied %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" +"Kopierte %(count)d filer og/eller mapper til mappa \"%(destination)s\"." + +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 +msgid "Copy files and/or folders" +msgstr "Kopier filer og/eller mapper" + +#: admin/folderadmin.py:1174 +msgid "Copy selected files and/or folders" +msgstr "Kopier valde filer og/eller mapper" + +#: admin/folderadmin.py:1279 +#, python-format +msgid "Successfully resized %(count)d images." +msgstr "Endra storleik på %(count)d bilete." + +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 +msgid "Resize images" +msgstr "Endre storleik på bilete" + +#: admin/folderadmin.py:1303 +msgid "Resize selected images" +msgstr "Endre storleik på valde bilete" + +#: admin/forms.py:24 +msgid "Suffix which will be appended to filenames of copied files." +msgstr "Ending som vert tilføyd filnamn på kopierte filer." + +#: admin/forms.py:31 +#, python-format +msgid "" +"Suffix should be a valid, simple and lowercase filename part, like " +"\"%(valid)s\"." +msgstr "" +"Ending bør vere ein gyldig, enkel del av filnamnet med små bokstavar, som " +"\"%(valid)s\"." + +#: admin/forms.py:52 +#, python-format +msgid "Unknown rename format value key \"%(key)s\"." +msgstr "Ugyldig nykel \"%(key)s\" for endring av namn." + +#: admin/forms.py:54 +#, python-format +msgid "Invalid rename format: %(error)s." +msgstr "Ugyldig format for endring av namn: %(error)s" + +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 +msgid "thumbnail option" +msgstr "miniatyrbileteval" + +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 +msgid "width" +msgstr "breidd" + +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 +msgid "height" +msgstr "høgd" + +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 +msgid "crop" +msgstr "skjering" + +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 +msgid "upscale" +msgstr "oppskalering" + +#: admin/forms.py:79 +msgid "Thumbnail option or resize parameters must be choosen." +msgstr "Miniatyrbileteval eller parametrar for endring av storleik må veljast." + +#: admin/imageadmin.py:20 admin/imageadmin.py:112 +msgid "Subject location" +msgstr "Fokuseringsområde" + +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "" + +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "" + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "" + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "" + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" +msgstr "" + +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" +msgstr "" + +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "Ein mappe med dette namnet eksisterer allereie." + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "Filer" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "" + +#: models/abstract.py:62 +msgid "default alt text" +msgstr "standard alternativtekst" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "standard undertekst" + +#: models/abstract.py:76 +msgid "subject location" +msgstr "fokuseringsområde" + +#: models/abstract.py:91 +msgid "image" +msgstr "bilete" + +#: models/abstract.py:92 +msgid "images" +msgstr "bilete" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "" + +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." +msgstr "" + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 +msgid "user" +msgstr "brukar" + +#: models/clipboardmodels.py:17 models/filemodels.py:157 +msgid "files" +msgstr "filer" + +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 +msgid "clipboard" +msgstr "utklippstavle" + +#: models/clipboardmodels.py:25 +msgid "clipboards" +msgstr "utklippstavler" + +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 +msgid "file" +msgstr "fil" + +#: models/clipboardmodels.py:56 +msgid "clipboard item" +msgstr "element på utklippstavle" + +#: models/clipboardmodels.py:57 +msgid "clipboard items" +msgstr "element på utklippstavle" + +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "folder" +msgstr "mappe" + +#: models/filemodels.py:81 +msgid "file size" +msgstr "filstorleik" + +#: models/filemodels.py:87 +msgid "sha1" +msgstr "sha1" + +#: models/filemodels.py:94 +msgid "has all mandatory data" +msgstr "har alle påkravde data" + +#: models/filemodels.py:100 +msgid "original filename" +msgstr "originalt filnamn" + +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 +msgid "name" +msgstr "namn" + +#: models/filemodels.py:116 +msgid "description" +msgstr "beskriving" + +#: models/filemodels.py:125 models/foldermodels.py:108 +msgid "owner" +msgstr "eigar" + +#: models/filemodels.py:129 models/foldermodels.py:116 +msgid "uploaded at" +msgstr "lasta opp" + +#: models/filemodels.py:134 models/foldermodels.py:126 +msgid "modified at" +msgstr "endra" + +#: models/filemodels.py:140 +msgid "Permissions disabled" +msgstr "Løyve er deaktivert" + +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "" + +#: models/foldermodels.py:94 +msgid "parent" +msgstr "" + +#: models/foldermodels.py:121 +msgid "created at" +msgstr "oppretta" + +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Folder" +msgstr "Mappe" + +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 +msgid "Folders" +msgstr "Mapper" + +#: models/foldermodels.py:260 +msgid "all items" +msgstr "alle element" + +#: models/foldermodels.py:261 +msgid "this item only" +msgstr "berre dette elementet" + +#: models/foldermodels.py:262 +msgid "this item and all children" +msgstr "dette elementet og alle underliggjande nivå" + +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "" + +#: models/foldermodels.py:280 +msgid "type" +msgstr "type" + +#: models/foldermodels.py:297 +msgid "group" +msgstr "gruppe" + +#: models/foldermodels.py:304 +msgid "everybody" +msgstr "alle" + +#: models/foldermodels.py:309 +msgid "can read" +msgstr "kan lese" + +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "kan redigere" + +#: models/foldermodels.py:325 +msgid "can add children" +msgstr "kan leggje til undernivå" + +#: models/foldermodels.py:333 +msgid "folder permission" +msgstr "løyve for mappe" + +#: models/foldermodels.py:334 +msgid "folder permissions" +msgstr "løyve for mappe" + +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." +msgstr "" + +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." +msgstr "" + +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." +msgstr "" + +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." +msgstr "" + +#: models/foldermodels.py:360 +msgid "All Folders" +msgstr "" + +#: models/foldermodels.py:362 +msgid "Logical Path" +msgstr "" + +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" +msgstr "" + +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" +msgstr "" + +#: models/foldermodels.py:375 +msgid "Everybody" +msgstr "" + +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "" + +#: models/foldermodels.py:389 +msgid "Read" +msgstr "" + +#: models/foldermodels.py:390 +msgid "Add children" +msgstr "" + +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "dato biletet vert tatt" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "opphavsperson" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "må alltid publisere opphavsperson" + +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "må alltid publisere opphavsrett" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "" + +#: models/virtualitems.py:73 +msgid "files with missing metadata" +msgstr "filer med manglande metadata" + +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "root" +msgstr "rot" + +#: settings.py:273 +msgid "Show table view" +msgstr "" + +#: settings.py:278 +msgid "Show thumbnail view" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Run the selected action" +msgstr "Utfør den valde handlinga" + +#: templates/admin/filer/actions.html:5 +msgid "Go" +msgstr "Utfør" + +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +msgid "Click here to select the objects across all pages" +msgstr "Klikk her for å velje objekt på tvers av alle sider" + +#: templates/admin/filer/actions.html:14 +#, python-format +msgid "Select all %(total_count)s files and/or folders" +msgstr "Vel alle %(total_count)s filer og/eller mapper" + +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 +msgid "Clear selection" +msgstr "Tøm utval" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 +msgid "Go back to admin homepage" +msgstr "Gå tilbake til administrasjonssida" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 +msgid "Home" +msgstr "Heim" + +#: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 +msgid "Go back to Filer app" +msgstr "Gå tilbake til Filer" + +#: templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Go back to root folder" +msgstr "Gå tilbake til rotmappa" + +#: templates/admin/filer/breadcrumbs.html:8 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 +#, python-format +msgid "Go back to '%(folder_name)s' folder" +msgstr "Gå tilbake til mappa \"%(folder_name)s\"" + +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:11 +msgid "" +"Deleting the selected files and/or folders would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Å slette dei valde filene og/eller mappene ville resultere i sletting av " +"relaterte objekt, men din konto har ikkje løyve til å slette objekt av " +"følgjande typer:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:19 +msgid "" +"Deleting the selected files and/or folders would require deleting the " +"following protected related objects:" +msgstr "" +"Å slette dei valde filene og/eller mappene ville kreve å slette følgjande " +"beskytta relaterte objekt:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:27 +msgid "" +"Are you sure you want to delete the selected files and/or folders? All of " +"the following objects and their related items will be deleted:" +msgstr "" +"Er du sikker på at du vil slette dei valde filene og/eller mappene? Alle dei " +"følgjande objekta og deira relaterte element vil verte sletta:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "" + +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 +msgid "History" +msgstr "Historie" + +#: templates/admin/filer/file/change_form.html:37 +#: templates/admin/filer/folder/change_form.html:23 +#: templates/admin/filer/image/change_form.html:37 +msgid "View on site" +msgstr "Se på nettstaden" + +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "Gå tilbake til" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "administrasjonssida" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 +msgid "Folder Icon" +msgstr "Mappeikon" + +#: templates/admin/filer/folder/choose_copy_destination.html:23 +msgid "" +"Your account doesn't have permissions to copy all of the selected files and/" +"or folders." +msgstr "" +"Din konto har ikkje løyve til å kopiere alle dei valde filene og/eller " +"mappene." + +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 +msgid "There are no destination folders available." +msgstr "Det er ingen målmapper tilgjengelig." + +#: templates/admin/filer/folder/choose_copy_destination.html:35 +msgid "There are no files and/or folders available to copy." +msgstr "Det er ingen filer og/eller mapper å kopiere." + +#: templates/admin/filer/folder/choose_copy_destination.html:40 +msgid "" +"The following files and/or folders will be copied to a destination folder " +"(retaining their tree structure):" +msgstr "" +"Dei følgjande filene og/eller mappene vil verte kopiert til ein målmappe " +"(mappestruktur vil behaldes):" + +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 +msgid "Destination folder:" +msgstr "Målmappe:" + +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 +msgid "Copy" +msgstr "Kopier" + +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 +msgid "" +"Your account doesn't have permissions to resize all of the selected images." +msgstr "Din konto har ikkje løyve til å endre storleik på alle valde bilete." + +#: templates/admin/filer/folder/choose_images_resize_options.html:18 +msgid "There are no images available to resize." +msgstr "Det er ingen bilete å endre storleik på." + +#: templates/admin/filer/folder/choose_images_resize_options.html:20 +msgid "The following images will be resized:" +msgstr "Dei følgjande bileta vil få endra storleik:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:32 +msgid "Choose an existing thumbnail option or enter resize parameters:" +msgstr "" +"Vel eit eksisterande miniatyrbileteval eller skriv inn parametrar for " +"endring av storleik:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:36 +msgid "" +"Warning: Images will be resized in-place and originals will be lost. Maybe " +"first make a copy of them to retain the originals." +msgstr "" +"Åtvaring: Bileta vil få sin storleik endra, og originalane vil gå tapt. Det " +"kan være ønskjeleg å først gjere ein kopi for å behalde originalane." + +#: templates/admin/filer/folder/choose_images_resize_options.html:39 +msgid "Resize" +msgstr "Endre storleik" + +#: templates/admin/filer/folder/choose_move_destination.html:35 +msgid "" +"Your account doesn't have permissions to move all of the selected files and/" +"or folders." +msgstr "" +"Din konto har ikke løyve til å flytte alle dei valde filene og/eller mappene." + +#: templates/admin/filer/folder/choose_move_destination.html:47 +msgid "There are no files and/or folders available to move." +msgstr "Det er ingen filer og/eller mapper å flytte." + +#: templates/admin/filer/folder/choose_move_destination.html:52 +msgid "" +"The following files and/or folders will be moved to a destination folder " +"(retaining their tree structure):" +msgstr "" +"Dei følgjande filene og/eller mappene vil verte flytta til ein målmappe " +"(mappestruktur vil behaldes):" + +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 +msgid "Move" +msgstr "Flytt" + +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:15 +msgid "" +"Your account doesn't have permissions to rename all of the selected files." +msgstr "Din konto har ikkje løyve til å endre namn på alle dei valde filene." + +#: templates/admin/filer/folder/choose_rename_format.html:18 +msgid "There are no files available to rename." +msgstr "Det er ingen filer å endre namn på." + +#: templates/admin/filer/folder/choose_rename_format.html:20 +msgid "" +"The following files will be renamed (they will stay in their folders and " +"keep original filename, only displayed filename will be changed):" +msgstr "" +"Dei følgjande filene vil få endra namn (dei vil framleis vere på samme stad " +"og behalde originalt filnamn, berre visningsnamn vil verte endra):" + +#: templates/admin/filer/folder/choose_rename_format.html:59 +msgid "Rename" +msgstr "Endre namn" + +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "Gå tilbake til overordna nivå" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "Endre detaljar for gjeldande mappe" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "Endre" + +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "Søk" + +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "Slett" + +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "Legg til ein ny mappe" + +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "Ny mappe" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:16 +msgid "Name" +msgstr "Namn" + +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "Eigar" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 +#, python-format +msgid "Change '%(item_label)s' folder details" +msgstr "Endre detaljar for mappen \"%(item_label)s\"" + +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "" +msgstr[1] "" + +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "" +msgstr[1] "" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 +msgid "Select this file" +msgstr "Vel denne filen" + +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 +#, python-format +msgid "Change '%(item_label)s' details" +msgstr "Endre detaljar for \"%(item_label)s\"" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "Permissions" +msgstr "Løyve" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "disabled" +msgstr "deaktivert" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "enabled" +msgstr "aktivert" + +#: templates/admin/filer/folder/directory_table_list.html:144 +#, fuzzy +#| msgid "Move selected files to clipboard" +msgid "URL copied to clipboard" +msgstr "Flytt valde filer til utklippstavla" + +#: templates/admin/filer/folder/directory_table_list.html:147 +#, python-format +msgid "Canonical url '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:151 +#, python-format +msgid "Download '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "Last opp" + +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 +msgid "previous" +msgstr "førre" + +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 +#, python-format +msgid "Page %(number)s of %(num_pages)s." +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 +msgid "next" +msgstr "neste" + +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +msgid "Select all" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +msgid "Files" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +msgid "Add new" +msgstr "Legg til ny" + +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:15 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Ver venleg og rett feilen under" +msgstr[1] "Ver venleg og rett feila under." + +#: templates/admin/filer/folder/new_folder_form.html:30 +msgid "Save" +msgstr "Lagre" + +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "Utklippstavle" + +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "Lim inn alle element her" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "Flytt alle filer på utklippstavla til" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "utklippstavla er tom" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "feil ved opplasting" + +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +msgid "File is missing" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "found" +msgstr "funne" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "and" +msgstr "og" + +#: templates/admin/filer/tools/search_form.html:7 +msgid "cancel search" +msgstr "avbryt søk" + +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "Tøm" + +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "ingen fil vald" + +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "Slå opp" + +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "" + +#: templates/admin/filer/widgets/admin_folder.html:16 +msgid "Choose Folder" +msgstr "" + +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" +msgstr "" + +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" +msgstr "" + +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" +msgstr "" + +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" +msgstr "" + +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" +msgstr "" + +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." + +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" + +#~ msgid "Open file" +#~ msgstr "Open file" + +#~ msgid "Full size preview" +#~ msgstr "Full size preview" + +#~ msgid "Add Description" +#~ msgstr "Add Description" + +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" + +#~ msgid "none selected" +#~ msgstr "none selected" + +#~ msgid "Add Folder" +#~ msgstr "Add Folder" + +#~ msgid "Subject Location" +#~ msgstr "Subject location" + +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" +#~ msgstr[1] "15c0f2d28d6dab1af1f6d94906beb627_pl_1" + +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/pl/LC_MESSAGES/django.mo b/filer/locale/pl/LC_MESSAGES/django.mo index 6307dfc78..99ec9f2ea 100644 Binary files a/filer/locale/pl/LC_MESSAGES/django.mo and b/filer/locale/pl/LC_MESSAGES/django.mo differ diff --git a/filer/locale/pl/LC_MESSAGES/django.po b/filer/locale/pl/LC_MESSAGES/django.po index 955e1f67c..1f59250c7 100644 --- a/filer/locale/pl/LC_MESSAGES/django.po +++ b/filer/locale/pl/LC_MESSAGES/django.po @@ -3,485 +3,636 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: -# crunchorn , 2010. +# Translators: +# Translators: +# crunchorn , 2010 +# Grzegorz Biały , 2017 +# Mateusz Marzantowicz , 2013 +# Piotr Wojcik , 2016 msgid "" msgstr "" -"Project-Id-Version: django-filer\n" +"Project-Id-Version: django Filer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-07-13 19:10+0200\n" -"PO-Revision-Date: 2012-09-03 20:12+0100\n" -"Last-Translator: Stefan Foulis \n" -"Language-Team: LANGUAGE \n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: Grzegorz Biały , 2017\n" +"Language-Team: Polish (http://app.transifex.com/divio/django-filer/language/" +"pl/)\n" +"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=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " -"|| n%100>=20) ? 1 : 2);\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" -#: views.py:103 -msgid "Folder with this name already exists." +#: admin/clipboardadmin.py:17 +msgid "You do not have permission to upload files." msgstr "" -#: admin/fileadmin.py:41 +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "" + +#: admin/clipboardadmin.py:20 +msgid "Can't use this folder, Permission Denied. Please select another folder." +msgstr "" + +#: admin/fileadmin.py:73 msgid "Advanced" msgstr "Zaawansowane" -#: admin/folderadmin.py:324 admin/folderadmin.py:427 +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "kanoniczny URL" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 msgid "" "Items must be selected in order to perform actions on them. No items have " "been changed." msgstr "" +"Należy zaznaczyć elementy aby wykonań na nich jakąś akcję. Nie zaznaczono " +"żadnych elementów." -#: admin/folderadmin.py:344 +#: admin/folderadmin.py:434 #, python-format msgid "%(total_count)s selected" msgid_plural "All %(total_count)s selected" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "zaznaczono %(total_count)s" +msgstr[1] "zaznaczono %(total_count)s" +msgstr[2] "Zaznaczono wszystkie %(total_count)s" +msgstr[3] "Zaznaczono wszystkie %(total_count)s" -#: admin/folderadmin.py:377 +#: admin/folderadmin.py:460 #, python-format -msgid "0 of %(cnt)s selected" +msgid "Directory listing for %(folder_name)s" msgstr "" -#: admin/folderadmin.py:456 +#: admin/folderadmin.py:475 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 z %(cnt)s zaznaczonych" + +#: admin/folderadmin.py:612 msgid "No action selected." -msgstr "" +msgstr "Nie zaznaczono akcji." -#: admin/folderadmin.py:497 +#: admin/folderadmin.py:664 #, python-format msgid "Successfully moved %(count)d files to clipboard." -msgstr "" +msgstr "Pomyślnie przeniesiono %(count)d plików do schowka." -#: admin/folderadmin.py:503 +#: admin/folderadmin.py:669 msgid "Move selected files to clipboard" -msgstr "" +msgstr "Przenieś zaznaczone pliki do schowka" -#: admin/folderadmin.py:537 +#: admin/folderadmin.py:709 #, python-format msgid "Successfully disabled permissions for %(count)d files." -msgstr "" +msgstr "Pomyślnie wyłączono uprawnienia dla %(count)d plików." -#: admin/folderadmin.py:541 +#: admin/folderadmin.py:711 #, python-format msgid "Successfully enabled permissions for %(count)d files." -msgstr "" +msgstr "Pomyślnie włączono uprawnienia dla %(count)d plików." -#: admin/folderadmin.py:550 +#: admin/folderadmin.py:719 msgid "Enable permissions for selected files" -msgstr "" +msgstr "Włącz uprawnienia dla wybranych plików" -#: admin/folderadmin.py:555 +#: admin/folderadmin.py:725 msgid "Disable permissions for selected files" -msgstr "" +msgstr "Wyłącz uprawnienia dla wybranych plików" -#: admin/folderadmin.py:623 +#: admin/folderadmin.py:789 #, python-format msgid "Successfully deleted %(count)d files and/or folders." -msgstr "" +msgstr "Pomyślnie usunięto %(count)d plików i/lub katalogów." -#: admin/folderadmin.py:630 +#: admin/folderadmin.py:794 msgid "Cannot delete files and/or folders" -msgstr "" +msgstr "Nie można usunąć plików i/lub katalogów" -#: admin/folderadmin.py:632 +#: admin/folderadmin.py:796 msgid "Are you sure?" -msgstr "" +msgstr "Czy na pewno?" -#: admin/folderadmin.py:637 +#: admin/folderadmin.py:802 msgid "Delete files and/or folders" -msgstr "" +msgstr "Usuń pliki i/lub katalogi" -#: admin/folderadmin.py:656 +#: admin/folderadmin.py:823 msgid "Delete selected files and/or folders" -msgstr "" +msgstr "Usuń zaznaczone pliki i/lub katalogi" -#: admin/folderadmin.py:771 +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "Katalogi z nazwami %s już istnieją w podanej lokacji" + +#: admin/folderadmin.py:934 #, python-format msgid "" "Successfully moved %(count)d files and/or folders to folder " "'%(destination)s'." msgstr "" +"Pomyślnie przeniesiono %(count)d plików i/lub katalogów do '%(destination)s'." -#: admin/folderadmin.py:778 admin/folderadmin.py:780 +#: admin/folderadmin.py:942 admin/folderadmin.py:944 msgid "Move files and/or folders" -msgstr "" +msgstr "Przenieś pliki i/lub katalogi" -#: admin/folderadmin.py:797 +#: admin/folderadmin.py:959 msgid "Move selected files and/or folders" -msgstr "" +msgstr "Przenieś zaznaczone pliki i/lub katalogi" -#: admin/folderadmin.py:854 +#: admin/folderadmin.py:1016 #, python-format msgid "Successfully renamed %(count)d files." -msgstr "" +msgstr "Pomyślnie zmieniono nazwę %(count)d plików." -#: admin/folderadmin.py:862 admin/folderadmin.py:864 admin/folderadmin.py:881 +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 msgid "Rename files" -msgstr "" +msgstr "Zmień nazwy plików" -#: admin/folderadmin.py:975 +#: admin/folderadmin.py:1137 #, python-format msgid "" "Successfully copied %(count)d files and/or folders to folder " "'%(destination)s'." msgstr "" +"Pomyślnie skopiowano %(count)d plików i/lub katalogów di '%(destination)s'." -#: admin/folderadmin.py:989 admin/folderadmin.py:991 +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 msgid "Copy files and/or folders" -msgstr "" +msgstr "Skopiuj pliki i/lub katalogi" -#: admin/folderadmin.py:1010 +#: admin/folderadmin.py:1174 msgid "Copy selected files and/or folders" -msgstr "" +msgstr "Skopiuj zaznaczone pliki i/lub katalogi" -#: admin/folderadmin.py:1105 +#: admin/folderadmin.py:1279 #, python-format msgid "Successfully resized %(count)d images." -msgstr "" +msgstr "Pomyślnie zmieniono rozmiar %(count)d obrazów." -#: admin/folderadmin.py:1113 admin/folderadmin.py:1115 +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 msgid "Resize images" -msgstr "" +msgstr "Zmień rozmiar obrazów" -#: admin/folderadmin.py:1133 +#: admin/folderadmin.py:1303 msgid "Resize selected images" -msgstr "" +msgstr "Zmień rozmiar zaznaczonych obrazów" -#: admin/forms.py:26 +#: admin/forms.py:24 msgid "Suffix which will be appended to filenames of copied files." -msgstr "" +msgstr "Przyrostek, który zostanie dodany do nazw skopiowanych plików." -#: admin/forms.py:33 +#: admin/forms.py:31 #, python-format msgid "" "Suffix should be a valid, simple and lowercase filename part, like " "\"%(valid)s\"." msgstr "" +"Przyrostek powinien być poprawną, prostą, składającą się z małych liter " +"częścią nazwy pliku, np. \"%(valid)s\"" -#: admin/forms.py:54 +#: admin/forms.py:52 #, python-format msgid "Unknown rename format value key \"%(key)s\"." -msgstr "" +msgstr "Nieznany format klucza \"%(key)s\"." -#: admin/forms.py:56 +#: admin/forms.py:54 #, python-format msgid "Invalid rename format: %(error)s." -msgstr "" +msgstr "Niepoprawny format: %(error)s." -#: admin/forms.py:62 +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 msgid "thumbnail option" -msgstr "" +msgstr "opcje miniatur" -#: admin/forms.py:63 +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 msgid "width" -msgstr "" +msgstr "szerokość" -#: admin/forms.py:64 +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 msgid "height" -msgstr "" +msgstr "wysokość" -#: admin/forms.py:65 +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 msgid "crop" -msgstr "" +msgstr "przytnij" -#: admin/forms.py:66 +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 msgid "upscale" -msgstr "" +msgstr "skaluj" -#: admin/forms.py:71 +#: admin/forms.py:79 msgid "Thumbnail option or resize parameters must be choosen." +msgstr "Opcja miniatury albo parametry zmiany rozmiaru muszą być określone." + +#: admin/imageadmin.py:20 admin/imageadmin.py:112 +msgid "Subject location" +msgstr "Współrzędne obiektu" + +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "Współrzędne głównego obiektu prezentowanej sceny. Format: \"x,y\"." + +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "Niepoprawny format współrzędnych obiektu." + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "Współrzędne obiektu znajdują się poza obrazem." + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "Twój wpis: \"{subject_location}\"." + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" msgstr "" -#: admin/forms.py:73 -msgid "Resize parameters must be choosen." +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" msgstr "" -#: admin/imageadmin.py:12 -msgid "Subject location" +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "Katalog o podanej nazwie już istnieje." + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "Filer" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "Biblioteka mediów" + +#: models/abstract.py:62 +msgid "default alt text" +msgstr "domyślny tekst alternatywny" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "domyślna etykieta" + +#: models/abstract.py:76 +msgid "subject location" msgstr "Współrzędne obiektu" -#: admin/imageadmin.py:13 -msgid "Location of the main subject of the scene." -msgstr "Współrzędne głownego obiektu prezentowanej sceny" +#: models/abstract.py:91 +msgid "image" +msgstr "obraz" -#: models/clipboardmodels.py:9 models/foldermodels.py:236 +#: models/abstract.py:92 +msgid "images" +msgstr "obrazy" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "" + +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." +msgstr "" + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 msgid "user" msgstr "użytkownik" -#: models/clipboardmodels.py:11 models/filemodels.py:287 +#: models/clipboardmodels.py:17 models/filemodels.py:157 msgid "files" -msgstr "" +msgstr "pliki" -#: models/clipboardmodels.py:34 models/clipboardmodels.py:40 +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 msgid "clipboard" -msgstr "" +msgstr "schowek" -#: models/clipboardmodels.py:35 +#: models/clipboardmodels.py:25 msgid "clipboards" -msgstr "" +msgstr "schowki" -#: models/clipboardmodels.py:39 models/filemodels.py:35 -#: models/filemodels.py:286 +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 msgid "file" -msgstr "" +msgstr "plik" -#: models/clipboardmodels.py:44 +#: models/clipboardmodels.py:56 msgid "clipboard item" -msgstr "" +msgstr "element schowka" -#: models/clipboardmodels.py:45 +#: models/clipboardmodels.py:57 msgid "clipboard items" -msgstr "" +msgstr "elementy schowka" -#: models/filemodels.py:33 templates/admin/filer/folder/change_form.html:9 -#: templates/admin/filer/folder/directory_listing.html:74 +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 #: templates/admin/filer/folder/new_folder_form.html:4 -#: templates/admin/filer/tools/clipboard/clipboard.html:26 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 msgid "folder" msgstr "katalog" -#: models/filemodels.py:36 +#: models/filemodels.py:81 msgid "file size" -msgstr "" +msgstr "rozmiar pliku" -#: models/filemodels.py:38 +#: models/filemodels.py:87 msgid "sha1" -msgstr "" +msgstr "sha1" -#: models/filemodels.py:40 +#: models/filemodels.py:94 msgid "has all mandatory data" -msgstr "" +msgstr "posiada wszystkie potrzebne dane" -#: models/filemodels.py:42 +#: models/filemodels.py:100 msgid "original filename" -msgstr "" +msgstr "oryginalna nazwa pliku" -#: models/filemodels.py:44 models/foldermodels.py:99 +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 msgid "name" -msgstr "" +msgstr "nazwa" -#: models/filemodels.py:46 +#: models/filemodels.py:116 msgid "description" -msgstr "" +msgstr "opis" -#: models/filemodels.py:50 +#: models/filemodels.py:125 models/foldermodels.py:108 msgid "owner" -msgstr "" +msgstr "właściciel" -#: models/filemodels.py:52 models/foldermodels.py:105 +#: models/filemodels.py:129 models/foldermodels.py:116 msgid "uploaded at" -msgstr "" +msgstr "zaktualizowano" -#: models/filemodels.py:53 models/foldermodels.py:108 +#: models/filemodels.py:134 models/foldermodels.py:126 msgid "modified at" -msgstr "" +msgstr "zmieniono" -#: models/filemodels.py:57 +#: models/filemodels.py:140 msgid "Permissions disabled" +msgstr "Uprawnienia wyłączone" + +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." msgstr "" +"Wyłącz jakiekolwiek sprawdzanie uprawnień dla tego pliku. Plik będzie " +"dostępny publicznie dla wszystkich." -#: models/filemodels.py:58 -msgid "Disable any permission checking for this " +#: models/foldermodels.py:94 +msgid "parent" msgstr "" -#: models/foldermodels.py:107 +#: models/foldermodels.py:121 msgid "created at" -msgstr "" +msgstr "utworzono" -#: models/foldermodels.py:211 -#: templates/admin/filer/widgets/admin_folder.html:3 -#: templates/admin/filer/widgets/admin_folder.html:5 +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 msgid "Folder" -msgstr "" +msgstr "Katalog" -#: models/foldermodels.py:212 +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 msgid "Folders" msgstr "Katalogi" -#: models/foldermodels.py:227 +#: models/foldermodels.py:260 msgid "all items" msgstr "wszystkie elementy" -#: models/foldermodels.py:228 +#: models/foldermodels.py:261 msgid "this item only" -msgstr "tylko ten katalog" +msgstr "tylko ten element" -#: models/foldermodels.py:229 +#: models/foldermodels.py:262 msgid "this item and all children" msgstr "ten katalog i wszystkie podrzędne" -#: models/foldermodels.py:233 +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "zezwól" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "zabroń" + +#: models/foldermodels.py:280 msgid "type" msgstr "typ" -#: models/foldermodels.py:239 +#: models/foldermodels.py:297 msgid "group" msgstr "grupa" -#: models/foldermodels.py:240 +#: models/foldermodels.py:304 msgid "everybody" msgstr "wszyscy" -#: models/foldermodels.py:242 -msgid "can edit" -msgstr "może edytować" - -#: models/foldermodels.py:243 +#: models/foldermodels.py:309 msgid "can read" msgstr "może wyświetlić" -#: models/foldermodels.py:244 +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "może edytować" + +#: models/foldermodels.py:325 msgid "can add children" -msgstr "może dodawać el. podrzędne" +msgstr "może dodawać elementy podrzędne" -#: models/foldermodels.py:273 +#: models/foldermodels.py:333 msgid "folder permission" -msgstr "" +msgstr "uprawnienie katalogu" -#: models/foldermodels.py:274 +#: models/foldermodels.py:334 msgid "folder permissions" +msgstr "uprawnienia katalogu" + +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." msgstr "" -#: models/imagemodels.py:39 -msgid "date taken" -msgstr "Data wykonania" +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." +msgstr "" -#: models/imagemodels.py:42 -msgid "default alt text" +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." msgstr "" -#: models/imagemodels.py:43 -msgid "default caption" +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." msgstr "" -#: models/imagemodels.py:45 templates/image_filer/image.html:6 -msgid "author" -msgstr "autor" +#: models/foldermodels.py:360 +msgid "All Folders" +msgstr "" -#: models/imagemodels.py:47 -msgid "must always publish author credit" +#: models/foldermodels.py:362 +msgid "Logical Path" msgstr "" -#: models/imagemodels.py:48 -msgid "must always publish copyright" +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" msgstr "" -#: models/imagemodels.py:50 -msgid "subject location" +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" msgstr "" -#: models/imagemodels.py:200 -msgid "image" +#: models/foldermodels.py:375 +msgid "Everybody" msgstr "" -#: models/imagemodels.py:201 -msgid "images" +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "" + +#: models/foldermodels.py:389 +msgid "Read" +msgstr "" + +#: models/foldermodels.py:390 +msgid "Add children" msgstr "" -#: models/virtualitems.py:45 -#: templates/admin/filer/tools/clipboard/clipboard.html:26 -msgid "unfiled files" -msgstr "Luźne pliki" +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "data wykonania" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "autor" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "musi zawsze opublikować udział autora" -#: models/virtualitems.py:59 +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "musi zawsze opublikować prawa autorskie" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "szerokość w pikselach" + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "wysokość w pikselach" + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "opcje miniatur" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "Nieuporządkowane Przesłane" + +#: models/virtualitems.py:73 msgid "files with missing metadata" -msgstr "pliki z wybrakowanymi metadanymi" +msgstr "pliki z brakującymi metadanymi" -#: models/virtualitems.py:73 templates/admin/filer/breadcrumbs.html:6 -#: templates/admin/filer/folder/change_form.html:9 -#: templates/admin/filer/folder/directory_listing.html:74 -#: templates/image_filer/image_export_form.html:10 +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 msgid "root" msgstr "Katalog główny" -#: templates/admin/filer/actions.html:4 -msgid "Run the selected action" +#: settings.py:273 +msgid "Show table view" msgstr "" -#: templates/admin/filer/actions.html:4 -msgid "Go" +#: settings.py:278 +msgid "Show thumbnail view" msgstr "" -#: templates/admin/filer/actions.html:11 +#: templates/admin/filer/actions.html:5 +msgid "Run the selected action" +msgstr "Wykonaj wybraną akcję" + +#: templates/admin/filer/actions.html:5 +msgid "Go" +msgstr "Idź" + +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 msgid "Click here to select the objects across all pages" -msgstr "" +msgstr "Kliknij tutaj aby zaznaczyć obiekty na wszystkich stronach" -#: templates/admin/filer/actions.html:11 +#: templates/admin/filer/actions.html:14 #, python-format msgid "Select all %(total_count)s files and/or folders" -msgstr "" +msgstr "Zaznacz wszystkie %(total_count)s pliki i/lub katalogi" -#: templates/admin/filer/actions.html:13 +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 msgid "Clear selection" -msgstr "" +msgstr "Wyczyść zaznaczenie" #: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 msgid "Go back to admin homepage" msgstr "Wróć do panelu administracyjnego" #: templates/admin/filer/breadcrumbs.html:4 -#: templates/admin/filer/folder/change_form.html:7 -#: templates/image_filer/image_export_form.html:7 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 msgid "Home" msgstr "Początek" #: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 msgid "Go back to Filer app" msgstr "Wróć do aplikacji Filer" -#: templates/admin/filer/breadcrumbs.html:5 -#: templates/admin/filer/folder/change_form.html:8 -#: templates/image_filer/image_export_form.html:8 -msgid "Filer" -msgstr "Filer" - #: templates/admin/filer/breadcrumbs.html:6 -#: templates/image_filer/image_export_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:35 msgid "Go back to root folder" msgstr "Wróć do katalogu głównego" #: templates/admin/filer/breadcrumbs.html:8 -#: templates/admin/filer/breadcrumbs.html:11 -#: templates/admin/filer/folder/change_form.html:11 -#: templates/image_filer/image_export_form.html:12 -#: templates/image_filer/image_export_form.html:14 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 #, python-format msgid "Go back to '%(folder_name)s' folder" msgstr "Przejdź do katalogu '%(folder_name)s'" -#: templates/admin/filer/change_form.html:28 -msgid "duplicates" -msgstr "" - -#: templates/admin/filer/delete_confirmation.html:13 -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#: templates/admin/filer/delete_confirmation.html:21 -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#: templates/admin/filer/delete_confirmation.html:29 -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -#: templates/admin/filer/delete_confirmation.html:34 -#: templates/admin/filer/delete_selected_files_confirmation.html:45 -msgid "Yes, I'm sure" -msgstr "" +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "Duplikaty" #: templates/admin/filer/delete_selected_files_confirmation.html:11 msgid "" @@ -489,402 +640,636 @@ msgid "" "objects, but your account doesn't have permission to delete the following " "types of objects:" msgstr "" +"Usunięcie zaznaczonych plików i/lub katalogów spowoduje usunięcie " +"powiązanych obiektów, niestety Twoje konto nie posiada uprawnień do " +"usunięcia następujących typów obiektów:" #: templates/admin/filer/delete_selected_files_confirmation.html:19 msgid "" "Deleting the selected files and/or folders would require deleting the " "following protected related objects:" msgstr "" +"Usunięcie zaznaczonych plików i/lub katalogów wymaga usunięcia następujących " +"chronionych obiektów powiązanych:" #: templates/admin/filer/delete_selected_files_confirmation.html:27 msgid "" "Are you sure you want to delete the selected files and/or folders? All of " "the following objects and their related items will be deleted:" msgstr "" +"Czy na pewno chcesz usunąć zaznaczone pliki i/lub katalogi? Następujące " +"obiekty oraz powiązane z nimi elementy zostaną usunięte:" -#: templates/admin/filer/folder/change_form.html:7 -#: templates/admin/filer/folder/change_form.html:8 -#: templates/admin/filer/folder/change_form.html:9 -#: templates/admin/filer/folder/directory_listing.html:74 -#: templates/image_filer/image_export_form.html:7 -#: templates/image_filer/image_export_form.html:8 -#: templates/image_filer/image_export_form.html:16 -msgid "Go back to" -msgstr "Wróć do" +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "Nie, wróć" -#: templates/admin/filer/folder/change_form.html:7 -#: templates/image_filer/image_export_form.html:7 -msgid "admin homepage" -msgstr "panelu administracyjnego" +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "Tak, na pewno" -#: templates/admin/filer/folder/change_form.html:22 -#: templates/admin/filer/image/change_form.html:9 +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 msgid "History" msgstr "Historia" +#: templates/admin/filer/file/change_form.html:37 #: templates/admin/filer/folder/change_form.html:23 -#: templates/admin/filer/image/change_form.html:10 +#: templates/admin/filer/image/change_form.html:37 msgid "View on site" msgstr "Zobacz na stronie" -#: templates/admin/filer/folder/change_form.html:35 -#: templates/admin/filer/folder/directory_listing.html:75 -#: templates/admin/filer/folder/directory_listing.html:85 -#: templates/admin/filer/folder/directory_table.html:23 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "Wróć do" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "panelu administracyjnego" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 msgid "Folder Icon" msgstr "Ikona katalogu" -#: templates/admin/filer/folder/choose_copy_destination.html:12 +#: templates/admin/filer/folder/choose_copy_destination.html:23 msgid "" "Your account doesn't have permissions to copy all of the selected files and/" "or folders." msgstr "" +"Twoje konto nie ma uprawnień do skopiowania wszystkich zaznaczonych plików i/" +"lub katalogów." -#: templates/admin/filer/folder/choose_copy_destination.html:15 -#: templates/admin/filer/folder/choose_move_destination.html:15 +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "Powróć" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 msgid "There are no destination folders available." -msgstr "" +msgstr "Brak dostępnych katalogów docelowych." -#: templates/admin/filer/folder/choose_copy_destination.html:18 +#: templates/admin/filer/folder/choose_copy_destination.html:35 msgid "There are no files and/or folders available to copy." -msgstr "" +msgstr "Brak dostępnych plików i/lub katalogów do skopiowania." -#: templates/admin/filer/folder/choose_copy_destination.html:20 +#: templates/admin/filer/folder/choose_copy_destination.html:40 msgid "" "The following files and/or folders will be copied to a destination folder " "(retaining their tree structure):" msgstr "" +"Następujące pliki i/lub katalogi zostaną skopiowane do katalogu docelowego " +"(z zachowaniem ich struktury):" -#: templates/admin/filer/folder/choose_copy_destination.html:32 -#: templates/admin/filer/folder/choose_move_destination.html:32 +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 msgid "Destination folder:" -msgstr "" +msgstr "Katalog docelowy:" -#: templates/admin/filer/folder/choose_copy_destination.html:39 +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 msgid "Copy" -msgstr "" +msgstr "Skopiuj" -#: templates/admin/filer/folder/choose_images_resize_options.html:12 +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "Nie można kopiować plików to tego samego folderu" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 msgid "" "Your account doesn't have permissions to resize all of the selected images." msgstr "" +"Twoje konto nie ma uprawnień do zmiany rozmiaru wszystkich zaznaczonych " +"obrazów." -#: templates/admin/filer/folder/choose_images_resize_options.html:15 +#: templates/admin/filer/folder/choose_images_resize_options.html:18 msgid "There are no images available to resize." -msgstr "" +msgstr "Brak dostępnych obrazów do zmiany ich rozmiaru." -#: templates/admin/filer/folder/choose_images_resize_options.html:17 +#: templates/admin/filer/folder/choose_images_resize_options.html:20 msgid "The following images will be resized:" -msgstr "" - -#: templates/admin/filer/folder/choose_images_resize_options.html:30 -msgid "Choose an existing thumbnail option or enter resize parameters:" -msgstr "" +msgstr "Następujące obrazy będą miały zmieniony rozmiar:" #: templates/admin/filer/folder/choose_images_resize_options.html:32 -msgid "Choose resize parameters:" +msgid "Choose an existing thumbnail option or enter resize parameters:" msgstr "" +"Wybierz istniejącą opcje miniatury albo wprowadź parametry zmiany rozmiaru:" -#: templates/admin/filer/folder/choose_images_resize_options.html:35 +#: templates/admin/filer/folder/choose_images_resize_options.html:36 msgid "" "Warning: Images will be resized in-place and originals will be lost. Maybe " "first make a copy of them to retain the originals." msgstr "" +"Uwaga: Rozmiary obrazów zostanie zmienione w miejscu a oryginały zostaną " +"utracone. W celu zachowania oryginałów, najpierw wykonaj ich kopię." -#: templates/admin/filer/folder/choose_images_resize_options.html:36 +#: templates/admin/filer/folder/choose_images_resize_options.html:39 msgid "Resize" -msgstr "" +msgstr "Zmień rozmiar" -#: templates/admin/filer/folder/choose_move_destination.html:12 +#: templates/admin/filer/folder/choose_move_destination.html:35 msgid "" "Your account doesn't have permissions to move all of the selected files and/" "or folders." msgstr "" +"Twoje konto nie ma uprawnień do przeniesienia wszystkich zaznaczonych plików " +"i/lub katalogów." -#: templates/admin/filer/folder/choose_move_destination.html:18 +#: templates/admin/filer/folder/choose_move_destination.html:47 msgid "There are no files and/or folders available to move." -msgstr "" +msgstr "Brak plików i/lub folderów do przeniesienia." -#: templates/admin/filer/folder/choose_move_destination.html:20 +#: templates/admin/filer/folder/choose_move_destination.html:52 msgid "" "The following files and/or folders will be moved to a destination folder " "(retaining their tree structure):" msgstr "" +"Następujące pliki i/lub katalogi zostaną przeniesione do katalogu docelowego " +"(z zachowaniem ich struktury):" -#: templates/admin/filer/folder/choose_move_destination.html:38 +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 msgid "Move" -msgstr "" +msgstr "Przenieś" -#: templates/admin/filer/folder/choose_rename_format.html:12 +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "Nie można przenieść plików do tego samego folderu" + +#: templates/admin/filer/folder/choose_rename_format.html:15 msgid "" "Your account doesn't have permissions to rename all of the selected files." msgstr "" +"Twoje konto nie posiada uprawnień do zmiany nazwy wszystkich zaznaczonych " +"plików." -#: templates/admin/filer/folder/choose_rename_format.html:15 +#: templates/admin/filer/folder/choose_rename_format.html:18 msgid "There are no files available to rename." -msgstr "" +msgstr "Brak dostępnych plików do zmiany nazwy." -#: templates/admin/filer/folder/choose_rename_format.html:17 +#: templates/admin/filer/folder/choose_rename_format.html:20 msgid "" "The following files will be renamed (they will stay in their folders and " "keep original filename, only displayed filename will be changed):" msgstr "" +"Następujące pliki będą miały zmienioną nazwę (pliki pozostaną w swoich " +"katalogach i zachowają oryginalne nazwy, zmieni się jedynie ich wyświetlana " +"nazwa):" -#: templates/admin/filer/folder/choose_rename_format.html:54 +#: templates/admin/filer/folder/choose_rename_format.html:59 msgid "Rename" -msgstr "" +msgstr "Zmień nazwę" + +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "Wróć do katalogu nadrzędnego" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "Zmień dane aktualnie wyświetlanego katalogu" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "Zmień" + +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "Kliknij tutaj aby szukać daną frazę" + +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "Szukaj" + +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "Zamknij" -#: templates/admin/filer/folder/directory_listing.html:66 +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "Limit" + +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "Zaznacz, by ograniczyć szukanie do bieżącego folderu" + +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "Ogranicz szukanie do bieżącego folderu" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "Usuń" + +#: templates/admin/filer/folder/directory_listing.html:203 msgid "Adds a new Folder" msgstr "Dodaje nowy katalog" -#: templates/admin/filer/folder/directory_listing.html:66 -#: templates/image_filer/include/export_dialog.html:34 +#: templates/admin/filer/folder/directory_listing.html:206 msgid "New Folder" msgstr "Nowy katalog" -#: templates/admin/filer/folder/directory_listing.html:67 -msgid "upload files" -msgstr "" +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "Wyślij Pliki" -#: templates/admin/filer/folder/directory_listing.html:67 -msgid "Upload" -msgstr "" +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "Musisz najpierw wybrać katalog" -#: templates/admin/filer/folder/directory_listing.html:74 -msgid "Go back to the parent folder" -msgstr "Wróć do katalogu nadrzędnego" +#: templates/admin/filer/folder/directory_table_list.html:16 +msgid "Name" +msgstr "Nazwa" + +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "Właściciel" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "Rozmiar" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "Akcja" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 +#, python-format +msgid "Change '%(item_label)s' folder details" +msgstr "Zmień dane katalogu '%(item_label)s'" -#: templates/admin/filer/folder/directory_listing.html:76 -#: templates/admin/filer/folder/directory_table.html:29 -#: templates/admin/filer/tools/search_form.html:18 +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 #, python-format -msgid "1 folder" +msgid "%(counter)s folder" msgid_plural "%(counter)s folders" msgstr[0] "%(counter)s katalog" msgstr[1] "%(counter)s katalogi" msgstr[2] "%(counter)s katalogów" +msgstr[3] "%(counter)s katalogów" -#: templates/admin/filer/folder/directory_listing.html:76 -#: templates/admin/filer/folder/directory_table.html:29 -#: templates/admin/filer/tools/search_form.html:19 +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 #, python-format -msgid "1 file" +msgid "%(counter)s file" msgid_plural "%(counter)s files" msgstr[0] "%(counter)s plik" msgstr[1] "%(counter)s pliki" msgstr[2] "%(counter)s plików" +msgstr[3] "%(counter)s plików" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "Zmień dane katalogu" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "Usuń katalog" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 +msgid "Select this file" +msgstr "Wybierz ten plik" -#: templates/admin/filer/folder/directory_listing.html:80 -msgid "Change current folder details" -msgstr "Zmodyfikuj dane aktualnie wyświetlanego katalogu" - -#: templates/admin/filer/folder/directory_listing.html:80 -#: templates/admin/filer/folder/directory_table.html:27 -#: templates/admin/filer/folder/directory_table.html:43 -msgid "Change" -msgstr "Zmień" +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 +#, python-format +msgid "Change '%(item_label)s' details" +msgstr "Zmień dane '%(item_label)s'" -#: templates/admin/filer/folder/directory_table.html:13 -msgid "Name" -msgstr "Nazwa" +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "Permissions" +msgstr "Uprawnienia" -#: templates/admin/filer/folder/directory_table.html:23 -#: templates/admin/filer/folder/directory_table.html:27 -#: templates/admin/filer/folder/directory_table.html:29 -#, python-format -msgid "Change '%(item_label)s' folder details" -msgstr "Zmodyfikuj dane katalogu '%(item_label)s'" +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "disabled" +msgstr "wyłączony" -#: templates/admin/filer/folder/directory_table.html:30 -#: templates/admin/filer/folder/directory_table.html:45 -msgid "Owner" -msgstr "Właściciel" +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "enabled" +msgstr "włączony" -#: templates/admin/filer/folder/directory_table.html:37 -msgid "Select this file" -msgstr "Wybierz ten plik" +#: templates/admin/filer/folder/directory_table_list.html:144 +#, fuzzy +#| msgid "Move selected files to clipboard" +msgid "URL copied to clipboard" +msgstr "Przenieś zaznaczone pliki do schowka" -#: templates/admin/filer/folder/directory_table.html:39 -#: templates/admin/filer/folder/directory_table.html:43 -#: templates/admin/filer/folder/directory_table.html:44 +#: templates/admin/filer/folder/directory_table_list.html:147 #, python-format -msgid "Change '%(item_label)s' details" -msgstr "Zmodyfikuj dane '%(item_label)s'" +msgid "Canonical url '%(item_label)s'" +msgstr "Kanoniczny url '%(item_label)s'" -#: templates/admin/filer/folder/directory_table.html:42 +#: templates/admin/filer/folder/directory_table_list.html:151 #, python-format -msgid "Delete '%(item_label)s'" -msgstr "" +msgid "Download '%(item_label)s'" +msgstr "Pobierz '%(item_label)s'" -#: templates/admin/filer/folder/directory_table.html:42 -msgid "Delete" -msgstr "" +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "Usuń plik" -#: templates/admin/filer/folder/directory_table.html:46 -msgid "Permissions" -msgstr "" +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "Upuść pliki tutaj lub kliknij na przycisk \"Wyślij Pliki\" " -#: templates/admin/filer/folder/directory_table.html:46 -msgid "disabled" -msgstr "" +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "Upuść plik by wysłać go do:" -#: templates/admin/filer/folder/directory_table.html:46 -msgid "enabled" -msgstr "" +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "Upload" + +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "anuluj" -#: templates/admin/filer/folder/directory_table.html:50 -msgid "Move to clipboard" -msgstr "Przenieś do schowka" +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "Wysłano pomyślnie!" -#: templates/admin/filer/folder/directory_table.html:58 -msgid "there are no files or subfolders" -msgstr "Nie dodano tutaj jeszcze żadnych plików, bądź katalogów" +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "Wysyłanie anulowane!" -#: templates/admin/filer/folder/directory_table.html:65 +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 msgid "previous" -msgstr "" +msgstr "poprzedni" -#: templates/admin/filer/folder/directory_table.html:69 +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 #, python-format -msgid "" -"\n" -" Page %(number)s of %(num_pages)s.\n" -" " -msgstr "" +msgid "Page %(number)s of %(num_pages)s." +msgstr "Strona %(number)s z %(num_pages)s." -#: templates/admin/filer/folder/directory_table.html:75 +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 msgid "next" +msgstr "następny" + +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "Wybierz wszystkie %(total_count)s" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +msgid "Select all" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +msgid "Files" msgstr "" #: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 msgid "Add new" msgstr "Dodaj nowy" -#: templates/admin/filer/folder/new_folder_form.html:13 +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:15 msgid "Please correct the error below." msgid_plural "Please correct the errors below." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Proszę naprawić poniższy błąd." +msgstr[1] "Proszę naprawić poniższe błędy." +msgstr[2] "Proszę naprawić poniższe błędy." +msgstr[3] "Proszę naprawić poniższe błędy." -#: templates/admin/filer/folder/new_folder_form.html:28 +#: templates/admin/filer/folder/new_folder_form.html:30 msgid "Save" msgstr "Zapisz" -#: templates/admin/filer/image/change_form.html:21 -msgid "Full size preview" -msgstr "Pełnowymiarowy podgląd" +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." +msgstr "" -#: templates/admin/filer/tools/search_form.html:8 -#: templates/admin/filer/tools/search_form.html:14 -msgid "Search" -msgstr "Szukaj" +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "Schowek" + +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "Wklej tutaj wszystkie elementy" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "Przenieś wszystkie elementy schowka do" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "Wyczyść Schowek" + +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "schowek jest pusty" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "Nie udało się przesłać pliku" + +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" +msgstr "" -#: templates/admin/filer/tools/search_form.html:13 -msgid "Enter your search phrase here" -msgstr "Wprowadź kryteria wyszukiwania" +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" +msgstr "" -#: templates/admin/filer/tools/search_form.html:14 -msgid "Click here to" -msgstr "Kliknij tutaj by" +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +msgid "File is missing" +msgstr "" -#: templates/admin/filer/tools/search_form.html:14 -msgid "run search for entered phrase" -msgstr "wyszukaj wprowadzoną frazę" +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "Typ" -#: templates/admin/filer/tools/search_form.html:15 -msgid "Check it to" -msgstr "Zaznacz by" +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "Rozmiar pliku" -#: templates/admin/filer/tools/search_form.html:15 -#: templates/admin/filer/tools/search_form.html:16 -msgid "limit the search to current folder" -msgstr "wyszukaj tylko w tym katalogu" +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "Modyfikowano" -#: templates/admin/filer/tools/search_form.html:18 +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "Utworzono" + +#: templates/admin/filer/tools/search_form.html:5 msgid "found" msgstr "znaleziono" -#: templates/admin/filer/tools/search_form.html:18 +#: templates/admin/filer/tools/search_form.html:5 msgid "and" msgstr "i" -#: templates/admin/filer/tools/search_form.html:19 +#: templates/admin/filer/tools/search_form.html:7 msgid "cancel search" msgstr "anuluj wyszukiwanie" -#: templates/admin/filer/tools/upload_button_js.html:24 -#: templates/admin/filer/widgets/admin_file.html:7 -#: templates/admin/filer/widgets/admin_file.html:8 -msgid "file missing" -msgstr "" +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "Usuń" -#: templates/admin/filer/tools/clipboard/clipboard.html:7 -msgid "Clipboard" -msgstr "Schowek" +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "lub upuść swój plik tutaj" -#: templates/admin/filer/tools/clipboard/clipboard.html:19 -msgid "Paste all items here" -msgstr "Wklej tutaj wszystkie elementy" +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "brak zaznaczonych plików" -#: templates/admin/filer/tools/clipboard/clipboard.html:26 -msgid "discard" -msgstr "odrzuć" +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "Wyszukaj" -#: templates/admin/filer/tools/clipboard/clipboard.html:26 -msgid "Move all clipboard files to" -msgstr "Przenieś wszystkie el. schowka do" +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "Wybierz plik" -#: templates/admin/filer/tools/clipboard/clipboard.html:43 -msgid "the clipboard is empty" -msgstr "schowek jest pusty" +#: templates/admin/filer/widgets/admin_folder.html:16 +msgid "Choose Folder" +msgstr "" -#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:11 -msgid "upload failed" -msgstr "Nie udało się przesłać pliku" +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" +msgstr "" -#: templates/admin/filer/widgets/admin_file.html:11 -msgid "no file selected" +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" msgstr "" -#: templates/admin/filer/widgets/admin_file.html:14 -#: templates/admin/filer/widgets/admin_file.html:15 -#: templates/admin/filer/widgets/admin_folder.html:7 -#: templates/admin/filer/widgets/admin_folder.html:8 -msgid "Lookup" -msgstr "Wyszukaj" +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" +msgstr "" -#: templates/admin/filer/widgets/admin_file.html:17 -#: templates/admin/filer/widgets/admin_folder.html:10 -msgid "Clear" -msgstr "Usuń" +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" +msgstr "" -#: templates/admin/filer/widgets/admin_folder.html:5 -msgid "none selected" +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" msgstr "" -#: templates/image_filer/folder.html:3 -#, python-format -msgid "Folder '%(folder_label)s' files" -msgstr "Pliki w katalogu '%(folder_label)s' " +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." + +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" + +#~ msgid "Open file" +#~ msgstr "Open file" + +#~ msgid "Full size preview" +#~ msgstr "Full size preview" + +#~ msgid "Add Description" +#~ msgstr "Add Description" + +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" -#: templates/image_filer/folder.html:6 -msgid "File name" -msgstr "Nazwa pliku" +#~ msgid "none selected" +#~ msgstr "none selected" -#: templates/image_filer/image_export_form.html:17 -msgid "export" -msgstr "eksport" +#~ msgid "Add Folder" +#~ msgstr "Add Folder" -#: templates/image_filer/image_export_form.html:27 -msgid "download image" -msgstr "pobierz obrazek" +#~ msgid "Subject Location" +#~ msgstr "Subject location" -#: templates/image_filer/include/export_dialog.html:13 -msgid "Folder name already taken." -msgstr "Katalog o podanej nazwie juz istnieje" +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" +#~ msgstr[1] "15c0f2d28d6dab1af1f6d94906beb627_pl_1" +#~ msgstr[2] "15c0f2d28d6dab1af1f6d94906beb627_pl_2" +#~ msgstr[3] "15c0f2d28d6dab1af1f6d94906beb627_pl_3" -#: templates/image_filer/include/export_dialog.html:15 -msgid "Submit" -msgstr "Wyślij" +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/pt/LC_MESSAGES/django.mo b/filer/locale/pt/LC_MESSAGES/django.mo new file mode 100644 index 000000000..6a145895c Binary files /dev/null and b/filer/locale/pt/LC_MESSAGES/django.mo differ diff --git a/filer/locale/pt/LC_MESSAGES/django.po b/filer/locale/pt/LC_MESSAGES/django.po new file mode 100644 index 000000000..78553fbd5 --- /dev/null +++ b/filer/locale/pt/LC_MESSAGES/django.po @@ -0,0 +1,1230 @@ +# 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: +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django Filer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: Angelo Dini \n" +"Language-Team: Portuguese (http://app.transifex.com/divio/django-filer/" +"language/pt/)\n" +"Language: pt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % " +"1000000 == 0 ? 1 : 2;\n" + +#: admin/clipboardadmin.py:17 +msgid "You do not have permission to upload files." +msgstr "" + +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "" + +#: admin/clipboardadmin.py:20 +msgid "Can't use this folder, Permission Denied. Please select another folder." +msgstr "" + +#: admin/fileadmin.py:73 +msgid "Advanced" +msgstr "" + +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" + +#: admin/folderadmin.py:434 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "" + +#: admin/folderadmin.py:475 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "" + +#: admin/folderadmin.py:612 +msgid "No action selected." +msgstr "" + +#: admin/folderadmin.py:664 +#, python-format +msgid "Successfully moved %(count)d files to clipboard." +msgstr "" + +#: admin/folderadmin.py:669 +msgid "Move selected files to clipboard" +msgstr "" + +#: admin/folderadmin.py:709 +#, python-format +msgid "Successfully disabled permissions for %(count)d files." +msgstr "" + +#: admin/folderadmin.py:711 +#, python-format +msgid "Successfully enabled permissions for %(count)d files." +msgstr "" + +#: admin/folderadmin.py:719 +msgid "Enable permissions for selected files" +msgstr "" + +#: admin/folderadmin.py:725 +msgid "Disable permissions for selected files" +msgstr "" + +#: admin/folderadmin.py:789 +#, python-format +msgid "Successfully deleted %(count)d files and/or folders." +msgstr "" + +#: admin/folderadmin.py:794 +msgid "Cannot delete files and/or folders" +msgstr "" + +#: admin/folderadmin.py:796 +msgid "Are you sure?" +msgstr "" + +#: admin/folderadmin.py:802 +msgid "Delete files and/or folders" +msgstr "" + +#: admin/folderadmin.py:823 +msgid "Delete selected files and/or folders" +msgstr "" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "" + +#: admin/folderadmin.py:934 +#, python-format +msgid "" +"Successfully moved %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" + +#: admin/folderadmin.py:942 admin/folderadmin.py:944 +msgid "Move files and/or folders" +msgstr "" + +#: admin/folderadmin.py:959 +msgid "Move selected files and/or folders" +msgstr "" + +#: admin/folderadmin.py:1016 +#, python-format +msgid "Successfully renamed %(count)d files." +msgstr "" + +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 +msgid "Rename files" +msgstr "" + +#: admin/folderadmin.py:1137 +#, python-format +msgid "" +"Successfully copied %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" + +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 +msgid "Copy files and/or folders" +msgstr "" + +#: admin/folderadmin.py:1174 +msgid "Copy selected files and/or folders" +msgstr "" + +#: admin/folderadmin.py:1279 +#, python-format +msgid "Successfully resized %(count)d images." +msgstr "" + +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 +msgid "Resize images" +msgstr "" + +#: admin/folderadmin.py:1303 +msgid "Resize selected images" +msgstr "" + +#: admin/forms.py:24 +msgid "Suffix which will be appended to filenames of copied files." +msgstr "" + +#: admin/forms.py:31 +#, python-format +msgid "" +"Suffix should be a valid, simple and lowercase filename part, like " +"\"%(valid)s\"." +msgstr "" + +#: admin/forms.py:52 +#, python-format +msgid "Unknown rename format value key \"%(key)s\"." +msgstr "" + +#: admin/forms.py:54 +#, python-format +msgid "Invalid rename format: %(error)s." +msgstr "" + +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 +msgid "thumbnail option" +msgstr "" + +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 +msgid "width" +msgstr "" + +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 +msgid "height" +msgstr "" + +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 +msgid "crop" +msgstr "" + +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 +msgid "upscale" +msgstr "" + +#: admin/forms.py:79 +msgid "Thumbnail option or resize parameters must be choosen." +msgstr "" + +#: admin/imageadmin.py:20 admin/imageadmin.py:112 +msgid "Subject location" +msgstr "" + +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "" + +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "" + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "" + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "" + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" +msgstr "" + +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" +msgstr "" + +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "" + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "" + +#: models/abstract.py:62 +msgid "default alt text" +msgstr "" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "" + +#: models/abstract.py:76 +msgid "subject location" +msgstr "" + +#: models/abstract.py:91 +msgid "image" +msgstr "" + +#: models/abstract.py:92 +msgid "images" +msgstr "" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "" + +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." +msgstr "" + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 +msgid "user" +msgstr "" + +#: models/clipboardmodels.py:17 models/filemodels.py:157 +msgid "files" +msgstr "" + +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 +msgid "clipboard" +msgstr "" + +#: models/clipboardmodels.py:25 +msgid "clipboards" +msgstr "" + +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 +msgid "file" +msgstr "" + +#: models/clipboardmodels.py:56 +msgid "clipboard item" +msgstr "" + +#: models/clipboardmodels.py:57 +msgid "clipboard items" +msgstr "" + +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "folder" +msgstr "" + +#: models/filemodels.py:81 +msgid "file size" +msgstr "" + +#: models/filemodels.py:87 +msgid "sha1" +msgstr "" + +#: models/filemodels.py:94 +msgid "has all mandatory data" +msgstr "" + +#: models/filemodels.py:100 +msgid "original filename" +msgstr "" + +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 +msgid "name" +msgstr "" + +#: models/filemodels.py:116 +msgid "description" +msgstr "" + +#: models/filemodels.py:125 models/foldermodels.py:108 +msgid "owner" +msgstr "" + +#: models/filemodels.py:129 models/foldermodels.py:116 +msgid "uploaded at" +msgstr "" + +#: models/filemodels.py:134 models/foldermodels.py:126 +msgid "modified at" +msgstr "" + +#: models/filemodels.py:140 +msgid "Permissions disabled" +msgstr "" + +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "" + +#: models/foldermodels.py:94 +msgid "parent" +msgstr "" + +#: models/foldermodels.py:121 +msgid "created at" +msgstr "" + +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Folder" +msgstr "" + +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 +msgid "Folders" +msgstr "" + +#: models/foldermodels.py:260 +msgid "all items" +msgstr "" + +#: models/foldermodels.py:261 +msgid "this item only" +msgstr "" + +#: models/foldermodels.py:262 +msgid "this item and all children" +msgstr "" + +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "" + +#: models/foldermodels.py:280 +msgid "type" +msgstr "" + +#: models/foldermodels.py:297 +msgid "group" +msgstr "" + +#: models/foldermodels.py:304 +msgid "everybody" +msgstr "" + +#: models/foldermodels.py:309 +msgid "can read" +msgstr "" + +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "" + +#: models/foldermodels.py:325 +msgid "can add children" +msgstr "" + +#: models/foldermodels.py:333 +msgid "folder permission" +msgstr "" + +#: models/foldermodels.py:334 +msgid "folder permissions" +msgstr "" + +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." +msgstr "" + +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." +msgstr "" + +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." +msgstr "" + +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." +msgstr "" + +#: models/foldermodels.py:360 +msgid "All Folders" +msgstr "" + +#: models/foldermodels.py:362 +msgid "Logical Path" +msgstr "" + +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" +msgstr "" + +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" +msgstr "" + +#: models/foldermodels.py:375 +msgid "Everybody" +msgstr "" + +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "" + +#: models/foldermodels.py:389 +msgid "Read" +msgstr "" + +#: models/foldermodels.py:390 +msgid "Add children" +msgstr "" + +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "" + +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "" + +#: models/virtualitems.py:73 +msgid "files with missing metadata" +msgstr "" + +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "root" +msgstr "" + +#: settings.py:273 +msgid "Show table view" +msgstr "" + +#: settings.py:278 +msgid "Show thumbnail view" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Run the selected action" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Go" +msgstr "" + +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +msgid "Click here to select the objects across all pages" +msgstr "" + +#: templates/admin/filer/actions.html:14 +#, python-format +msgid "Select all %(total_count)s files and/or folders" +msgstr "" + +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 +msgid "Clear selection" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 +msgid "Go back to admin homepage" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 +msgid "Home" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 +msgid "Go back to Filer app" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Go back to root folder" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:8 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 +#, python-format +msgid "Go back to '%(folder_name)s' folder" +msgstr "" + +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:11 +msgid "" +"Deleting the selected files and/or folders would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:19 +msgid "" +"Deleting the selected files and/or folders would require deleting the " +"following protected related objects:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:27 +msgid "" +"Are you sure you want to delete the selected files and/or folders? All of " +"the following objects and their related items will be deleted:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "" + +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 +msgid "History" +msgstr "" + +#: templates/admin/filer/file/change_form.html:37 +#: templates/admin/filer/folder/change_form.html:23 +#: templates/admin/filer/image/change_form.html:37 +msgid "View on site" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 +msgid "Folder Icon" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:23 +msgid "" +"Your account doesn't have permissions to copy all of the selected files and/" +"or folders." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 +msgid "There are no destination folders available." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:35 +msgid "There are no files and/or folders available to copy." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:40 +msgid "" +"The following files and/or folders will be copied to a destination folder " +"(retaining their tree structure):" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 +msgid "Destination folder:" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 +msgid "Copy" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 +msgid "" +"Your account doesn't have permissions to resize all of the selected images." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:18 +msgid "There are no images available to resize." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:20 +msgid "The following images will be resized:" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:32 +msgid "Choose an existing thumbnail option or enter resize parameters:" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:36 +msgid "" +"Warning: Images will be resized in-place and originals will be lost. Maybe " +"first make a copy of them to retain the originals." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:39 +msgid "Resize" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:35 +msgid "" +"Your account doesn't have permissions to move all of the selected files and/" +"or folders." +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:47 +msgid "There are no files and/or folders available to move." +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:52 +msgid "" +"The following files and/or folders will be moved to a destination folder " +"(retaining their tree structure):" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 +msgid "Move" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:15 +msgid "" +"Your account doesn't have permissions to rename all of the selected files." +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:18 +msgid "There are no files available to rename." +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:20 +msgid "" +"The following files will be renamed (they will stay in their folders and " +"keep original filename, only displayed filename will be changed):" +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:59 +msgid "Rename" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:16 +msgid "Name" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 +#, python-format +msgid "Change '%(item_label)s' folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 +msgid "Select this file" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 +#, python-format +msgid "Change '%(item_label)s' details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "Permissions" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "disabled" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "enabled" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:144 +msgid "URL copied to clipboard" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:147 +#, python-format +msgid "Canonical url '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:151 +#, python-format +msgid "Download '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 +msgid "previous" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 +#, python-format +msgid "Page %(number)s of %(num_pages)s." +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 +msgid "next" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +msgid "Select all" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +msgid "Files" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +msgid "Add new" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:15 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: templates/admin/filer/folder/new_folder_form.html:30 +msgid "Save" +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +msgid "File is missing" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "found" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "and" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:7 +msgid "cancel search" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "" + +#: templates/admin/filer/widgets/admin_folder.html:16 +msgid "Choose Folder" +msgstr "" + +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" +msgstr "" + +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" +msgstr "" + +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" +msgstr "" + +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" +msgstr "" + +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" +msgstr "" + +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." + +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" + +#~ msgid "Open file" +#~ msgstr "Open file" + +#~ msgid "Full size preview" +#~ msgstr "Full size preview" + +#~ msgid "Add Description" +#~ msgstr "Add Description" + +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" + +#~ msgid "none selected" +#~ msgstr "none selected" + +#~ msgid "Add Folder" +#~ msgstr "Add Folder" + +#~ msgid "Subject Location" +#~ msgstr "Subject location" + +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" +#~ msgstr[1] "15c0f2d28d6dab1af1f6d94906beb627_pl_1" +#~ msgstr[2] "15c0f2d28d6dab1af1f6d94906beb627_pl_2" + +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/pt_BR/LC_MESSAGES/django.mo b/filer/locale/pt_BR/LC_MESSAGES/django.mo index c65986b60..423ed55ba 100644 Binary files a/filer/locale/pt_BR/LC_MESSAGES/django.mo and b/filer/locale/pt_BR/LC_MESSAGES/django.mo differ diff --git a/filer/locale/pt_BR/LC_MESSAGES/django.po b/filer/locale/pt_BR/LC_MESSAGES/django.po index 755a254d1..220c55c5c 100644 --- a/filer/locale/pt_BR/LC_MESSAGES/django.po +++ b/filer/locale/pt_BR/LC_MESSAGES/django.po @@ -3,482 +3,638 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Translators: +# Translators: +# Claudio Rogerio Carvalho Filho , 2017 +# Julio Lucchese , 2018 +# Rodrigo , 2013 msgid "" msgstr "" -"Project-Id-Version: django-filer\n" +"Project-Id-Version: django Filer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-07-13 19:10+0200\n" -"PO-Revision-Date: 2012-09-03 20:12+0100\n" -"Last-Translator: Stefan Foulis \n" -"Language-Team: LANGUAGE \n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: Julio Lucchese , 2018\n" +"Language-Team: Portuguese (Brazil) (http://app.transifex.com/divio/django-" +"filer/language/pt_BR/)\n" +"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" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % " +"1000000 == 0 ? 1 : 2;\n" -#: views.py:103 -msgid "Folder with this name already exists." +#: admin/clipboardadmin.py:17 +msgid "You do not have permission to upload files." msgstr "" -#: admin/fileadmin.py:41 +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "" + +#: admin/clipboardadmin.py:20 +msgid "Can't use this folder, Permission Denied. Please select another folder." +msgstr "" + +#: admin/fileadmin.py:73 msgid "Advanced" msgstr "Avançado" -#: admin/folderadmin.py:324 admin/folderadmin.py:427 +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "URL canônico" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 msgid "" "Items must be selected in order to perform actions on them. No items have " "been changed." msgstr "" +"itens precisam ser selecionar para que a ação seja executada. Nenhuma " +"alteração foi efetuada." -#: admin/folderadmin.py:344 +#: admin/folderadmin.py:434 #, python-format msgid "%(total_count)s selected" msgid_plural "All %(total_count)s selected" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%(total_count)s selecionado" +msgstr[1] "Todos %(total_count)s selecionados" +msgstr[2] "Todos %(total_count)s selecionados" -#: admin/folderadmin.py:377 +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "Listando diretório para %(folder_name)s" + +#: admin/folderadmin.py:475 #, python-format msgid "0 of %(cnt)s selected" -msgstr "" +msgstr "0 de %(cnt)s selecionados" -#: admin/folderadmin.py:456 +#: admin/folderadmin.py:612 msgid "No action selected." -msgstr "" +msgstr "Nenhuma ação selecionada." -#: admin/folderadmin.py:497 +#: admin/folderadmin.py:664 #, python-format msgid "Successfully moved %(count)d files to clipboard." -msgstr "" +msgstr "%(count)d arquivo(s) movidos para a área de transferência com sucesso." -#: admin/folderadmin.py:503 +#: admin/folderadmin.py:669 msgid "Move selected files to clipboard" -msgstr "" +msgstr "Mover os arquivos selecionados para a área de transferência" -#: admin/folderadmin.py:537 +#: admin/folderadmin.py:709 #, python-format msgid "Successfully disabled permissions for %(count)d files." -msgstr "" +msgstr "%(count)d arquivo(s) tiveram suas permissões desativadas com sucesso." -#: admin/folderadmin.py:541 +#: admin/folderadmin.py:711 #, python-format msgid "Successfully enabled permissions for %(count)d files." -msgstr "" +msgstr "%(count)d arquivo(s) tiveram suas permissões ativadas com sucesso." -#: admin/folderadmin.py:550 +#: admin/folderadmin.py:719 msgid "Enable permissions for selected files" -msgstr "" +msgstr "Habilitar as permissões para os arquivos selecionados" -#: admin/folderadmin.py:555 +#: admin/folderadmin.py:725 msgid "Disable permissions for selected files" -msgstr "" +msgstr "Desabilitar as permissões para os arquivos selecionados" -#: admin/folderadmin.py:623 +#: admin/folderadmin.py:789 #, python-format msgid "Successfully deleted %(count)d files and/or folders." -msgstr "" +msgstr "%(count)d arquivo(s) e/ou pasta(s) foram removidos com sucesso." -#: admin/folderadmin.py:630 +#: admin/folderadmin.py:794 msgid "Cannot delete files and/or folders" -msgstr "" +msgstr "Não é possível remover arquivo(s) e/ou pasta(s)" -#: admin/folderadmin.py:632 +#: admin/folderadmin.py:796 msgid "Are you sure?" -msgstr "" +msgstr "Você tem certeza?" -#: admin/folderadmin.py:637 +#: admin/folderadmin.py:802 msgid "Delete files and/or folders" -msgstr "" +msgstr "Remover arquivo(s) e/ou pasta(s)" -#: admin/folderadmin.py:656 +#: admin/folderadmin.py:823 msgid "Delete selected files and/or folders" -msgstr "" +msgstr "Remover arquivo(s) e/ou pasta(s) selecionados" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "Pastas com os nomes %s s já existem no local selecionado" -#: admin/folderadmin.py:771 +#: admin/folderadmin.py:934 #, python-format msgid "" "Successfully moved %(count)d files and/or folders to folder " "'%(destination)s'." msgstr "" +"%(count)d arquivo(s) e/ou pasta(s) foram movidos para a pasta " +"'%(destination)s' com sucesso." -#: admin/folderadmin.py:778 admin/folderadmin.py:780 +#: admin/folderadmin.py:942 admin/folderadmin.py:944 msgid "Move files and/or folders" -msgstr "" +msgstr "Mover arquivo(s) e/ou pasta(s)" -#: admin/folderadmin.py:797 +#: admin/folderadmin.py:959 msgid "Move selected files and/or folders" -msgstr "" +msgstr "Mover arquivo(s) e/ou pasta(s) selecionados" -#: admin/folderadmin.py:854 +#: admin/folderadmin.py:1016 #, python-format msgid "Successfully renamed %(count)d files." -msgstr "" +msgstr "%(count)d arquivo(s) foram renomeados com sucesso." -#: admin/folderadmin.py:862 admin/folderadmin.py:864 admin/folderadmin.py:881 +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 msgid "Rename files" -msgstr "" +msgstr "Renomear arquivos" -#: admin/folderadmin.py:975 +#: admin/folderadmin.py:1137 #, python-format msgid "" "Successfully copied %(count)d files and/or folders to folder " "'%(destination)s'." msgstr "" +"%(count)d arquivo(s) e/ou pasta(s) foram copiados para o pasta " +"'%(destination)s' com sucesso." -#: admin/folderadmin.py:989 admin/folderadmin.py:991 +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 msgid "Copy files and/or folders" -msgstr "" +msgstr "Copiar arquivo(s) e/ou pasta(s)" -#: admin/folderadmin.py:1010 +#: admin/folderadmin.py:1174 msgid "Copy selected files and/or folders" -msgstr "" +msgstr "Copiar arquivo(s) e/ou pasta(s) selecionados" -#: admin/folderadmin.py:1105 +#: admin/folderadmin.py:1279 #, python-format msgid "Successfully resized %(count)d images." -msgstr "" +msgstr "%(count)d imagem(ens) tiveram seu tamanho alterado com sucesso." -#: admin/folderadmin.py:1113 admin/folderadmin.py:1115 +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 msgid "Resize images" -msgstr "" +msgstr "Redimensionar imagens" -#: admin/folderadmin.py:1133 +#: admin/folderadmin.py:1303 msgid "Resize selected images" -msgstr "" +msgstr "Redimensionar imagens selecionadas" -#: admin/forms.py:26 +#: admin/forms.py:24 msgid "Suffix which will be appended to filenames of copied files." -msgstr "" +msgstr "Sufixo que será anexado aos nomes dos arquivos copiados" -#: admin/forms.py:33 +#: admin/forms.py:31 #, python-format msgid "" "Suffix should be a valid, simple and lowercase filename part, like " "\"%(valid)s\"." msgstr "" +"O sufixo precisa ser válido, simples e com letras minúsculas para o nome de " +"um arquivo, como por exemplo: \"%(valid)s\"." -#: admin/forms.py:54 +#: admin/forms.py:52 #, python-format msgid "Unknown rename format value key \"%(key)s\"." msgstr "" +"A chave de valor \"%(key)s\" utilizada para renomear o arquivo é " +"desconhecida." -#: admin/forms.py:56 +#: admin/forms.py:54 #, python-format msgid "Invalid rename format: %(error)s." -msgstr "" +msgstr "Formato inválido para renomear: %(error)s." -#: admin/forms.py:62 +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 msgid "thumbnail option" -msgstr "" +msgstr "opções de miniaturas" -#: admin/forms.py:63 +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 msgid "width" -msgstr "" +msgstr "largura" -#: admin/forms.py:64 +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 msgid "height" -msgstr "" +msgstr "altura" -#: admin/forms.py:65 +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 msgid "crop" -msgstr "" +msgstr "recortar" -#: admin/forms.py:66 +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 msgid "upscale" -msgstr "" +msgstr "aumentar" -#: admin/forms.py:71 +#: admin/forms.py:79 msgid "Thumbnail option or resize parameters must be choosen." msgstr "" +"Escolher entre as opções de miniaturas ou parâmetros de redimensionamento." + +#: admin/imageadmin.py:20 admin/imageadmin.py:112 +msgid "Subject location" +msgstr "Local do assunto" + +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "Localização do tema principal da cena. Formato: \"x, y\"." -#: admin/forms.py:73 -msgid "Resize parameters must be choosen." +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "Formato de localização de assunto inválido." + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "A localização do assunto está fora da imagem." + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "Sua entrada: \"{subject_location}\". " + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" msgstr "" -#: admin/imageadmin.py:12 -msgid "Subject location" -msgstr "Local de Assunto" +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" +msgstr "" -#: admin/imageadmin.py:13 -msgid "Location of the main subject of the scene." -msgstr "Localização do assunto principal da cena." +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "Já existe uma pasta com esse nome." + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "Filer" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "Biblioteca de Mídia" + +#: models/abstract.py:62 +msgid "default alt text" +msgstr "alt text padrão" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "caption padrão" -#: models/clipboardmodels.py:9 models/foldermodels.py:236 +#: models/abstract.py:76 +msgid "subject location" +msgstr "local do assunto" + +#: models/abstract.py:91 +msgid "image" +msgstr "imagem" + +#: models/abstract.py:92 +msgid "images" +msgstr "imagens" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "" + +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." +msgstr "" + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 msgid "user" msgstr "usuário" -#: models/clipboardmodels.py:11 models/filemodels.py:287 +#: models/clipboardmodels.py:17 models/filemodels.py:157 msgid "files" msgstr "arquivos" -#: models/clipboardmodels.py:34 models/clipboardmodels.py:40 +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 msgid "clipboard" msgstr "Área de transferência" -#: models/clipboardmodels.py:35 +#: models/clipboardmodels.py:25 msgid "clipboards" -msgstr "Área de transferência" +msgstr "áreas de transferência" -#: models/clipboardmodels.py:39 models/filemodels.py:35 -#: models/filemodels.py:286 +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 msgid "file" msgstr "arquivo" -#: models/clipboardmodels.py:44 +#: models/clipboardmodels.py:56 msgid "clipboard item" msgstr "item da área de transferência" -#: models/clipboardmodels.py:45 +#: models/clipboardmodels.py:57 msgid "clipboard items" msgstr "itens da área de transferência" -#: models/filemodels.py:33 templates/admin/filer/folder/change_form.html:9 -#: templates/admin/filer/folder/directory_listing.html:74 +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 #: templates/admin/filer/folder/new_folder_form.html:4 -#: templates/admin/filer/tools/clipboard/clipboard.html:26 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 msgid "folder" msgstr "pasta" -#: models/filemodels.py:36 +#: models/filemodels.py:81 msgid "file size" -msgstr "" +msgstr "tamanho do arquivo" -#: models/filemodels.py:38 +#: models/filemodels.py:87 msgid "sha1" -msgstr "" +msgstr "sha1" -#: models/filemodels.py:40 +#: models/filemodels.py:94 msgid "has all mandatory data" -msgstr "" +msgstr "possui todos os dados necessários" -#: models/filemodels.py:42 +#: models/filemodels.py:100 msgid "original filename" -msgstr "" +msgstr "nome original do arquivo" -#: models/filemodels.py:44 models/foldermodels.py:99 +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 msgid "name" msgstr "nome" -#: models/filemodels.py:46 +#: models/filemodels.py:116 msgid "description" msgstr "descrição" -#: models/filemodels.py:50 +#: models/filemodels.py:125 models/foldermodels.py:108 msgid "owner" msgstr "Proprietário" -#: models/filemodels.py:52 models/foldermodels.py:105 +#: models/filemodels.py:129 models/foldermodels.py:116 msgid "uploaded at" -msgstr "" +msgstr "enviado em" -#: models/filemodels.py:53 models/foldermodels.py:108 +#: models/filemodels.py:134 models/foldermodels.py:126 msgid "modified at" -msgstr "" +msgstr "modificado em" -#: models/filemodels.py:57 +#: models/filemodels.py:140 msgid "Permissions disabled" msgstr "Permissões desabilitadas" -#: models/filemodels.py:58 -msgid "Disable any permission checking for this " -msgstr "Desative qualquer verificação de permissão para este" +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "" +"Desative qualquer verificação de permissão para este arquivo. O arquivo " +"estará acessível ao público para que qualquer possa acessar." -#: models/foldermodels.py:107 -msgid "created at" +#: models/foldermodels.py:94 +msgid "parent" msgstr "" -#: models/foldermodels.py:211 -#: templates/admin/filer/widgets/admin_folder.html:3 -#: templates/admin/filer/widgets/admin_folder.html:5 +#: models/foldermodels.py:121 +msgid "created at" +msgstr "criado em" + +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 msgid "Folder" msgstr "Pasta" -#: models/foldermodels.py:212 +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 msgid "Folders" msgstr "Pastas" -#: models/foldermodels.py:227 +#: models/foldermodels.py:260 msgid "all items" msgstr "todos os itens" -#: models/foldermodels.py:228 +#: models/foldermodels.py:261 msgid "this item only" msgstr "este item somente" -#: models/foldermodels.py:229 +#: models/foldermodels.py:262 msgid "this item and all children" -msgstr "este item e todas subjacentes" +msgstr "este item e todos subjacentes" + +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "permitir" -#: models/foldermodels.py:233 +#: models/foldermodels.py:268 +msgid "deny" +msgstr "negar" + +#: models/foldermodels.py:280 msgid "type" msgstr "tipo" -#: models/foldermodels.py:239 +#: models/foldermodels.py:297 msgid "group" msgstr "grupo" -#: models/foldermodels.py:240 +#: models/foldermodels.py:304 msgid "everybody" msgstr "todos" -#: models/foldermodels.py:242 -msgid "can edit" -msgstr "pode editar" - -#: models/foldermodels.py:243 +#: models/foldermodels.py:309 msgid "can read" msgstr "pode ler" -#: models/foldermodels.py:244 +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "pode editar" + +#: models/foldermodels.py:325 msgid "can add children" msgstr "pode adicionar filhos" -#: models/foldermodels.py:273 +#: models/foldermodels.py:333 msgid "folder permission" msgstr "permissão de pasta" -#: models/foldermodels.py:274 +#: models/foldermodels.py:334 msgid "folder permissions" msgstr "permissões de pasta" -#: models/imagemodels.py:39 -msgid "date taken" -msgstr "data de tomada" +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." +msgstr "" -#: models/imagemodels.py:42 -msgid "default alt text" +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." msgstr "" -#: models/imagemodels.py:43 -msgid "default caption" +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." msgstr "" -#: models/imagemodels.py:45 templates/image_filer/image.html:6 -msgid "author" -msgstr "autor" +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." +msgstr "" -#: models/imagemodels.py:47 -msgid "must always publish author credit" +#: models/foldermodels.py:360 +msgid "All Folders" msgstr "" -#: models/imagemodels.py:48 -msgid "must always publish copyright" +#: models/foldermodels.py:362 +msgid "Logical Path" msgstr "" -#: models/imagemodels.py:50 -msgid "subject location" +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" msgstr "" -#: models/imagemodels.py:200 -msgid "image" -msgstr "imagem" +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" +msgstr "" -#: models/imagemodels.py:201 -msgid "images" -msgstr "imagens" +#: models/foldermodels.py:375 +msgid "Everybody" +msgstr "" + +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "" -#: models/virtualitems.py:45 -#: templates/admin/filer/tools/clipboard/clipboard.html:26 -msgid "unfiled files" -msgstr "arquivos unfiled" +#: models/foldermodels.py:389 +msgid "Read" +msgstr "" + +#: models/foldermodels.py:390 +msgid "Add children" +msgstr "" -#: models/virtualitems.py:59 +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "data de tomada" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "autor" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "necessário sempre publicar os créditos do autor" + +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "necessário sempre publicar os direitos autorais" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "largura em pixel." + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "altura em pixel." + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "opções de miniaturas" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "Uploads não classificados" + +#: models/virtualitems.py:73 msgid "files with missing metadata" msgstr "arquivos com falta de metadados" -#: models/virtualitems.py:73 templates/admin/filer/breadcrumbs.html:6 -#: templates/admin/filer/folder/change_form.html:9 -#: templates/admin/filer/folder/directory_listing.html:74 -#: templates/image_filer/image_export_form.html:10 +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 msgid "root" msgstr "raiz" -#: templates/admin/filer/actions.html:4 -msgid "Run the selected action" +#: settings.py:273 +msgid "Show table view" msgstr "" -#: templates/admin/filer/actions.html:4 -msgid "Go" +#: settings.py:278 +msgid "Show thumbnail view" msgstr "" -#: templates/admin/filer/actions.html:11 +#: templates/admin/filer/actions.html:5 +msgid "Run the selected action" +msgstr "Executar a ação selecionada" + +#: templates/admin/filer/actions.html:5 +msgid "Go" +msgstr "Avançar" + +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 msgid "Click here to select the objects across all pages" -msgstr "" +msgstr "Clique aqui para selecionar os objetos em todas as páginas" -#: templates/admin/filer/actions.html:11 +#: templates/admin/filer/actions.html:14 #, python-format msgid "Select all %(total_count)s files and/or folders" -msgstr "" +msgstr "Selecionar todos os %(total_count)s arquivo(s) e/ou pasta(s)" -#: templates/admin/filer/actions.html:13 +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 msgid "Clear selection" -msgstr "" +msgstr "Limpar a seleção" #: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 msgid "Go back to admin homepage" -msgstr "Volte à página inicial de administração" +msgstr "Voltar à página inicial de administração" #: templates/admin/filer/breadcrumbs.html:4 -#: templates/admin/filer/folder/change_form.html:7 -#: templates/image_filer/image_export_form.html:7 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 msgid "Home" msgstr "Início" #: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 msgid "Go back to Filer app" -msgstr "Volte para Filer app" - -#: templates/admin/filer/breadcrumbs.html:5 -#: templates/admin/filer/folder/change_form.html:8 -#: templates/image_filer/image_export_form.html:8 -msgid "Filer" -msgstr "Filer" +msgstr "Voltar para Filer app" #: templates/admin/filer/breadcrumbs.html:6 -#: templates/image_filer/image_export_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:35 msgid "Go back to root folder" msgstr "Volte à pasta raiz" #: templates/admin/filer/breadcrumbs.html:8 -#: templates/admin/filer/breadcrumbs.html:11 -#: templates/admin/filer/folder/change_form.html:11 -#: templates/image_filer/image_export_form.html:12 -#: templates/image_filer/image_export_form.html:14 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 #, python-format msgid "Go back to '%(folder_name)s' folder" msgstr "Volte para a pasta '%(folder_name)s'" -#: templates/admin/filer/change_form.html:28 -msgid "duplicates" -msgstr "duplicatas" - -#: templates/admin/filer/delete_confirmation.html:13 -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#: templates/admin/filer/delete_confirmation.html:21 -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#: templates/admin/filer/delete_confirmation.html:29 -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -#: templates/admin/filer/delete_confirmation.html:34 -#: templates/admin/filer/delete_selected_files_confirmation.html:45 -msgid "Yes, I'm sure" -msgstr "" +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "Duplicados" #: templates/admin/filer/delete_selected_files_confirmation.html:11 msgid "" @@ -486,399 +642,633 @@ msgid "" "objects, but your account doesn't have permission to delete the following " "types of objects:" msgstr "" +"Remover os arquivo(s) e/ou pasta(s) selecionados resultará na remoção de " +"objetos relacionados, mas sua conta não tem permissão para remover os " +"seguintes tipos de objetos:" #: templates/admin/filer/delete_selected_files_confirmation.html:19 msgid "" "Deleting the selected files and/or folders would require deleting the " "following protected related objects:" msgstr "" +"Remover os arquivo(s) e/ou pasta(s) selecionados, requer remover os seguites " +"objetos protegidos relacionados:" #: templates/admin/filer/delete_selected_files_confirmation.html:27 msgid "" "Are you sure you want to delete the selected files and/or folders? All of " "the following objects and their related items will be deleted:" msgstr "" +"Você tem certeza que deseja remover os arquivo(s) e/ou pasta(s) " +"selecionados? Todos os seguintes objetos e itens relacionados serão " +"removidos: " -#: templates/admin/filer/folder/change_form.html:7 -#: templates/admin/filer/folder/change_form.html:8 -#: templates/admin/filer/folder/change_form.html:9 -#: templates/admin/filer/folder/directory_listing.html:74 -#: templates/image_filer/image_export_form.html:7 -#: templates/image_filer/image_export_form.html:8 -#: templates/image_filer/image_export_form.html:16 -msgid "Go back to" -msgstr "Volte para" +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "Não, me leve de volta" -#: templates/admin/filer/folder/change_form.html:7 -#: templates/image_filer/image_export_form.html:7 -msgid "admin homepage" -msgstr "homepage admin" +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "Sim, eu tenho certeza" -#: templates/admin/filer/folder/change_form.html:22 -#: templates/admin/filer/image/change_form.html:9 +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 msgid "History" msgstr "História" +#: templates/admin/filer/file/change_form.html:37 #: templates/admin/filer/folder/change_form.html:23 -#: templates/admin/filer/image/change_form.html:10 +#: templates/admin/filer/image/change_form.html:37 msgid "View on site" -msgstr "Veja no site" +msgstr "Ver no site" + +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "Voltar para" -#: templates/admin/filer/folder/change_form.html:35 -#: templates/admin/filer/folder/directory_listing.html:75 -#: templates/admin/filer/folder/directory_listing.html:85 -#: templates/admin/filer/folder/directory_table.html:23 +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "página inicial de administração" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 msgid "Folder Icon" msgstr "Ícone da Pasta" -#: templates/admin/filer/folder/choose_copy_destination.html:12 +#: templates/admin/filer/folder/choose_copy_destination.html:23 msgid "" "Your account doesn't have permissions to copy all of the selected files and/" "or folders." msgstr "" +"Sua conta não possui permissão para copiar todos os arquivo(s) e/ou pasta(s) " +"selecionados." -#: templates/admin/filer/folder/choose_copy_destination.html:15 -#: templates/admin/filer/folder/choose_move_destination.html:15 +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "Me leve de volta" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 msgid "There are no destination folders available." -msgstr "" +msgstr "Não existe pasta de destino disponível." -#: templates/admin/filer/folder/choose_copy_destination.html:18 +#: templates/admin/filer/folder/choose_copy_destination.html:35 msgid "There are no files and/or folders available to copy." -msgstr "" +msgstr "Não existem arquivo(s) e/ou pasta(s) disponíveis para copiar." -#: templates/admin/filer/folder/choose_copy_destination.html:20 +#: templates/admin/filer/folder/choose_copy_destination.html:40 msgid "" "The following files and/or folders will be copied to a destination folder " "(retaining their tree structure):" msgstr "" +"Os arquivo(s) e/ou pasta(s) serão copiados para a pasta de destino (mantendo " +"a estrutura de diretórios):" -#: templates/admin/filer/folder/choose_copy_destination.html:32 -#: templates/admin/filer/folder/choose_move_destination.html:32 +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 msgid "Destination folder:" -msgstr "" +msgstr "Pasta de destino:" -#: templates/admin/filer/folder/choose_copy_destination.html:39 +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 msgid "Copy" -msgstr "" +msgstr "Copiar" -#: templates/admin/filer/folder/choose_images_resize_options.html:12 +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "Não é permitido copiar arquivos para a mesma pasta" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 msgid "" "Your account doesn't have permissions to resize all of the selected images." msgstr "" +"Sua conta não possui permissão para redimensionar todas as imagens " +"selecionadas." -#: templates/admin/filer/folder/choose_images_resize_options.html:15 +#: templates/admin/filer/folder/choose_images_resize_options.html:18 msgid "There are no images available to resize." -msgstr "" +msgstr "Não existem imagens disponíveis para redimensionar." -#: templates/admin/filer/folder/choose_images_resize_options.html:17 +#: templates/admin/filer/folder/choose_images_resize_options.html:20 msgid "The following images will be resized:" -msgstr "" - -#: templates/admin/filer/folder/choose_images_resize_options.html:30 -msgid "Choose an existing thumbnail option or enter resize parameters:" -msgstr "" +msgstr "As seguintes imagens serão redimensionadas:" #: templates/admin/filer/folder/choose_images_resize_options.html:32 -msgid "Choose resize parameters:" +msgid "Choose an existing thumbnail option or enter resize parameters:" msgstr "" +"Selecionar uma opção de miniatura ou digitar os parâmetros de " +"redimensionamento:" -#: templates/admin/filer/folder/choose_images_resize_options.html:35 +#: templates/admin/filer/folder/choose_images_resize_options.html:36 msgid "" "Warning: Images will be resized in-place and originals will be lost. Maybe " "first make a copy of them to retain the originals." msgstr "" +"Cuidado: as imagens serão redimensionadas no mesmo local e os originais " +"serão perdidos. Uma sugestão seria fazer uma cópia para guardar os originais." -#: templates/admin/filer/folder/choose_images_resize_options.html:36 +#: templates/admin/filer/folder/choose_images_resize_options.html:39 msgid "Resize" -msgstr "" +msgstr "Redimensionar" -#: templates/admin/filer/folder/choose_move_destination.html:12 +#: templates/admin/filer/folder/choose_move_destination.html:35 msgid "" "Your account doesn't have permissions to move all of the selected files and/" "or folders." msgstr "" +"Sua conta não possui permissão para mover todos os arquivo(s) e/ou pasta(s) " +"selecionados." -#: templates/admin/filer/folder/choose_move_destination.html:18 +#: templates/admin/filer/folder/choose_move_destination.html:47 msgid "There are no files and/or folders available to move." -msgstr "" +msgstr "Não existem arquivo(s) e/ou pasta(s) disponíveis para mover." -#: templates/admin/filer/folder/choose_move_destination.html:20 +#: templates/admin/filer/folder/choose_move_destination.html:52 msgid "" "The following files and/or folders will be moved to a destination folder " "(retaining their tree structure):" msgstr "" +"Os arquivo(s) e/ou pasta(s) serão movidos para a pasta de destino (mantendo " +"a estrutura de diretórios):" -#: templates/admin/filer/folder/choose_move_destination.html:38 +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 msgid "Move" -msgstr "" +msgstr "Mover" + +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "Não é permitido mover arquivos na mesma pasta" -#: templates/admin/filer/folder/choose_rename_format.html:12 +#: templates/admin/filer/folder/choose_rename_format.html:15 msgid "" "Your account doesn't have permissions to rename all of the selected files." msgstr "" +"Sua conta não possui permissão para renomear todos os arquivos selecionados." -#: templates/admin/filer/folder/choose_rename_format.html:15 +#: templates/admin/filer/folder/choose_rename_format.html:18 msgid "There are no files available to rename." -msgstr "" +msgstr "Não existem arquivos disponíveis para renomear." -#: templates/admin/filer/folder/choose_rename_format.html:17 +#: templates/admin/filer/folder/choose_rename_format.html:20 msgid "" "The following files will be renamed (they will stay in their folders and " "keep original filename, only displayed filename will be changed):" msgstr "" +"Os seguintes arquivos serão renomeados (estes arquivos serão mantidos em " +"suas pastas e os nomes originais serão mantidos, apenas o nome de " +"apresentação será alterado):" -#: templates/admin/filer/folder/choose_rename_format.html:54 +#: templates/admin/filer/folder/choose_rename_format.html:59 msgid "Rename" -msgstr "" +msgstr "Renomear" + +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "Volte para a pasta pai" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "Alterar os detalhes da pasta atual" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "Alterar" + +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "Clique aqui para pesquisar pela frase inserida" + +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "Pesquisar" -#: templates/admin/filer/folder/directory_listing.html:66 +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "Fechar" + +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "Limite" + +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "Marque para limitar a pesquisa na pasta atual" + +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "Limitar a pesquisa na pasta atual" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "Remover" + +#: templates/admin/filer/folder/directory_listing.html:203 msgid "Adds a new Folder" msgstr "Adiciona uma nova pasta" -#: templates/admin/filer/folder/directory_listing.html:66 -#: templates/image_filer/include/export_dialog.html:34 +#: templates/admin/filer/folder/directory_listing.html:206 msgid "New Folder" msgstr "Nova Pasta" -#: templates/admin/filer/folder/directory_listing.html:67 -msgid "upload files" -msgstr "" +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "Enviar arquivos" -#: templates/admin/filer/folder/directory_listing.html:67 -msgid "Upload" -msgstr "" +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "Você precisa selecionar a pasta primeiro" -#: templates/admin/filer/folder/directory_listing.html:74 -msgid "Go back to the parent folder" -msgstr "Volte para a pasta pai" +#: templates/admin/filer/folder/directory_table_list.html:16 +msgid "Name" +msgstr "Nome" + +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "Proprietário" -#: templates/admin/filer/folder/directory_listing.html:76 -#: templates/admin/filer/folder/directory_table.html:29 -#: templates/admin/filer/tools/search_form.html:18 +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "Tamanho" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "Ação" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 #, python-format -msgid "1 folder" +msgid "Change '%(item_label)s' folder details" +msgstr "Alterar os detalhes da pasta '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" msgid_plural "%(counter)s folders" msgstr[0] "%(counter)s pasta" msgstr[1] "%(counter)s pastas" +msgstr[2] "%(counter)s pastas" -#: templates/admin/filer/folder/directory_listing.html:76 -#: templates/admin/filer/folder/directory_table.html:29 -#: templates/admin/filer/tools/search_form.html:19 +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 #, python-format -msgid "1 file" +msgid "%(counter)s file" msgid_plural "%(counter)s files" msgstr[0] "%(counter)s arquivo" msgstr[1] "%(counter)s arquivos" - -#: templates/admin/filer/folder/directory_listing.html:80 -msgid "Change current folder details" -msgstr "Alterar os detalhes da pasta atual" - -#: templates/admin/filer/folder/directory_listing.html:80 -#: templates/admin/filer/folder/directory_table.html:27 -#: templates/admin/filer/folder/directory_table.html:43 -msgid "Change" -msgstr "Alterar" - -#: templates/admin/filer/folder/directory_table.html:13 -msgid "Name" -msgstr "Nome" - -#: templates/admin/filer/folder/directory_table.html:23 -#: templates/admin/filer/folder/directory_table.html:27 -#: templates/admin/filer/folder/directory_table.html:29 -#, python-format -msgid "Change '%(item_label)s' folder details" -msgstr "Alterar os detalhes da pasta '%(item_label)s'" - -#: templates/admin/filer/folder/directory_table.html:30 -#: templates/admin/filer/folder/directory_table.html:45 -msgid "Owner" -msgstr "Proprietário" - -#: templates/admin/filer/folder/directory_table.html:37 +msgstr[2] "%(counter)s arquivos" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "Alterar detalhes da pasta" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "Remover pasta" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 msgid "Select this file" -msgstr "Selecione este arquivo" +msgstr "Selecionar este arquivo" -#: templates/admin/filer/folder/directory_table.html:39 -#: templates/admin/filer/folder/directory_table.html:43 -#: templates/admin/filer/folder/directory_table.html:44 +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 #, python-format msgid "Change '%(item_label)s' details" msgstr "Alterar os detalhes de '%(item_label)s'" -#: templates/admin/filer/folder/directory_table.html:42 -#, python-format -msgid "Delete '%(item_label)s'" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:42 -msgid "Delete" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:46 +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 msgid "Permissions" msgstr "Permissões" -#: templates/admin/filer/folder/directory_table.html:46 +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 msgid "disabled" msgstr "desabilitado" -#: templates/admin/filer/folder/directory_table.html:46 +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 msgid "enabled" msgstr "habilitado" -#: templates/admin/filer/folder/directory_table.html:50 -msgid "Move to clipboard" -msgstr "Mover para a área de transferência" +#: templates/admin/filer/folder/directory_table_list.html:144 +#, fuzzy +#| msgid "Move selected files to clipboard" +msgid "URL copied to clipboard" +msgstr "Mover os arquivos selecionados para a área de transferência" + +#: templates/admin/filer/folder/directory_table_list.html:147 +#, python-format +msgid "Canonical url '%(item_label)s'" +msgstr "URL Canônico '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:151 +#, python-format +msgid "Download '%(item_label)s'" +msgstr "Baixar '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "Remover arquivo" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "Arraste os arquivos aqui ou use o botão \"Enviar arquivos\"" + +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "Arraste seu arquivo para enviar em:" + +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "Upload" -#: templates/admin/filer/folder/directory_table.html:58 -msgid "there are no files or subfolders" -msgstr "não existem arquivos ou subpastas" +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "Cancelar" -#: templates/admin/filer/folder/directory_table.html:65 +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "Envio realizado com sucesso!" + +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "Envio cancelado!" + +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 msgid "previous" -msgstr "" +msgstr "anterior" -#: templates/admin/filer/folder/directory_table.html:69 +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 #, python-format -msgid "" -"\n" -" Page %(number)s of %(num_pages)s.\n" -" " -msgstr "" +msgid "Page %(number)s of %(num_pages)s." +msgstr "Página %(number)s de %(num_pages)s." -#: templates/admin/filer/folder/directory_table.html:75 +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 msgid "next" +msgstr "próximo" + +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "Selecione todos %(total_count)s" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +msgid "Select all" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +msgid "Files" msgstr "" #: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 msgid "Add new" msgstr "Adicionar novo" -#: templates/admin/filer/folder/new_folder_form.html:13 +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" +msgstr "Administração Django" + +#: templates/admin/filer/folder/new_folder_form.html:15 msgid "Please correct the error below." msgid_plural "Please correct the errors below." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Favor corrigir o erro abaixo." +msgstr[1] "Favor corrigir os erros abaixo." +msgstr[2] "Favor corrigir os erros abaixo." -#: templates/admin/filer/folder/new_folder_form.html:28 +#: templates/admin/filer/folder/new_folder_form.html:30 msgid "Save" msgstr "Salvar" -#: templates/admin/filer/image/change_form.html:21 -msgid "Full size preview" -msgstr "visualização de tamanho completo" +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." +msgstr "" -#: templates/admin/filer/tools/search_form.html:8 -#: templates/admin/filer/tools/search_form.html:14 -msgid "Search" -msgstr "Pesquisa" +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." +msgstr "" -#: templates/admin/filer/tools/search_form.html:13 -msgid "Enter your search phrase here" -msgstr "Digite sua frase de busca aqui" +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "Área de transferência" -#: templates/admin/filer/tools/search_form.html:14 -msgid "Click here to" -msgstr "Clique aqui para" +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "Colar todos os itens aqui" -#: templates/admin/filer/tools/search_form.html:14 -msgid "run search for entered phrase" -msgstr "executar pesquisa para a frase inscrita" +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "Mova todos os arquivos da área de transferência para" -#: templates/admin/filer/tools/search_form.html:15 -msgid "Check it to" -msgstr "Verifique se a" +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "Esvaziar área de transferência" -#: templates/admin/filer/tools/search_form.html:15 -#: templates/admin/filer/tools/search_form.html:16 -msgid "limit the search to current folder" -msgstr "limitar a pesquisa a pasta atual" +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "a área de transferência está vazia" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "Falha no upload" -#: templates/admin/filer/tools/search_form.html:18 +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +msgid "File is missing" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "Tipo" + +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "Tamanho do arquivo" + +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "Modificado" + +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "Criado" + +#: templates/admin/filer/tools/search_form.html:5 msgid "found" msgstr "encontrados" -#: templates/admin/filer/tools/search_form.html:18 +#: templates/admin/filer/tools/search_form.html:5 msgid "and" msgstr "e" -#: templates/admin/filer/tools/search_form.html:19 +#: templates/admin/filer/tools/search_form.html:7 msgid "cancel search" msgstr "cancelar a busca de" -#: templates/admin/filer/tools/upload_button_js.html:24 -#: templates/admin/filer/widgets/admin_file.html:7 -#: templates/admin/filer/widgets/admin_file.html:8 -msgid "file missing" -msgstr "arquivo faltando" +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "Limpar" -#: templates/admin/filer/tools/clipboard/clipboard.html:7 -msgid "Clipboard" -msgstr "Área de transferência" +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "ou arraste seu arquivo aqui" -#: templates/admin/filer/tools/clipboard/clipboard.html:19 -msgid "Paste all items here" -msgstr "Colar todos os itens aqui" +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "nenhum arquivo selecionado" -#: templates/admin/filer/tools/clipboard/clipboard.html:26 -msgid "discard" -msgstr "descartar" +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "Pesquisar" -#: templates/admin/filer/tools/clipboard/clipboard.html:26 -msgid "Move all clipboard files to" -msgstr "Mova todos os arquivos da área de transferência para" +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "Alterar Arquivo" -#: templates/admin/filer/tools/clipboard/clipboard.html:43 -msgid "the clipboard is empty" -msgstr "a área de transferência está vazia" +#: templates/admin/filer/widgets/admin_folder.html:16 +msgid "Choose Folder" +msgstr "" -#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:11 -msgid "upload failed" -msgstr "Falha no upload" +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" +msgstr "" -#: templates/admin/filer/widgets/admin_file.html:11 -msgid "no file selected" -msgstr "nenhum arquivo selecionado" +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" +msgstr "" -#: templates/admin/filer/widgets/admin_file.html:14 -#: templates/admin/filer/widgets/admin_file.html:15 -#: templates/admin/filer/widgets/admin_folder.html:7 -#: templates/admin/filer/widgets/admin_folder.html:8 -msgid "Lookup" -msgstr "Pesquisa" +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" +msgstr "" -#: templates/admin/filer/widgets/admin_file.html:17 -#: templates/admin/filer/widgets/admin_folder.html:10 -msgid "Clear" -msgstr "Limpar" +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" +msgstr "" -#: templates/admin/filer/widgets/admin_folder.html:5 -msgid "none selected" +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" msgstr "" -#: templates/image_filer/folder.html:3 -#, python-format -msgid "Folder '%(folder_label)s' files" -msgstr "Arquivos da pasta '%(folder_label)s'" +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." + +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" + +#~ msgid "Open file" +#~ msgstr "Open file" + +#~ msgid "Full size preview" +#~ msgstr "Full size preview" + +#~ msgid "Add Description" +#~ msgstr "Add Description" + +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" -#: templates/image_filer/folder.html:6 -msgid "File name" -msgstr "Nome do arquivo" +#~ msgid "none selected" +#~ msgstr "none selected" -#: templates/image_filer/image_export_form.html:17 -msgid "export" -msgstr "exportação" +#~ msgid "Add Folder" +#~ msgstr "Add Folder" -#: templates/image_filer/image_export_form.html:27 -msgid "download image" -msgstr "download da imagem" +#~ msgid "Subject Location" +#~ msgstr "Subject location" -#: templates/image_filer/include/export_dialog.html:13 -msgid "Folder name already taken." -msgstr "Nome da pasta já existe." +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" +#~ msgstr[1] "15c0f2d28d6dab1af1f6d94906beb627_pl_1" +#~ msgstr[2] "15c0f2d28d6dab1af1f6d94906beb627_pl_2" -#: templates/image_filer/include/export_dialog.html:15 -msgid "Submit" -msgstr "Enviar" +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/ru/LC_MESSAGES/django.mo b/filer/locale/ru/LC_MESSAGES/django.mo new file mode 100644 index 000000000..05996b220 Binary files /dev/null and b/filer/locale/ru/LC_MESSAGES/django.mo differ diff --git a/filer/locale/ru/LC_MESSAGES/django.po b/filer/locale/ru/LC_MESSAGES/django.po new file mode 100644 index 000000000..89f63fdbb --- /dev/null +++ b/filer/locale/ru/LC_MESSAGES/django.po @@ -0,0 +1,1263 @@ +# 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: +# Translators: +# Alexander Naydenko , 2020 +# Oleg Fish , 2017 +# Pavel , 2012 +# Pavel , 2012 +# Vladimir Puzakov , 2019 +msgid "" +msgstr "" +"Project-Id-Version: django Filer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: Alexander Naydenko , 2020\n" +"Language-Team: Russian (http://app.transifex.com/divio/django-filer/language/" +"ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=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/clipboardadmin.py:17 +msgid "You do not have permission to upload files." +msgstr "" + +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "" + +#: admin/clipboardadmin.py:20 +msgid "Can't use this folder, Permission Denied. Please select another folder." +msgstr "" + +#: admin/fileadmin.py:73 +msgid "Advanced" +msgstr "Дополнительно" + +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "канонический URL" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Для выполнения действий нужно выбрать хотя бы один объект. Не произведено " +"никаких изменений." + +#: admin/folderadmin.py:434 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s выбран" +msgstr[1] "%(total_count)s выбрано" +msgstr[2] "Все %(total_count)s выбраны" +msgstr[3] "Все %(total_count)s выбраны" + +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "Содержимое %(folder_name)s" + +#: admin/folderadmin.py:475 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 из %(cnt)s выбрано" + +#: admin/folderadmin.py:612 +msgid "No action selected." +msgstr "Действие не выбрано." + +#: admin/folderadmin.py:664 +#, python-format +msgid "Successfully moved %(count)d files to clipboard." +msgstr "Успешно перемещено %(count)d файлов в буфер обмена." + +#: admin/folderadmin.py:669 +msgid "Move selected files to clipboard" +msgstr "Переместить выбранные файлы в буфер обмена" + +#: admin/folderadmin.py:709 +#, python-format +msgid "Successfully disabled permissions for %(count)d files." +msgstr "Разрешения успешно отключены для %(count)d файлов." + +#: admin/folderadmin.py:711 +#, python-format +msgid "Successfully enabled permissions for %(count)d files." +msgstr "Разрешения успешно применены для %(count)d файлов." + +#: admin/folderadmin.py:719 +msgid "Enable permissions for selected files" +msgstr "Включить разрешения для выбранных файлов" + +#: admin/folderadmin.py:725 +msgid "Disable permissions for selected files" +msgstr "Отключить разрешения для выбранных файлов" + +#: admin/folderadmin.py:789 +#, python-format +msgid "Successfully deleted %(count)d files and/or folders." +msgstr "Успешно удалено %(count)d файлов/папок." + +#: admin/folderadmin.py:794 +msgid "Cannot delete files and/or folders" +msgstr "Невозможно удалить файлы/папки" + +#: admin/folderadmin.py:796 +msgid "Are you sure?" +msgstr "Вы уверены?" + +#: admin/folderadmin.py:802 +msgid "Delete files and/or folders" +msgstr "Удалить файлы/папки" + +#: admin/folderadmin.py:823 +msgid "Delete selected files and/or folders" +msgstr "Удалить выбранные файлы/папки" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "Папки с именами %s уже существуют в указанном месте" + +#: admin/folderadmin.py:934 +#, python-format +msgid "" +"Successfully moved %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "Успешно перемещено %(count)d файлов/папок в папку '%(destination)s'." + +#: admin/folderadmin.py:942 admin/folderadmin.py:944 +msgid "Move files and/or folders" +msgstr "Переместить файлы/папки" + +#: admin/folderadmin.py:959 +msgid "Move selected files and/or folders" +msgstr "Переместить выбранные файлы/папки" + +#: admin/folderadmin.py:1016 +#, python-format +msgid "Successfully renamed %(count)d files." +msgstr "Успешно переименовано %(count)d файлов." + +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 +msgid "Rename files" +msgstr "Переименовать файлы" + +#: admin/folderadmin.py:1137 +#, python-format +msgid "" +"Successfully copied %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "Успешно скопировано %(count)d файлов/папок в папку '%(destination)s'." + +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 +msgid "Copy files and/or folders" +msgstr "Скопировать файлы/папки" + +#: admin/folderadmin.py:1174 +msgid "Copy selected files and/or folders" +msgstr "Скопировать выбранные файлы/папки" + +#: admin/folderadmin.py:1279 +#, python-format +msgid "Successfully resized %(count)d images." +msgstr "Успешно изменен размер %(count)d изображений." + +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 +msgid "Resize images" +msgstr "Изменить размер изображений" + +#: admin/folderadmin.py:1303 +msgid "Resize selected images" +msgstr "Изменить размер выбранных изображений" + +#: admin/forms.py:24 +msgid "Suffix which will be appended to filenames of copied files." +msgstr "Окончание, которое будет добавлено к именам скопированных файлов." + +#: admin/forms.py:31 +#, python-format +msgid "" +"Suffix should be a valid, simple and lowercase filename part, like " +"\"%(valid)s\"." +msgstr "" +"Окончание должно быть правильной, простой и в нижнем регистре частью имени " +"файла, например \"%(valid)s\"." + +#: admin/forms.py:52 +#, python-format +msgid "Unknown rename format value key \"%(key)s\"." +msgstr "Неизвестный ключ форматирования \"%(key)s\"." + +#: admin/forms.py:54 +#, python-format +msgid "Invalid rename format: %(error)s." +msgstr "Неверный формат переименования: %(error)s." + +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 +msgid "thumbnail option" +msgstr "опция миниатюры" + +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 +msgid "width" +msgstr "ширина" + +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 +msgid "height" +msgstr "высота" + +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 +msgid "crop" +msgstr "обрезать" + +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 +msgid "upscale" +msgstr "увеличивать" + +#: admin/forms.py:79 +msgid "Thumbnail option or resize parameters must be choosen." +msgstr "Опция миниатюры или параметры изменения размера должны быть указаны." + +#: admin/imageadmin.py:20 admin/imageadmin.py:112 +msgid "Subject location" +msgstr "Расположение объекта" + +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "Расположение главного объекта сцены. Формат: \"x,y\"." + +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "Неверный формат расположения объекта." + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "Расположение объекта указано за пределами изображения." + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "Вы ввели: \"{subject_location}\". " + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" +msgstr "" + +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" +msgstr "" + +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "Папка с таким именем уже существует" + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "Filer" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "Медиа-библиотека" + +#: models/abstract.py:62 +msgid "default alt text" +msgstr "альтернативный текст" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "описание" + +#: models/abstract.py:76 +msgid "subject location" +msgstr "расположение объекта" + +#: models/abstract.py:91 +msgid "image" +msgstr "изображение" + +#: models/abstract.py:92 +msgid "images" +msgstr "изображения" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "" + +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." +msgstr "" + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 +msgid "user" +msgstr "пользователь" + +#: models/clipboardmodels.py:17 models/filemodels.py:157 +msgid "files" +msgstr "файлы" + +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 +msgid "clipboard" +msgstr "буфер обмена" + +#: models/clipboardmodels.py:25 +msgid "clipboards" +msgstr "буферы обмена" + +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 +msgid "file" +msgstr "файл" + +#: models/clipboardmodels.py:56 +msgid "clipboard item" +msgstr "элемент буфера обмена" + +#: models/clipboardmodels.py:57 +msgid "clipboard items" +msgstr "элементы буфера обмена" + +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "folder" +msgstr "папка" + +#: models/filemodels.py:81 +msgid "file size" +msgstr "размер файла" + +#: models/filemodels.py:87 +msgid "sha1" +msgstr "sha1" + +#: models/filemodels.py:94 +msgid "has all mandatory data" +msgstr "это обязательные данные" + +#: models/filemodels.py:100 +msgid "original filename" +msgstr "оригинальное имя файла" + +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 +msgid "name" +msgstr "имя" + +#: models/filemodels.py:116 +msgid "description" +msgstr "описание" + +#: models/filemodels.py:125 models/foldermodels.py:108 +msgid "owner" +msgstr "владелец" + +#: models/filemodels.py:129 models/foldermodels.py:116 +msgid "uploaded at" +msgstr "загружено" + +#: models/filemodels.py:134 models/foldermodels.py:126 +msgid "modified at" +msgstr "изменено" + +#: models/filemodels.py:140 +msgid "Permissions disabled" +msgstr "Разрешения отключены" + +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "" +"Отменить все проверки разрешений для этого файла. Файл будет доступен " +"публично для каждого." + +#: models/foldermodels.py:94 +msgid "parent" +msgstr "" + +#: models/foldermodels.py:121 +msgid "created at" +msgstr "создан" + +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Folder" +msgstr "Папка" + +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 +msgid "Folders" +msgstr "Папки" + +#: models/foldermodels.py:260 +msgid "all items" +msgstr "все элементы" + +#: models/foldermodels.py:261 +msgid "this item only" +msgstr "только этот элемент" + +#: models/foldermodels.py:262 +msgid "this item and all children" +msgstr "этот элемент и потомки" + +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "разрешить" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "запретить" + +#: models/foldermodels.py:280 +msgid "type" +msgstr "тип" + +#: models/foldermodels.py:297 +msgid "group" +msgstr "группа" + +#: models/foldermodels.py:304 +msgid "everybody" +msgstr "все" + +#: models/foldermodels.py:309 +msgid "can read" +msgstr "могут читать" + +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "могут редактировать" + +#: models/foldermodels.py:325 +msgid "can add children" +msgstr "могут добавлять потомков" + +#: models/foldermodels.py:333 +msgid "folder permission" +msgstr "разрешение папки" + +#: models/foldermodels.py:334 +msgid "folder permissions" +msgstr "разрешения папки" + +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." +msgstr "" + +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." +msgstr "" + +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." +msgstr "" + +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." +msgstr "" + +#: models/foldermodels.py:360 +msgid "All Folders" +msgstr "" + +#: models/foldermodels.py:362 +msgid "Logical Path" +msgstr "" + +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" +msgstr "" + +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" +msgstr "" + +#: models/foldermodels.py:375 +msgid "Everybody" +msgstr "" + +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "" + +#: models/foldermodels.py:389 +msgid "Read" +msgstr "" + +#: models/foldermodels.py:390 +msgid "Add children" +msgstr "" + +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "дата создания" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "автор" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "необходимо всегда указывать авторство" + +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "необходимо всегда указывать copyright" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "ширина в пикселях." + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "высота в пикселях." + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "опции миниатюры" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "Несортированные загрузки" + +#: models/virtualitems.py:73 +msgid "files with missing metadata" +msgstr "файлы с отсутсвующими метаданными" + +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "root" +msgstr "корень" + +#: settings.py:273 +msgid "Show table view" +msgstr "" + +#: settings.py:278 +msgid "Show thumbnail view" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Run the selected action" +msgstr "Выполнить выбранное действие" + +#: templates/admin/filer/actions.html:5 +msgid "Go" +msgstr "Выполнить" + +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +msgid "Click here to select the objects across all pages" +msgstr "Нажмите здесь, чтобы выбрать объекты на всех страницах" + +#: templates/admin/filer/actions.html:14 +#, python-format +msgid "Select all %(total_count)s files and/or folders" +msgstr "Выбрать все %(total_count)s файлов/папок" + +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 +msgid "Clear selection" +msgstr "Очистить выбор" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 +msgid "Go back to admin homepage" +msgstr "Вернуться на главную страницу администрирования" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 +msgid "Home" +msgstr "Домой" + +#: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 +msgid "Go back to Filer app" +msgstr "Вернуться на главную Filer'а" + +#: templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Go back to root folder" +msgstr "Вернуться в корневую папку" + +#: templates/admin/filer/breadcrumbs.html:8 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 +#, python-format +msgid "Go back to '%(folder_name)s' folder" +msgstr "Вернуться в папку \"%(folder_name)s\"" + +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "Дубликаты" + +#: templates/admin/filer/delete_selected_files_confirmation.html:11 +msgid "" +"Deleting the selected files and/or folders would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Удаление выбранных файлов/папок приведет к удалению связанных объектов, но у " +"вас нет прав удалять следующие объекты:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:19 +msgid "" +"Deleting the selected files and/or folders would require deleting the " +"following protected related objects:" +msgstr "" +"Удаление выбранных файлов/папок потребует удаления следующих защищенных " +"связанных объектов:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:27 +msgid "" +"Are you sure you want to delete the selected files and/or folders? All of " +"the following objects and their related items will be deleted:" +msgstr "" +"Вы уверены, что хотите удалить выбранные файлы/папки? Следующие объекты " +"вместе со связанными объектами будут удалены:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "Нет, пустите меня обратно" + +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "Да, я уверен" + +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 +msgid "History" +msgstr "История" + +#: templates/admin/filer/file/change_form.html:37 +#: templates/admin/filer/folder/change_form.html:23 +#: templates/admin/filer/image/change_form.html:37 +msgid "View on site" +msgstr "Посмотреть на сайте" + +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "Вернуться к" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "главная страница администрирования" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 +msgid "Folder Icon" +msgstr "Иконка папки" + +#: templates/admin/filer/folder/choose_copy_destination.html:23 +msgid "" +"Your account doesn't have permissions to copy all of the selected files and/" +"or folders." +msgstr "У вас нет прав на копирование выбранных файлов/папок" + +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "Пустите меня обратно" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 +msgid "There are no destination folders available." +msgstr "Нет доступной целевой папки." + +#: templates/admin/filer/folder/choose_copy_destination.html:35 +msgid "There are no files and/or folders available to copy." +msgstr "Нет файлов для копирования." + +#: templates/admin/filer/folder/choose_copy_destination.html:40 +msgid "" +"The following files and/or folders will be copied to a destination folder " +"(retaining their tree structure):" +msgstr "" +"Эти файлы/папки будут скопированы в целевую папку (с сохранением " +"иерархичности):" + +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 +msgid "Destination folder:" +msgstr "Целевая папка:" + +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 +msgid "Copy" +msgstr "Копировать" + +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "Копирование файлов в ту же самую папку запрещено" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 +msgid "" +"Your account doesn't have permissions to resize all of the selected images." +msgstr "Вы не имеете прав для изменения размеров выбранных изображений." + +#: templates/admin/filer/folder/choose_images_resize_options.html:18 +msgid "There are no images available to resize." +msgstr "Нет доступных изображений для изменения размеров." + +#: templates/admin/filer/folder/choose_images_resize_options.html:20 +msgid "The following images will be resized:" +msgstr "У этих изображений будет изменен размер:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:32 +msgid "Choose an existing thumbnail option or enter resize parameters:" +msgstr "Выберите опцию миниатюры или введите параметры изменения размеров:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:36 +msgid "" +"Warning: Images will be resized in-place and originals will be lost. Maybe " +"first make a copy of them to retain the originals." +msgstr "" +"Внимание: изображения будут изменены в размерах с заменой оригиналов. " +"Возможно, лучше будет сперва сделать копии." + +#: templates/admin/filer/folder/choose_images_resize_options.html:39 +msgid "Resize" +msgstr "Изменить размеры" + +#: templates/admin/filer/folder/choose_move_destination.html:35 +msgid "" +"Your account doesn't have permissions to move all of the selected files and/" +"or folders." +msgstr "Вы не имеете прав для перемещения выбранных файлов/папок." + +#: templates/admin/filer/folder/choose_move_destination.html:47 +msgid "There are no files and/or folders available to move." +msgstr "Нет файлов/папок для перемещения." + +#: templates/admin/filer/folder/choose_move_destination.html:52 +msgid "" +"The following files and/or folders will be moved to a destination folder " +"(retaining their tree structure):" +msgstr "" +"Следующие файлы/папки будут перемещены в целевую папку (сохраняя " +"иерархичность):" + +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 +msgid "Move" +msgstr "Переместить" + +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "Перемещение файлов в ту же самую папку запрещено" + +#: templates/admin/filer/folder/choose_rename_format.html:15 +msgid "" +"Your account doesn't have permissions to rename all of the selected files." +msgstr "У вас нет прав на переименование выбранных файлов." + +#: templates/admin/filer/folder/choose_rename_format.html:18 +msgid "There are no files available to rename." +msgstr "Нет файлов для переименовывания." + +#: templates/admin/filer/folder/choose_rename_format.html:20 +msgid "" +"The following files will be renamed (they will stay in their folders and " +"keep original filename, only displayed filename will be changed):" +msgstr "" +"Эти файлы будут переименованы (они остануться в их папках и сохранят имена " +"оригинальных файлов, только отображаемое имя измениться):" + +#: templates/admin/filer/folder/choose_rename_format.html:59 +msgid "Rename" +msgstr "Переименовать" + +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "Возвратиться к родительской папке" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "Изменить текущую папку" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "Изменить" + +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "Нажмите здесь для поиска по введенной фразе" + +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "Поиск" + +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "Закрыть" + +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "Ограничить" + +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "Отметьте, чтобы ограничить поиск текущей папкой" + +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "Ограничить поиск текущей папкой" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "Удалить" + +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "Добавляет новую папку" + +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "Новая папка" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "Загрузить файлы" + +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "Сначала надо выбрать папку" + +#: templates/admin/filer/folder/directory_table_list.html:16 +msgid "Name" +msgstr "Имя" + +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "Владелец" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "Размер" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "Действие" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 +#, python-format +msgid "Change '%(item_label)s' folder details" +msgstr "Изменить данные папки \"%(item_label)s\"" + +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "%(counter)s папка" +msgstr[1] "%(counter)s папки" +msgstr[2] "%(counter)s папок" +msgstr[3] "%(counter)s папок" + +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "%(counter)s файл" +msgstr[1] "%(counter)s файла" +msgstr[2] "%(counter)s файлов" +msgstr[3] "%(counter)s файлов" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "Изменить свойства папки" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "Удалить папку" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 +msgid "Select this file" +msgstr "Выбрать этот файл" + +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 +#, python-format +msgid "Change '%(item_label)s' details" +msgstr "Изменить данные \"%(item_label)s\"" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "Permissions" +msgstr "Разрешения" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "disabled" +msgstr "отключены" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "enabled" +msgstr "включены" + +#: templates/admin/filer/folder/directory_table_list.html:144 +#, fuzzy +#| msgid "Move selected files to clipboard" +msgid "URL copied to clipboard" +msgstr "Переместить выбранные файлы в буфер обмена" + +#: templates/admin/filer/folder/directory_table_list.html:147 +#, python-format +msgid "Canonical url '%(item_label)s'" +msgstr "Канонический URL '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:151 +#, python-format +msgid "Download '%(item_label)s'" +msgstr "Скачать '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "Удалить файл" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "\"Скиньте\" сюда файлы или используйте кнопку \"Загрузить файлы\"" + +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "\"Скиньте\" ваши файлы сюда для загрузки в:" + +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "Загрузить" + +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "отмена" + +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "Загрузка успешно завершена!" + +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "Загрузка отменена!" + +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 +msgid "previous" +msgstr "предыдущая" + +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 +#, python-format +msgid "Page %(number)s of %(num_pages)s." +msgstr "Страница %(number)s из %(num_pages)s." + +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 +msgid "next" +msgstr "следующая" + +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "Выбрать все %(total_count)s" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +msgid "Select all" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +msgid "Files" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +msgid "Add new" +msgstr "Добавить новую" + +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" +msgstr "Система администрирования Django" + +#: templates/admin/filer/folder/new_folder_form.html:15 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Пожалуйста, исправьте указанную ошибку." +msgstr[1] "Пожалуйста, исправьте указанные ошибки." +msgstr[2] "Пожалуйста, исправьте указанные ошибки." +msgstr[3] "Пожалуйста, исправьте указанные ошибки." + +#: templates/admin/filer/folder/new_folder_form.html:30 +msgid "Save" +msgstr "Сохранить" + +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "Буфер обмена" + +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "Вставить все элементы здесь" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "Переместить элементы буфера обмена в" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "Пустой буфер обмена" + +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "буфер обмена пуст" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "загрузка не удалась" + +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +msgid "File is missing" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "Тип" + +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "Размер файла" + +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "Изменен" + +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "Создан" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "found" +msgstr "найдено" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "and" +msgstr "и" + +#: templates/admin/filer/tools/search_form.html:7 +msgid "cancel search" +msgstr "закрыть поиск" + +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "Очистить" + +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "или \"скиньте\" ваш файл сюда" + +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "файл не выбран" + +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "Выбрать" + +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "Выбрать файл" + +#: templates/admin/filer/widgets/admin_folder.html:16 +msgid "Choose Folder" +msgstr "" + +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" +msgstr "" + +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" +msgstr "" + +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" +msgstr "" + +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" +msgstr "" + +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" +msgstr "" + +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." + +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" + +#~ msgid "Open file" +#~ msgstr "Open file" + +#~ msgid "Full size preview" +#~ msgstr "Full size preview" + +#~ msgid "Add Description" +#~ msgstr "Add Description" + +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" + +#~ msgid "none selected" +#~ msgstr "none selected" + +#~ msgid "Add Folder" +#~ msgstr "Add Folder" + +#~ msgid "Subject Location" +#~ msgstr "Subject location" + +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" +#~ msgstr[1] "15c0f2d28d6dab1af1f6d94906beb627_pl_1" +#~ msgstr[2] "15c0f2d28d6dab1af1f6d94906beb627_pl_2" +#~ msgstr[3] "15c0f2d28d6dab1af1f6d94906beb627_pl_3" + +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/sk/LC_MESSAGES/django.mo b/filer/locale/sk/LC_MESSAGES/django.mo new file mode 100644 index 000000000..439890714 Binary files /dev/null and b/filer/locale/sk/LC_MESSAGES/django.mo differ diff --git a/filer/locale/sk/LC_MESSAGES/django.po b/filer/locale/sk/LC_MESSAGES/django.po new file mode 100644 index 000000000..5edca14bd --- /dev/null +++ b/filer/locale/sk/LC_MESSAGES/django.po @@ -0,0 +1,1235 @@ +# 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: +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django Filer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: Angelo Dini \n" +"Language-Team: Slovak (http://app.transifex.com/divio/django-filer/language/" +"sk/)\n" +"Language: sk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n " +">= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" + +#: admin/clipboardadmin.py:17 +msgid "You do not have permission to upload files." +msgstr "" + +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "" + +#: admin/clipboardadmin.py:20 +msgid "Can't use this folder, Permission Denied. Please select another folder." +msgstr "" + +#: admin/fileadmin.py:73 +msgid "Advanced" +msgstr "" + +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" + +#: admin/folderadmin.py:434 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "" + +#: admin/folderadmin.py:475 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "" + +#: admin/folderadmin.py:612 +msgid "No action selected." +msgstr "" + +#: admin/folderadmin.py:664 +#, python-format +msgid "Successfully moved %(count)d files to clipboard." +msgstr "" + +#: admin/folderadmin.py:669 +msgid "Move selected files to clipboard" +msgstr "" + +#: admin/folderadmin.py:709 +#, python-format +msgid "Successfully disabled permissions for %(count)d files." +msgstr "" + +#: admin/folderadmin.py:711 +#, python-format +msgid "Successfully enabled permissions for %(count)d files." +msgstr "" + +#: admin/folderadmin.py:719 +msgid "Enable permissions for selected files" +msgstr "" + +#: admin/folderadmin.py:725 +msgid "Disable permissions for selected files" +msgstr "" + +#: admin/folderadmin.py:789 +#, python-format +msgid "Successfully deleted %(count)d files and/or folders." +msgstr "" + +#: admin/folderadmin.py:794 +msgid "Cannot delete files and/or folders" +msgstr "" + +#: admin/folderadmin.py:796 +msgid "Are you sure?" +msgstr "" + +#: admin/folderadmin.py:802 +msgid "Delete files and/or folders" +msgstr "" + +#: admin/folderadmin.py:823 +msgid "Delete selected files and/or folders" +msgstr "" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "" + +#: admin/folderadmin.py:934 +#, python-format +msgid "" +"Successfully moved %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" + +#: admin/folderadmin.py:942 admin/folderadmin.py:944 +msgid "Move files and/or folders" +msgstr "" + +#: admin/folderadmin.py:959 +msgid "Move selected files and/or folders" +msgstr "" + +#: admin/folderadmin.py:1016 +#, python-format +msgid "Successfully renamed %(count)d files." +msgstr "" + +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 +msgid "Rename files" +msgstr "" + +#: admin/folderadmin.py:1137 +#, python-format +msgid "" +"Successfully copied %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" + +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 +msgid "Copy files and/or folders" +msgstr "" + +#: admin/folderadmin.py:1174 +msgid "Copy selected files and/or folders" +msgstr "" + +#: admin/folderadmin.py:1279 +#, python-format +msgid "Successfully resized %(count)d images." +msgstr "" + +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 +msgid "Resize images" +msgstr "" + +#: admin/folderadmin.py:1303 +msgid "Resize selected images" +msgstr "" + +#: admin/forms.py:24 +msgid "Suffix which will be appended to filenames of copied files." +msgstr "" + +#: admin/forms.py:31 +#, python-format +msgid "" +"Suffix should be a valid, simple and lowercase filename part, like " +"\"%(valid)s\"." +msgstr "" + +#: admin/forms.py:52 +#, python-format +msgid "Unknown rename format value key \"%(key)s\"." +msgstr "" + +#: admin/forms.py:54 +#, python-format +msgid "Invalid rename format: %(error)s." +msgstr "" + +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 +msgid "thumbnail option" +msgstr "" + +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 +msgid "width" +msgstr "" + +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 +msgid "height" +msgstr "" + +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 +msgid "crop" +msgstr "" + +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 +msgid "upscale" +msgstr "" + +#: admin/forms.py:79 +msgid "Thumbnail option or resize parameters must be choosen." +msgstr "" + +#: admin/imageadmin.py:20 admin/imageadmin.py:112 +msgid "Subject location" +msgstr "" + +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "" + +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "" + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "" + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "" + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" +msgstr "" + +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" +msgstr "" + +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "" + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "" + +#: models/abstract.py:62 +msgid "default alt text" +msgstr "" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "" + +#: models/abstract.py:76 +msgid "subject location" +msgstr "" + +#: models/abstract.py:91 +msgid "image" +msgstr "" + +#: models/abstract.py:92 +msgid "images" +msgstr "" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "" + +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." +msgstr "" + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 +msgid "user" +msgstr "" + +#: models/clipboardmodels.py:17 models/filemodels.py:157 +msgid "files" +msgstr "" + +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 +msgid "clipboard" +msgstr "" + +#: models/clipboardmodels.py:25 +msgid "clipboards" +msgstr "" + +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 +msgid "file" +msgstr "" + +#: models/clipboardmodels.py:56 +msgid "clipboard item" +msgstr "" + +#: models/clipboardmodels.py:57 +msgid "clipboard items" +msgstr "" + +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "folder" +msgstr "" + +#: models/filemodels.py:81 +msgid "file size" +msgstr "" + +#: models/filemodels.py:87 +msgid "sha1" +msgstr "" + +#: models/filemodels.py:94 +msgid "has all mandatory data" +msgstr "" + +#: models/filemodels.py:100 +msgid "original filename" +msgstr "" + +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 +msgid "name" +msgstr "" + +#: models/filemodels.py:116 +msgid "description" +msgstr "" + +#: models/filemodels.py:125 models/foldermodels.py:108 +msgid "owner" +msgstr "" + +#: models/filemodels.py:129 models/foldermodels.py:116 +msgid "uploaded at" +msgstr "" + +#: models/filemodels.py:134 models/foldermodels.py:126 +msgid "modified at" +msgstr "" + +#: models/filemodels.py:140 +msgid "Permissions disabled" +msgstr "" + +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "" + +#: models/foldermodels.py:94 +msgid "parent" +msgstr "" + +#: models/foldermodels.py:121 +msgid "created at" +msgstr "" + +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Folder" +msgstr "" + +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 +msgid "Folders" +msgstr "" + +#: models/foldermodels.py:260 +msgid "all items" +msgstr "" + +#: models/foldermodels.py:261 +msgid "this item only" +msgstr "" + +#: models/foldermodels.py:262 +msgid "this item and all children" +msgstr "" + +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "" + +#: models/foldermodels.py:280 +msgid "type" +msgstr "" + +#: models/foldermodels.py:297 +msgid "group" +msgstr "" + +#: models/foldermodels.py:304 +msgid "everybody" +msgstr "" + +#: models/foldermodels.py:309 +msgid "can read" +msgstr "" + +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "" + +#: models/foldermodels.py:325 +msgid "can add children" +msgstr "" + +#: models/foldermodels.py:333 +msgid "folder permission" +msgstr "" + +#: models/foldermodels.py:334 +msgid "folder permissions" +msgstr "" + +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." +msgstr "" + +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." +msgstr "" + +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." +msgstr "" + +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." +msgstr "" + +#: models/foldermodels.py:360 +msgid "All Folders" +msgstr "" + +#: models/foldermodels.py:362 +msgid "Logical Path" +msgstr "" + +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" +msgstr "" + +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" +msgstr "" + +#: models/foldermodels.py:375 +msgid "Everybody" +msgstr "" + +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "" + +#: models/foldermodels.py:389 +msgid "Read" +msgstr "" + +#: models/foldermodels.py:390 +msgid "Add children" +msgstr "" + +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "" + +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "" + +#: models/virtualitems.py:73 +msgid "files with missing metadata" +msgstr "" + +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "root" +msgstr "" + +#: settings.py:273 +msgid "Show table view" +msgstr "" + +#: settings.py:278 +msgid "Show thumbnail view" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Run the selected action" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Go" +msgstr "" + +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +msgid "Click here to select the objects across all pages" +msgstr "" + +#: templates/admin/filer/actions.html:14 +#, python-format +msgid "Select all %(total_count)s files and/or folders" +msgstr "" + +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 +msgid "Clear selection" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 +msgid "Go back to admin homepage" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 +msgid "Home" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 +msgid "Go back to Filer app" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Go back to root folder" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:8 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 +#, python-format +msgid "Go back to '%(folder_name)s' folder" +msgstr "" + +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:11 +msgid "" +"Deleting the selected files and/or folders would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:19 +msgid "" +"Deleting the selected files and/or folders would require deleting the " +"following protected related objects:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:27 +msgid "" +"Are you sure you want to delete the selected files and/or folders? All of " +"the following objects and their related items will be deleted:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "" + +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 +msgid "History" +msgstr "" + +#: templates/admin/filer/file/change_form.html:37 +#: templates/admin/filer/folder/change_form.html:23 +#: templates/admin/filer/image/change_form.html:37 +msgid "View on site" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 +msgid "Folder Icon" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:23 +msgid "" +"Your account doesn't have permissions to copy all of the selected files and/" +"or folders." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 +msgid "There are no destination folders available." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:35 +msgid "There are no files and/or folders available to copy." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:40 +msgid "" +"The following files and/or folders will be copied to a destination folder " +"(retaining their tree structure):" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 +msgid "Destination folder:" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 +msgid "Copy" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 +msgid "" +"Your account doesn't have permissions to resize all of the selected images." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:18 +msgid "There are no images available to resize." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:20 +msgid "The following images will be resized:" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:32 +msgid "Choose an existing thumbnail option or enter resize parameters:" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:36 +msgid "" +"Warning: Images will be resized in-place and originals will be lost. Maybe " +"first make a copy of them to retain the originals." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:39 +msgid "Resize" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:35 +msgid "" +"Your account doesn't have permissions to move all of the selected files and/" +"or folders." +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:47 +msgid "There are no files and/or folders available to move." +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:52 +msgid "" +"The following files and/or folders will be moved to a destination folder " +"(retaining their tree structure):" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 +msgid "Move" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:15 +msgid "" +"Your account doesn't have permissions to rename all of the selected files." +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:18 +msgid "There are no files available to rename." +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:20 +msgid "" +"The following files will be renamed (they will stay in their folders and " +"keep original filename, only displayed filename will be changed):" +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:59 +msgid "Rename" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:16 +msgid "Name" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 +#, python-format +msgid "Change '%(item_label)s' folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 +msgid "Select this file" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 +#, python-format +msgid "Change '%(item_label)s' details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "Permissions" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "disabled" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "enabled" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:144 +msgid "URL copied to clipboard" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:147 +#, python-format +msgid "Canonical url '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:151 +#, python-format +msgid "Download '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 +msgid "previous" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 +#, python-format +msgid "Page %(number)s of %(num_pages)s." +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 +msgid "next" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +msgid "Select all" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +msgid "Files" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +msgid "Add new" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:15 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: templates/admin/filer/folder/new_folder_form.html:30 +msgid "Save" +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +msgid "File is missing" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "found" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "and" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:7 +msgid "cancel search" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "" + +#: templates/admin/filer/widgets/admin_folder.html:16 +msgid "Choose Folder" +msgstr "" + +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" +msgstr "" + +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" +msgstr "" + +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" +msgstr "" + +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" +msgstr "" + +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" +msgstr "" + +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." + +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" + +#~ msgid "Open file" +#~ msgstr "Open file" + +#~ msgid "Full size preview" +#~ msgstr "Full size preview" + +#~ msgid "Add Description" +#~ msgstr "Add Description" + +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" + +#~ msgid "none selected" +#~ msgstr "none selected" + +#~ msgid "Add Folder" +#~ msgstr "Add Folder" + +#~ msgid "Subject Location" +#~ msgstr "Subject location" + +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" +#~ msgstr[1] "15c0f2d28d6dab1af1f6d94906beb627_pl_1" +#~ msgstr[2] "15c0f2d28d6dab1af1f6d94906beb627_pl_2" +#~ msgstr[3] "15c0f2d28d6dab1af1f6d94906beb627_pl_3" + +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/tr/LC_MESSAGES/django.mo b/filer/locale/tr/LC_MESSAGES/django.mo new file mode 100644 index 000000000..d1049348f Binary files /dev/null and b/filer/locale/tr/LC_MESSAGES/django.mo differ diff --git a/filer/locale/tr/LC_MESSAGES/django.po b/filer/locale/tr/LC_MESSAGES/django.po new file mode 100644 index 000000000..2437c3922 --- /dev/null +++ b/filer/locale/tr/LC_MESSAGES/django.po @@ -0,0 +1,1230 @@ +# 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: +# Translators: +# Cihad GÜNDOĞDU , 2013,2015-2016 +# Cihad GÜNDOĞDU , 2013 +msgid "" +msgstr "" +"Project-Id-Version: django Filer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: Cihad GÜNDOĞDU , 2013,2015-2016\n" +"Language-Team: Turkish (http://app.transifex.com/divio/django-filer/language/" +"tr/)\n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: admin/clipboardadmin.py:17 +msgid "You do not have permission to upload files." +msgstr "" + +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "" + +#: admin/clipboardadmin.py:20 +msgid "Can't use this folder, Permission Denied. Please select another folder." +msgstr "" + +#: admin/fileadmin.py:73 +msgid "Advanced" +msgstr "Gelişmiş" + +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "standart URL" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" + +#: admin/folderadmin.py:434 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "" +msgstr[1] "" + +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "" + +#: admin/folderadmin.py:475 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "%(cnt)s 0 adet seçildi" + +#: admin/folderadmin.py:612 +msgid "No action selected." +msgstr "İşlem seçilmedi" + +#: admin/folderadmin.py:664 +#, python-format +msgid "Successfully moved %(count)d files to clipboard." +msgstr "%(count)d adet dosya arabelleğe taşındı" + +#: admin/folderadmin.py:669 +msgid "Move selected files to clipboard" +msgstr "Seçili dosyalar ara belleğe alındı" + +#: admin/folderadmin.py:709 +#, python-format +msgid "Successfully disabled permissions for %(count)d files." +msgstr "%(count)d adet dosyanın yetkilendirmesi pasif hale getirildi." + +#: admin/folderadmin.py:711 +#, python-format +msgid "Successfully enabled permissions for %(count)d files." +msgstr "%(count)d adet dosyanın yetkilendirmesi pasif hale getirildi." + +#: admin/folderadmin.py:719 +msgid "Enable permissions for selected files" +msgstr "Seçili dosyalar için yetkilendirmeyi aktif yap" + +#: admin/folderadmin.py:725 +msgid "Disable permissions for selected files" +msgstr "Seçili dosyalar için yetkilendirmeyi pasif yap" + +#: admin/folderadmin.py:789 +#, python-format +msgid "Successfully deleted %(count)d files and/or folders." +msgstr "%(count)d dosya veya klasörler başarıyla silindi" + +#: admin/folderadmin.py:794 +msgid "Cannot delete files and/or folders" +msgstr "Seçili dosya veya klasörler silinemedi" + +#: admin/folderadmin.py:796 +msgid "Are you sure?" +msgstr "Eminmisiniz?" + +#: admin/folderadmin.py:802 +msgid "Delete files and/or folders" +msgstr "Dosya veya klasörleri sil" + +#: admin/folderadmin.py:823 +msgid "Delete selected files and/or folders" +msgstr "Seçili dosya veya klasörleri sil" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "%s isimli klasörler seçili hedefte var." + +#: admin/folderadmin.py:934 +#, python-format +msgid "" +"Successfully moved %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" +"%(count)d adet dosya/klasör başarıyla '%(destination)s' klasörüne taşındı" + +#: admin/folderadmin.py:942 admin/folderadmin.py:944 +msgid "Move files and/or folders" +msgstr "Dosya veya klasörleri taşı" + +#: admin/folderadmin.py:959 +msgid "Move selected files and/or folders" +msgstr "Seçili dosya veya klasörleri taşı" + +#: admin/folderadmin.py:1016 +#, python-format +msgid "Successfully renamed %(count)d files." +msgstr "%(count)d adet dosya yeniden adlandırıldı." + +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 +msgid "Rename files" +msgstr "Dosyaları yeniden adlandır" + +#: admin/folderadmin.py:1137 +#, python-format +msgid "" +"Successfully copied %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" +"%(count)d adet dosya veya klasör '%(destination)s' klasörüne kopyalandı" + +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 +msgid "Copy files and/or folders" +msgstr "Dosya veya klasörleri kopyala" + +#: admin/folderadmin.py:1174 +msgid "Copy selected files and/or folders" +msgstr "Seçili dosya veya klasörleri kopyala" + +#: admin/folderadmin.py:1279 +#, python-format +msgid "Successfully resized %(count)d images." +msgstr "%(count)d adet resim başarıyla yeniden boyutlandırıldı." + +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 +msgid "Resize images" +msgstr "Resimleri yeniden boyutlandır" + +#: admin/folderadmin.py:1303 +msgid "Resize selected images" +msgstr "Seçili resimleri yeniden boyutlandır" + +#: admin/forms.py:24 +msgid "Suffix which will be appended to filenames of copied files." +msgstr "" + +#: admin/forms.py:31 +#, python-format +msgid "" +"Suffix should be a valid, simple and lowercase filename part, like " +"\"%(valid)s\"." +msgstr "" + +#: admin/forms.py:52 +#, python-format +msgid "Unknown rename format value key \"%(key)s\"." +msgstr "" + +#: admin/forms.py:54 +#, python-format +msgid "Invalid rename format: %(error)s." +msgstr "" + +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 +msgid "thumbnail option" +msgstr "" + +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 +msgid "width" +msgstr "genişlil" + +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 +msgid "height" +msgstr "yükseklik" + +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 +msgid "crop" +msgstr "kırp" + +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 +msgid "upscale" +msgstr "" + +#: admin/forms.py:79 +msgid "Thumbnail option or resize parameters must be choosen." +msgstr "" + +#: admin/imageadmin.py:20 admin/imageadmin.py:112 +msgid "Subject location" +msgstr "" + +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "" + +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "" + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "" + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "" + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" +msgstr "" + +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" +msgstr "" + +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "Bu isimde dizin zaten var" + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "" + +#: models/abstract.py:62 +msgid "default alt text" +msgstr "" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "" + +#: models/abstract.py:76 +msgid "subject location" +msgstr "" + +#: models/abstract.py:91 +msgid "image" +msgstr "" + +#: models/abstract.py:92 +msgid "images" +msgstr "" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "" + +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." +msgstr "" + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 +msgid "user" +msgstr "kullanıcı" + +#: models/clipboardmodels.py:17 models/filemodels.py:157 +msgid "files" +msgstr "dosyalar" + +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 +msgid "clipboard" +msgstr "ara bellek" + +#: models/clipboardmodels.py:25 +msgid "clipboards" +msgstr "ara bellekler" + +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 +msgid "file" +msgstr "dosya" + +#: models/clipboardmodels.py:56 +msgid "clipboard item" +msgstr "arabellek nesnesi" + +#: models/clipboardmodels.py:57 +msgid "clipboard items" +msgstr "" + +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "folder" +msgstr "klasör" + +#: models/filemodels.py:81 +msgid "file size" +msgstr "dosya boyutu" + +#: models/filemodels.py:87 +msgid "sha1" +msgstr "sha1" + +#: models/filemodels.py:94 +msgid "has all mandatory data" +msgstr "" + +#: models/filemodels.py:100 +msgid "original filename" +msgstr "orjinal dosya adı" + +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 +msgid "name" +msgstr "isim" + +#: models/filemodels.py:116 +msgid "description" +msgstr "açıklama" + +#: models/filemodels.py:125 models/foldermodels.py:108 +msgid "owner" +msgstr "sahib" + +#: models/filemodels.py:129 models/foldermodels.py:116 +msgid "uploaded at" +msgstr "yüklendi" + +#: models/filemodels.py:134 models/foldermodels.py:126 +msgid "modified at" +msgstr "düzenlendi" + +#: models/filemodels.py:140 +msgid "Permissions disabled" +msgstr "Yetkiler pasifleştirildi" + +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "" + +#: models/foldermodels.py:94 +msgid "parent" +msgstr "" + +#: models/foldermodels.py:121 +msgid "created at" +msgstr "" + +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Folder" +msgstr "" + +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 +msgid "Folders" +msgstr "" + +#: models/foldermodels.py:260 +msgid "all items" +msgstr "tüm elemanlar" + +#: models/foldermodels.py:261 +msgid "this item only" +msgstr "sadece bu eleman" + +#: models/foldermodels.py:262 +msgid "this item and all children" +msgstr "bu eleman ve alt elemanlar" + +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "izin ver" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "engelle" + +#: models/foldermodels.py:280 +msgid "type" +msgstr "tip" + +#: models/foldermodels.py:297 +msgid "group" +msgstr "grup" + +#: models/foldermodels.py:304 +msgid "everybody" +msgstr "herkes" + +#: models/foldermodels.py:309 +msgid "can read" +msgstr "okuyabilir" + +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "düzenleyebilir" + +#: models/foldermodels.py:325 +msgid "can add children" +msgstr "alt eleman ekleyebilir" + +#: models/foldermodels.py:333 +msgid "folder permission" +msgstr "dizin yetki" + +#: models/foldermodels.py:334 +msgid "folder permissions" +msgstr "dizin yetkileri" + +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." +msgstr "" + +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." +msgstr "" + +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." +msgstr "" + +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." +msgstr "" + +#: models/foldermodels.py:360 +msgid "All Folders" +msgstr "" + +#: models/foldermodels.py:362 +msgid "Logical Path" +msgstr "" + +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" +msgstr "" + +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" +msgstr "" + +#: models/foldermodels.py:375 +msgid "Everybody" +msgstr "" + +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "" + +#: models/foldermodels.py:389 +msgid "Read" +msgstr "" + +#: models/foldermodels.py:390 +msgid "Add children" +msgstr "" + +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "" + +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "" + +#: models/virtualitems.py:73 +msgid "files with missing metadata" +msgstr "" + +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "root" +msgstr "kök" + +#: settings.py:273 +msgid "Show table view" +msgstr "" + +#: settings.py:278 +msgid "Show thumbnail view" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Run the selected action" +msgstr "Seçili aksiyonu çalışıtır" + +#: templates/admin/filer/actions.html:5 +msgid "Go" +msgstr "Git" + +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +msgid "Click here to select the objects across all pages" +msgstr "" + +#: templates/admin/filer/actions.html:14 +#, python-format +msgid "Select all %(total_count)s files and/or folders" +msgstr "" + +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 +msgid "Clear selection" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 +msgid "Go back to admin homepage" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 +msgid "Home" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 +msgid "Go back to Filer app" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Go back to root folder" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:8 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 +#, python-format +msgid "Go back to '%(folder_name)s' folder" +msgstr "" + +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:11 +msgid "" +"Deleting the selected files and/or folders would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:19 +msgid "" +"Deleting the selected files and/or folders would require deleting the " +"following protected related objects:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:27 +msgid "" +"Are you sure you want to delete the selected files and/or folders? All of " +"the following objects and their related items will be deleted:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "" + +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 +msgid "History" +msgstr "" + +#: templates/admin/filer/file/change_form.html:37 +#: templates/admin/filer/folder/change_form.html:23 +#: templates/admin/filer/image/change_form.html:37 +msgid "View on site" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 +msgid "Folder Icon" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:23 +msgid "" +"Your account doesn't have permissions to copy all of the selected files and/" +"or folders." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 +msgid "There are no destination folders available." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:35 +msgid "There are no files and/or folders available to copy." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:40 +msgid "" +"The following files and/or folders will be copied to a destination folder " +"(retaining their tree structure):" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 +msgid "Destination folder:" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 +msgid "Copy" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 +msgid "" +"Your account doesn't have permissions to resize all of the selected images." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:18 +msgid "There are no images available to resize." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:20 +msgid "The following images will be resized:" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:32 +msgid "Choose an existing thumbnail option or enter resize parameters:" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:36 +msgid "" +"Warning: Images will be resized in-place and originals will be lost. Maybe " +"first make a copy of them to retain the originals." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:39 +msgid "Resize" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:35 +msgid "" +"Your account doesn't have permissions to move all of the selected files and/" +"or folders." +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:47 +msgid "There are no files and/or folders available to move." +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:52 +msgid "" +"The following files and/or folders will be moved to a destination folder " +"(retaining their tree structure):" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 +msgid "Move" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:15 +msgid "" +"Your account doesn't have permissions to rename all of the selected files." +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:18 +msgid "There are no files available to rename." +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:20 +msgid "" +"The following files will be renamed (they will stay in their folders and " +"keep original filename, only displayed filename will be changed):" +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:59 +msgid "Rename" +msgstr "Yeniden adlandır" + +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "Ara" + +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "Geçerli klasörün aramalarını sınırla" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "Sil" + +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "Yeni Klasör Ekle" + +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "Yeni Klasör" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "Dosyaları Yükle" + +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "Önce bir klasör seçmelisin" + +#: templates/admin/filer/folder/directory_table_list.html:16 +msgid "Name" +msgstr "İsim" + +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "Sahip" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "Boyut" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "İşlem" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 +#, python-format +msgid "Change '%(item_label)s' folder details" +msgstr "'%(item_label)s' klasör detaylarını değiştir" + +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "" +msgstr[1] "" + +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "" +msgstr[1] "" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "Klasör detaylarını değiştir" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "Klasörü kaldır" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 +msgid "Select this file" +msgstr "Bu dosyayı seç" + +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 +#, python-format +msgid "Change '%(item_label)s' details" +msgstr "'%(item_label)s' detaylarını değiştir" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "Permissions" +msgstr "Yetkiler" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "disabled" +msgstr "pasif" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "enabled" +msgstr "aktif" + +#: templates/admin/filer/folder/directory_table_list.html:144 +#, fuzzy +#| msgid "Move selected files to clipboard" +msgid "URL copied to clipboard" +msgstr "Seçili dosyalar ara belleğe alındı" + +#: templates/admin/filer/folder/directory_table_list.html:147 +#, python-format +msgid "Canonical url '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:151 +#, python-format +msgid "Download '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "Dosyayı kaldır" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "Buraya dosya yüklemek için \"Dosyaları Yükle\" düğmesine tıklayın" + +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "Yüklenecek dosyayı buraya bırakın" + +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "Yükle" + +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "iptal" + +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "Yükleme Başarılı" + +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "Yükleme iptal!" + +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 +msgid "previous" +msgstr "önceki" + +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 +#, python-format +msgid "Page %(number)s of %(num_pages)s." +msgstr "Sayfa %(number)s / %(num_pages)s." + +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 +msgid "next" +msgstr "sonraki" + +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "%(total_count)s Tümünü seç" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +msgid "Select all" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +msgid "Files" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +msgid "Add new" +msgstr "Yeni ekle" + +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:15 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "" +msgstr[1] "" + +#: templates/admin/filer/folder/new_folder_form.html:30 +msgid "Save" +msgstr "Kaydet" + +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "Ara bellek" + +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "Tüm elemanları buraya yapıştır" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "Arabellekteki tüm dosyaları kopyala" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "Bellek boş" + +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "Arabellek boş" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "Yükleme başarısız" + +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +msgid "File is missing" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "Tip" + +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "Dosya-Boyut" + +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "Düzenlendi" + +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "Oluşturuldu" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "found" +msgstr "bulundu" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "and" +msgstr "ve" + +#: templates/admin/filer/tools/search_form.html:7 +msgid "cancel search" +msgstr "arama iptal" + +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "Temizle" + +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "Seçili dosya yok" + +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "Dosya Seç" + +#: templates/admin/filer/widgets/admin_folder.html:16 +msgid "Choose Folder" +msgstr "" + +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" +msgstr "" + +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" +msgstr "" + +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" +msgstr "" + +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" +msgstr "" + +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" +msgstr "" + +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." + +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" + +#~ msgid "Open file" +#~ msgstr "Open file" + +#~ msgid "Full size preview" +#~ msgstr "Full size preview" + +#~ msgid "Add Description" +#~ msgstr "Add Description" + +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" + +#~ msgid "none selected" +#~ msgstr "none selected" + +#~ msgid "Add Folder" +#~ msgstr "Add Folder" + +#~ msgid "Subject Location" +#~ msgstr "Subject location" + +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" +#~ msgstr[1] "15c0f2d28d6dab1af1f6d94906beb627_pl_1" + +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/vi_VN/LC_MESSAGES/django.mo b/filer/locale/vi_VN/LC_MESSAGES/django.mo new file mode 100644 index 000000000..c784f9621 Binary files /dev/null and b/filer/locale/vi_VN/LC_MESSAGES/django.mo differ diff --git a/filer/locale/vi_VN/LC_MESSAGES/django.po b/filer/locale/vi_VN/LC_MESSAGES/django.po new file mode 100644 index 000000000..24ac1a3a7 --- /dev/null +++ b/filer/locale/vi_VN/LC_MESSAGES/django.po @@ -0,0 +1,1252 @@ +# 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: +# Translators: +# Duong Vu Hong , 2021 +msgid "" +msgstr "" +"Project-Id-Version: django Filer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: Duong Vu Hong , 2021\n" +"Language-Team: Vietnamese (Viet Nam) (http://app.transifex.com/divio/django-" +"filer/language/vi_VN/)\n" +"Language: vi_VN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: admin/clipboardadmin.py:17 +msgid "You do not have permission to upload files." +msgstr "" + +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "" + +#: admin/clipboardadmin.py:20 +msgid "Can't use this folder, Permission Denied. Please select another folder." +msgstr "" + +#: admin/fileadmin.py:73 +msgid "Advanced" +msgstr "Nâng Cao" + +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "URL hợp chuẩn" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Những item được chọn để thực hiện hành động trên đó. Không có item nào bị " +"thay đổi." + +#: admin/folderadmin.py:434 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "Tất cả %(total_count)s được chọn" + +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "Thư mục liệt kê cho %(folder_name)s" + +#: admin/folderadmin.py:475 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 trên %(cnt)sđược chọn" + +#: admin/folderadmin.py:612 +msgid "No action selected." +msgstr "Không có hành động được chọn" + +#: admin/folderadmin.py:664 +#, python-format +msgid "Successfully moved %(count)d files to clipboard." +msgstr "Di chuyển %(count)dtệp vào bảng tạm thành công" + +#: admin/folderadmin.py:669 +msgid "Move selected files to clipboard" +msgstr "Di chuyển tệp đã chọn vào bảng tạm" + +#: admin/folderadmin.py:709 +#, python-format +msgid "Successfully disabled permissions for %(count)d files." +msgstr "Vô hiệu hóa quyền của %(count)dtệp thành công" + +#: admin/folderadmin.py:711 +#, python-format +msgid "Successfully enabled permissions for %(count)d files." +msgstr "Kích hoạt quyền của %(count)dtệp thành công" + +#: admin/folderadmin.py:719 +msgid "Enable permissions for selected files" +msgstr "Kích hoạt quyền cho các tệp đã chọn" + +#: admin/folderadmin.py:725 +msgid "Disable permissions for selected files" +msgstr "Vô hiệu hóa quyền của các tệp đã chọn" + +#: admin/folderadmin.py:789 +#, python-format +msgid "Successfully deleted %(count)d files and/or folders." +msgstr "Đã xóa %(count)d tệp và/hoặc thư mục thành công. " + +#: admin/folderadmin.py:794 +msgid "Cannot delete files and/or folders" +msgstr "Không thể xóa các tệp và/hoặc các thư mục" + +#: admin/folderadmin.py:796 +msgid "Are you sure?" +msgstr "Bạn chắc chắn chứ?" + +#: admin/folderadmin.py:802 +msgid "Delete files and/or folders" +msgstr "Xóa các tệp và/hoặc các thư mục" + +#: admin/folderadmin.py:823 +msgid "Delete selected files and/or folders" +msgstr "Xóa các tệp và/hoặc các thư mục dã chọn" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "Các thư mục với tên %s đã tồn tại ở vị trí đã chọn" + +#: admin/folderadmin.py:934 +#, python-format +msgid "" +"Successfully moved %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" +"Đã di chuyển %(count)d tệp và/hoặc thư mục tới thư mục '%(destination)s'." + +#: admin/folderadmin.py:942 admin/folderadmin.py:944 +msgid "Move files and/or folders" +msgstr "Di chuyển tệp và/hoặc thư mục" + +#: admin/folderadmin.py:959 +msgid "Move selected files and/or folders" +msgstr "Đã di chuyển tệp và/hoặc thư mục đã chọn" + +#: admin/folderadmin.py:1016 +#, python-format +msgid "Successfully renamed %(count)d files." +msgstr "Đã thành công đổi tên %(count)d tệp." + +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 +msgid "Rename files" +msgstr "Đổi tên tệp" + +#: admin/folderadmin.py:1137 +#, python-format +msgid "" +"Successfully copied %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" +"Đã thành công sao chép %(count)d tệp và/hoặc thư mục tới thư mục " +"'%(destination)s'." + +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 +msgid "Copy files and/or folders" +msgstr "Sao chép tệp và/hoặc thư mục" + +#: admin/folderadmin.py:1174 +msgid "Copy selected files and/or folders" +msgstr "Sao chép tệp và/hoặc thư mục đã chọn" + +#: admin/folderadmin.py:1279 +#, python-format +msgid "Successfully resized %(count)d images." +msgstr "Đã thành công thay đổi kích thước %(count)d ảnh." + +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 +msgid "Resize images" +msgstr "Thay đổi kích thước ảnh" + +#: admin/folderadmin.py:1303 +msgid "Resize selected images" +msgstr "Thay dổi kích thước ảnh đã chọn" + +#: admin/forms.py:24 +msgid "Suffix which will be appended to filenames of copied files." +msgstr "Hậu tố sẽ được nối vào tên của tệp đã sao chép." + +#: admin/forms.py:31 +#, python-format +msgid "" +"Suffix should be a valid, simple and lowercase filename part, like " +"\"%(valid)s\"." +msgstr "" +"Hậu tố phải là một phần tên tệp hợp lệ, đơn giản và chữ thường, như " +"\"%(valid)s\"." + +#: admin/forms.py:52 +#, python-format +msgid "Unknown rename format value key \"%(key)s\"." +msgstr "Không biết định dạng đổi tên của khóa giá trị \"%(key)s\"." + +#: admin/forms.py:54 +#, python-format +msgid "Invalid rename format: %(error)s." +msgstr "Định dạng đổi tên không hợp lệ: %(error)s." + +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 +msgid "thumbnail option" +msgstr "tùy chọn thumbnail" + +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 +msgid "width" +msgstr "Độ rộng" + +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 +msgid "height" +msgstr "Độ cao" + +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 +msgid "crop" +msgstr "Xén" + +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 +msgid "upscale" +msgstr "cao cấp" + +#: admin/forms.py:79 +msgid "Thumbnail option or resize parameters must be choosen." +msgstr "Tùy chọn thumbnail hoặc tham số thay đổi kích thước phải được chọn." + +#: admin/imageadmin.py:20 admin/imageadmin.py:112 +msgid "Subject location" +msgstr "Vị trí chủ đề" + +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "Vị trí của chủ đề chính của của quang cảnh. Định dạng: \"x,y\"." + +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "Định dạng vị trí chủ đề không hợp lệ." + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "Vị trí chủ đề ở bên ngoài hình ảnh." + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "Đầu vào của bạn: \"{subject_location}\"." + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" +msgstr "" + +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" +msgstr "" + +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "Thư mục với tên này đã tồn tại." + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "Filer" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "Thư viện phương tiện" + +#: models/abstract.py:62 +msgid "default alt text" +msgstr "văn bản thay thế mặc định" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "đầu đề mặc định" + +#: models/abstract.py:76 +msgid "subject location" +msgstr "vị trí chủ đề" + +#: models/abstract.py:91 +msgid "image" +msgstr "hình ảnh" + +#: models/abstract.py:92 +msgid "images" +msgstr "những hình ảnh" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "" + +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." +msgstr "" + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 +msgid "user" +msgstr "người dùng" + +#: models/clipboardmodels.py:17 models/filemodels.py:157 +msgid "files" +msgstr "những tệp" + +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 +msgid "clipboard" +msgstr "bảng tạm" + +#: models/clipboardmodels.py:25 +msgid "clipboards" +msgstr "những bảng tạm" + +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 +msgid "file" +msgstr "tệp" + +#: models/clipboardmodels.py:56 +msgid "clipboard item" +msgstr "item bảng tạm" + +#: models/clipboardmodels.py:57 +msgid "clipboard items" +msgstr "items bảng tạm" + +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "folder" +msgstr "thư mục" + +#: models/filemodels.py:81 +msgid "file size" +msgstr "kích thước tệp" + +#: models/filemodels.py:87 +msgid "sha1" +msgstr "sha1" + +#: models/filemodels.py:94 +msgid "has all mandatory data" +msgstr "có tất cả dữ liệu ủy thác" + +#: models/filemodels.py:100 +msgid "original filename" +msgstr "tên tệp gốc" + +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 +msgid "name" +msgstr "tên" + +#: models/filemodels.py:116 +msgid "description" +msgstr "mô tả" + +#: models/filemodels.py:125 models/foldermodels.py:108 +msgid "owner" +msgstr "người sở hữu" + +#: models/filemodels.py:129 models/foldermodels.py:116 +msgid "uploaded at" +msgstr "đã tải lên tại" + +#: models/filemodels.py:134 models/foldermodels.py:126 +msgid "modified at" +msgstr "đã chỉnh sửa tại" + +#: models/filemodels.py:140 +msgid "Permissions disabled" +msgstr "Quyền bị vô hiệu hóa" + +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "" +"Vô hiệu hóa bất kỳ quyền kiểm tra cho tệp này. Tệp sẽ truy cập được bởi bất " +"kỳ ai." + +#: models/foldermodels.py:94 +msgid "parent" +msgstr "" + +#: models/foldermodels.py:121 +msgid "created at" +msgstr "đã tạo tại" + +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Folder" +msgstr "Thư mục" + +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 +msgid "Folders" +msgstr "Những thư mục" + +#: models/foldermodels.py:260 +msgid "all items" +msgstr "tất cả đồ" + +#: models/foldermodels.py:261 +msgid "this item only" +msgstr "chỉ đồ này" + +#: models/foldermodels.py:262 +msgid "this item and all children" +msgstr "đồ này và tất cả các con" + +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "cho phép" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "không cho phép" + +#: models/foldermodels.py:280 +msgid "type" +msgstr "kiểu" + +#: models/foldermodels.py:297 +msgid "group" +msgstr "nhóm" + +#: models/foldermodels.py:304 +msgid "everybody" +msgstr "tất cả mọi người" + +#: models/foldermodels.py:309 +msgid "can read" +msgstr "có thể đọc" + +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "có thể tùy chỉnh" + +#: models/foldermodels.py:325 +msgid "can add children" +msgstr "có thể thêm con" + +#: models/foldermodels.py:333 +msgid "folder permission" +msgstr "quyền thư mục" + +#: models/foldermodels.py:334 +msgid "folder permissions" +msgstr "những quyền thư mục" + +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." +msgstr "" + +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." +msgstr "" + +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." +msgstr "" + +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." +msgstr "" + +#: models/foldermodels.py:360 +msgid "All Folders" +msgstr "" + +#: models/foldermodels.py:362 +msgid "Logical Path" +msgstr "" + +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" +msgstr "" + +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" +msgstr "" + +#: models/foldermodels.py:375 +msgid "Everybody" +msgstr "" + +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "" + +#: models/foldermodels.py:389 +msgid "Read" +msgstr "" + +#: models/foldermodels.py:390 +msgid "Add children" +msgstr "" + +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "ngày nắm giữ" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "tác giả" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "phải luôn công khai tài khoản tác giả" + +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "phải luôn công khai bản quyền" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "độ rộng bằng pixel" + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "độ cao bằng pixel" + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "những tùy chọn thumbnail" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "Những tải lên chưa sắp xếp" + +#: models/virtualitems.py:73 +msgid "files with missing metadata" +msgstr "những tệp với metadata bị mất" + +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "root" +msgstr "gốc" + +#: settings.py:273 +msgid "Show table view" +msgstr "" + +#: settings.py:278 +msgid "Show thumbnail view" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Run the selected action" +msgstr "Chạy hành dộng đã chọn" + +#: templates/admin/filer/actions.html:5 +msgid "Go" +msgstr "Đi" + +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +msgid "Click here to select the objects across all pages" +msgstr "Bấn ở đây để chọn những đối tượng xuyên suốt tất cả các trang" + +#: templates/admin/filer/actions.html:14 +#, python-format +msgid "Select all %(total_count)s files and/or folders" +msgstr "Chọn tất cả %(total_count)s tệp và/hoặc thư mục" + +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 +msgid "Clear selection" +msgstr "Xóa chọn" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 +msgid "Go back to admin homepage" +msgstr "Trở lại trang chủ người quản trị" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 +msgid "Home" +msgstr "Trang chủ" + +#: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 +msgid "Go back to Filer app" +msgstr "Trở lại ứng dụng Filer" + +#: templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Go back to root folder" +msgstr "Trở lại thư mục gốc" + +#: templates/admin/filer/breadcrumbs.html:8 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 +#, python-format +msgid "Go back to '%(folder_name)s' folder" +msgstr "Trở lại '%(folder_name)s' thư mục" + +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "Lặp" + +#: templates/admin/filer/delete_selected_files_confirmation.html:11 +msgid "" +"Deleting the selected files and/or folders would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Xóa tệp và/hoặc thưc mục đã chọn sẽ dẫn đến xóa đối tượng liên quan, nhưng " +"tài khoản của bạn không có quyền xóa những loại của các đối tượng:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:19 +msgid "" +"Deleting the selected files and/or folders would require deleting the " +"following protected related objects:" +msgstr "" +"Xóa tệp và/hoặc thư mục đã chọn sẽ yêu cầu xóa những đối tượng liên quan " +"được bảo vệ sau:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:27 +msgid "" +"Are you sure you want to delete the selected files and/or folders? All of " +"the following objects and their related items will be deleted:" +msgstr "" +"Bạn có chắc muốn xóa tệp và/hoặc thư mục đã chọn? Tất cả những đối tượng và " +"những thứ liên quan đến chúng sẽ bị xóa:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "Không, đưa tôi quay lại" + +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "Có, Tôi chắc chắn" + +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 +msgid "History" +msgstr "Lịch sử" + +#: templates/admin/filer/file/change_form.html:37 +#: templates/admin/filer/folder/change_form.html:23 +#: templates/admin/filer/image/change_form.html:37 +msgid "View on site" +msgstr "Xem trong trang" + +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "Quay lại" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "trang chủ người quản trị" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 +msgid "Folder Icon" +msgstr "Biểu tượng thư mục" + +#: templates/admin/filer/folder/choose_copy_destination.html:23 +msgid "" +"Your account doesn't have permissions to copy all of the selected files and/" +"or folders." +msgstr "" +"Tài khoản của bạn không có quyền để sao chép tất cả tệp và thư mục được chọn." + +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "Đưa tôi quay lại" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 +msgid "There are no destination folders available." +msgstr "Không có thư mục đích" + +#: templates/admin/filer/folder/choose_copy_destination.html:35 +msgid "There are no files and/or folders available to copy." +msgstr "Không có tệp và/hoặc thư mục để sao chép." + +#: templates/admin/filer/folder/choose_copy_destination.html:40 +msgid "" +"The following files and/or folders will be copied to a destination folder " +"(retaining their tree structure):" +msgstr "" +"Những tệp và thư mục sau sẽ được sao chép tới một thư mục đích (giữ cấu trúc " +"cây thư mục):" + +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 +msgid "Destination folder:" +msgstr "Thư mục đích:" + +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 +msgid "Copy" +msgstr "Sao chép" + +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "Không cho phép sao chép tệp tới cùng thư mục" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 +msgid "" +"Your account doesn't have permissions to resize all of the selected images." +msgstr "" +"Tài khoản của bạn không có quyền để thay đổi kích thước của tất cả hình ảnh " +"đã chọn." + +#: templates/admin/filer/folder/choose_images_resize_options.html:18 +msgid "There are no images available to resize." +msgstr "Không có hình ảnh để thay dổi kích thước" + +#: templates/admin/filer/folder/choose_images_resize_options.html:20 +msgid "The following images will be resized:" +msgstr "Hình ảnh dưới đay sẽ bị thay đổi kích thước:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:32 +msgid "Choose an existing thumbnail option or enter resize parameters:" +msgstr "" +"Chọn một tùy chọn của thumbnail đang tồn tại hoặc nhập tham số thay đổi kích " +"thước:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:36 +msgid "" +"Warning: Images will be resized in-place and originals will be lost. Maybe " +"first make a copy of them to retain the originals." +msgstr "" +"Cảnh bảo: Hình ảnh sẽ bị thay đổi tại chỗ và ảnh gốc sẽ bị mất. Có thể tạo " +"một sao chép của chúng để giữ lại hình ảnh gốc." + +#: templates/admin/filer/folder/choose_images_resize_options.html:39 +msgid "Resize" +msgstr "Thay đổi kích thước" + +#: templates/admin/filer/folder/choose_move_destination.html:35 +msgid "" +"Your account doesn't have permissions to move all of the selected files and/" +"or folders." +msgstr "" +"Tài khoản của bạn không có quyền để di chuyển tất cả các tệp và thư mục đã " +"chọn." + +#: templates/admin/filer/folder/choose_move_destination.html:47 +msgid "There are no files and/or folders available to move." +msgstr "Không có tệp và/hoặc thư mục để di chuyển." + +#: templates/admin/filer/folder/choose_move_destination.html:52 +msgid "" +"The following files and/or folders will be moved to a destination folder " +"(retaining their tree structure):" +msgstr "" +"Tệp và thư mục dưới đây sẽ được chuyển tới thư mục đích (giữ nguyên cấu trúc " +"cây thư mục):" + +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 +msgid "Move" +msgstr "Di chuyển" + +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "Không cho phép di chuyển tệp vào cùng thư mục" + +#: templates/admin/filer/folder/choose_rename_format.html:15 +msgid "" +"Your account doesn't have permissions to rename all of the selected files." +msgstr "Tài khoản của bạn không có quyền để đổi tên tất cả các tệp đã chọn." + +#: templates/admin/filer/folder/choose_rename_format.html:18 +msgid "There are no files available to rename." +msgstr "Không có tệp để đổi tên." + +#: templates/admin/filer/folder/choose_rename_format.html:20 +msgid "" +"The following files will be renamed (they will stay in their folders and " +"keep original filename, only displayed filename will be changed):" +msgstr "" +"Tệp dưới đây sẽ bị đổi tên (chúng vẫn ở trong thư mục của chúng và giữ tên " +"gốc, chỉ tên hiển thị sẽ bị thay đổi):" + +#: templates/admin/filer/folder/choose_rename_format.html:59 +msgid "Rename" +msgstr "Đổi tên" + +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "Trở lại thư mục cha" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "Thay đổi thông tin chi tiết thư mục hiện tại" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "Thay đổi" + +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "Bấm vào đây để chạy tìm kiếm cho đoạn văn đã nhập" + +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "Tìm kiếm" + +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "Đóng" + +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "Giới hạn" + +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "Chọn để giới hạn tìm kiếm cho thư mục hiện tại" + +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "Giới hạn tìm kiếm cho thư mục hiện tại" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "Xóa" + +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "Thêm một thư mục mới" + +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "Thư mục mới" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "Tải tệp lên" + +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "Bạn đầu tiên phải chọn một thư mục" + +#: templates/admin/filer/folder/directory_table_list.html:16 +msgid "Name" +msgstr "Tên" + +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "Người sở hữu" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "Kích thước" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "Hành động" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 +#, python-format +msgid "Change '%(item_label)s' folder details" +msgstr "Thay đổi thông tin chi tiết thư mục '%(item_label)s' " + +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "%(counter)s thư mục" + +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "%(counter)s tệp" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "Thay dổi thông tin chi tiết thư mục" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "Xóa thư mục" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 +msgid "Select this file" +msgstr "Chọn tệp này" + +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 +#, python-format +msgid "Change '%(item_label)s' details" +msgstr "Thay đổi thông tin chi tiết '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "Permissions" +msgstr "Quyền" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "disabled" +msgstr "đã vô hiệu hóa" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "enabled" +msgstr "đã kích hoạt" + +#: templates/admin/filer/folder/directory_table_list.html:144 +#, fuzzy +#| msgid "Move selected files to clipboard" +msgid "URL copied to clipboard" +msgstr "Di chuyển tệp đã chọn vào bảng tạm" + +#: templates/admin/filer/folder/directory_table_list.html:147 +#, python-format +msgid "Canonical url '%(item_label)s'" +msgstr "Url hợp chuẩn '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:151 +#, python-format +msgid "Download '%(item_label)s'" +msgstr "Tải '%(item_label)s'" + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "Xóa tệp" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "Thả tệp ở đây hoặc sử dụng nút \"Tải tệp lên\"" + +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "Thả tệp của bạn để tải lên:" + +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "Tải lên" + +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "hủy bỏ" + +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "Tải lên thành công!" + +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "Tải lên đã bị hủy!" + +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 +msgid "previous" +msgstr "trước đó" + +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 +#, python-format +msgid "Page %(number)s of %(num_pages)s." +msgstr "Trang %(number)s trên %(num_pages)s." + +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 +msgid "next" +msgstr "tiếp theo" + +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "Chọn tất cả %(total_count)s" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +msgid "Select all" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +msgid "Files" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +msgid "Add new" +msgstr "Thêm mới" + +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" +msgstr "Trang quản trị Django" + +#: templates/admin/filer/folder/new_folder_form.html:15 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Hãy sửa lỗi dưới đây." + +#: templates/admin/filer/folder/new_folder_form.html:30 +msgid "Save" +msgstr "Lưu" + +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "Bảng tạm" + +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "Dán những thứ ở đây" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "Di chuyển tất cả tệp bảng tạm tới" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "Làm rỗng bảng tạm" + +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "bảng tạm rỗng" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "tải lên lỗi" + +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +msgid "File is missing" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "Kiểu" + +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "Kích thước tệp" + +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "Đã chỉnh sửa" + +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "Đã tạo" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "found" +msgstr "tìm thấy" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "and" +msgstr "và" + +#: templates/admin/filer/tools/search_form.html:7 +msgid "cancel search" +msgstr "hủy tìm kiếm" + +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "Xóa" + +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "hoặc thả tệp của bạn ở đây" + +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "không có tệp được chọn" + +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "Tìm kiếm" + +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "Chọn tệp" + +#: templates/admin/filer/widgets/admin_folder.html:16 +msgid "Choose Folder" +msgstr "" + +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" +msgstr "" + +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" +msgstr "" + +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" +msgstr "" + +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" +msgstr "" + +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" +msgstr "" + +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." + +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" + +#~ msgid "Open file" +#~ msgstr "Open file" + +#~ msgid "Full size preview" +#~ msgstr "Full size preview" + +#~ msgid "Add Description" +#~ msgstr "Add Description" + +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" + +#~ msgid "none selected" +#~ msgstr "none selected" + +#~ msgid "Add Folder" +#~ msgstr "Add Folder" + +#~ msgid "Subject Location" +#~ msgstr "Subject location" + +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" + +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/zh-Hans/LC_MESSAGES/django.mo b/filer/locale/zh-Hans/LC_MESSAGES/django.mo new file mode 100644 index 000000000..3ca706516 Binary files /dev/null and b/filer/locale/zh-Hans/LC_MESSAGES/django.mo differ diff --git a/filer/locale/zh-Hans/LC_MESSAGES/django.po b/filer/locale/zh-Hans/LC_MESSAGES/django.po new file mode 100644 index 000000000..20e70e4d0 --- /dev/null +++ b/filer/locale/zh-Hans/LC_MESSAGES/django.po @@ -0,0 +1,1208 @@ +# 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: +# Translators: +# Aosp T, 2016-2017 +# node uuz , 2019 +msgid "" +msgstr "" +"Project-Id-Version: django Filer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-20 10:11+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: node uuz , 2019\n" +"Language-Team: Chinese Simplified (http://app.transifex.com/divio/django-filer/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/clipboardadmin.py:16 +#| msgid "" +#| "ccount doesn't have permissions to rename all of the selected files." +msgid "You do not have permission to upload files." +msgstr "" + +#: admin/clipboardadmin.py:17 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "" + +#: admin/clipboardadmin.py:19 +msgid "" +"Can't use this folder, Permission Denied. Please select another folder." +msgstr "" + +#: admin/fileadmin.py:49 +msgid "Advanced" +msgstr "高级" + +#: admin/fileadmin.py:164 +msgid "canonical URL" +msgstr "权威URL" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "要对执行此操作,必须选择项目。没有项目被更改。" + +#: admin/folderadmin.py:434 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "选择了 %(total_count)s 个" + +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "%(folder_name)s文件夹列表" + +#: admin/folderadmin.py:475 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "选择了 %(cnt)s 中的 0 个" + +#: admin/folderadmin.py:612 +msgid "No action selected." +msgstr "没有选择任何动作。" + +#: admin/folderadmin.py:664 +#, python-format +msgid "Successfully moved %(count)d files to clipboard." +msgstr "成功将 %(count)d 个文件移动到剪贴板。" + +#: admin/folderadmin.py:669 +msgid "Move selected files to clipboard" +msgstr "移动所选文件到剪贴板" + +#: admin/folderadmin.py:709 +#, python-format +msgid "Successfully disabled permissions for %(count)d files." +msgstr "成功禁用了权限设置(%(count)d 个文件)。" + +#: admin/folderadmin.py:711 +#, python-format +msgid "Successfully enabled permissions for %(count)d files." +msgstr "成功启用了权限设置(%(count)d 个文件)。" + +#: admin/folderadmin.py:719 +msgid "Enable permissions for selected files" +msgstr "对于所选文件,启用权限设置" + +#: admin/folderadmin.py:725 +msgid "Disable permissions for selected files" +msgstr "对于所选文件,禁用权限设置" + +#: admin/folderadmin.py:789 +#, python-format +msgid "Successfully deleted %(count)d files and/or folders." +msgstr "成功删除了 %(count)d 个文件或目录" + +#: admin/folderadmin.py:794 +msgid "Cannot delete files and/or folders" +msgstr "目录或文件删除失败" + +#: admin/folderadmin.py:796 +msgid "Are you sure?" +msgstr "确定吗?" + +#: admin/folderadmin.py:802 +msgid "Delete files and/or folders" +msgstr "删除文件或目录" + +#: admin/folderadmin.py:823 +msgid "Delete selected files and/or folders" +msgstr "删除所选的文件或目录" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "所选的位置已存在名为 %s 的目录" + +#: admin/folderadmin.py:934 +#, python-format +msgid "" +"Successfully moved %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "成功移动 %(count)d 个文件或目录到 '%(destination)s'。" + +#: admin/folderadmin.py:942 admin/folderadmin.py:944 +msgid "Move files and/or folders" +msgstr "移动目录或文件" + +#: admin/folderadmin.py:959 +msgid "Move selected files and/or folders" +msgstr "移动所选的目录或文件" + +#: admin/folderadmin.py:1016 +#, python-format +msgid "Successfully renamed %(count)d files." +msgstr "成功重命名 %(count)d 个文件。" + +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 +msgid "Rename files" +msgstr "重命名文件" + +#: admin/folderadmin.py:1137 +#, python-format +msgid "" +"Successfully copied %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "成功将 %(count)d 个文件或目录复制到 '%(destination)s'。" + +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 +msgid "Copy files and/or folders" +msgstr "复制文件或目录" + +#: admin/folderadmin.py:1174 +msgid "Copy selected files and/or folders" +msgstr "复制所选的文件或目录" + +#: admin/folderadmin.py:1279 +#, python-format +msgid "Successfully resized %(count)d images." +msgstr "成功缩放 %(count)d 个图片。" + +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 +msgid "Resize images" +msgstr "缩放图片" + +#: admin/folderadmin.py:1303 +msgid "Resize selected images" +msgstr "缩放所选的图片" + +#: admin/forms.py:25 +msgid "Suffix which will be appended to filenames of copied files." +msgstr "所复制文件的文件名将会加上后缀。" + +#: admin/forms.py:32 +#, python-format +msgid "" +"Suffix should be a valid, simple and lowercase filename part, like " +"\"%(valid)s\"." +msgstr "后缀应该类似 \"%(valid)s\",是简单、小写的部分文件名称" + +#: admin/forms.py:53 +#, python-format +msgid "Unknown rename format value key \"%(key)s\"." +msgstr "未知重命名格式: \"%(key)s\"." + +#: admin/forms.py:55 +#, python-format +msgid "Invalid rename format: %(error)s." +msgstr "无效的重命名格式:%(error)s 。" + +#: admin/forms.py:69 models/thumbnailoptionmodels.py:37 +msgid "thumbnail option" +msgstr "缩略图选项" + +#: admin/forms.py:73 models/thumbnailoptionmodels.py:15 +msgid "width" +msgstr "宽" + +#: admin/forms.py:74 models/thumbnailoptionmodels.py:20 +msgid "height" +msgstr "高" + +#: admin/forms.py:75 models/thumbnailoptionmodels.py:25 +msgid "crop" +msgstr "裁剪" + +#: admin/forms.py:76 models/thumbnailoptionmodels.py:30 +msgid "upscale" +msgstr "修改分辨率" + +#: admin/forms.py:80 +msgid "Thumbnail option or resize parameters must be choosen." +msgstr "必须选择缩略图选项或缩放参数。" + +#: admin/imageadmin.py:18 admin/imageadmin.py:105 +msgid "Subject location" +msgstr "主题位置" + +#: admin/imageadmin.py:19 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "场景中的主题位置。格式:“x,y”。" + +#: admin/imageadmin.py:57 +msgid "Invalid subject location format. " +msgstr "错误的主题位置格式" + +#: admin/imageadmin.py:65 +msgid "Subject location is outside of the image. " +msgstr "主题位置超出了图片范围" + +#: admin/imageadmin.py:74 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "你输入的:\"{subject_location}\"。" + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" +msgstr "" + +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" +msgstr "" + +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "这个名称的目录已经存在。" + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "文件管理器" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "媒体库" + +#: models/abstract.py:49 +msgid "default alt text" +msgstr "默认提示文本" + +#: models/abstract.py:56 +msgid "default caption" +msgstr "默认标题" + +#: models/abstract.py:63 +msgid "subject location" +msgstr "主题位置" + +#: models/abstract.py:78 +msgid "image" +msgstr "图片" + +#: models/abstract.py:79 +msgid "images" +msgstr "图片" + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 +msgid "user" +msgstr "用户" + +#: models/clipboardmodels.py:17 models/filemodels.py:157 +msgid "files" +msgstr "文件" + +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 +msgid "clipboard" +msgstr "剪贴板" + +#: models/clipboardmodels.py:25 +msgid "clipboards" +msgstr "剪贴板" + +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 +msgid "file" +msgstr "文件" + +#: models/clipboardmodels.py:56 +msgid "clipboard item" +msgstr "剪贴板对象" + +#: models/clipboardmodels.py:57 +msgid "clipboard items" +msgstr "剪贴板对象" + +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "folder" +msgstr "目录" + +#: models/filemodels.py:81 +msgid "file size" +msgstr "文件大小" + +#: models/filemodels.py:87 +msgid "sha1" +msgstr "SHA1" + +#: models/filemodels.py:94 +msgid "has all mandatory data" +msgstr "存在强制性数据" + +#: models/filemodels.py:100 +msgid "original filename" +msgstr "原始文件名" + +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 +msgid "name" +msgstr "名称" + +#: models/filemodels.py:116 +msgid "description" +msgstr "描述" + +#: models/filemodels.py:125 models/foldermodels.py:108 +msgid "owner" +msgstr "所有者" + +#: models/filemodels.py:129 models/foldermodels.py:116 +msgid "uploaded at" +msgstr "上传于" + +#: models/filemodels.py:134 models/foldermodels.py:126 +msgid "modified at" +msgstr "修改于" + +#: models/filemodels.py:140 +msgid "Permissions disabled" +msgstr "已禁用权限设置" + +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "对此文件禁用所有权限设置。此文件将可以被任何人公开访问。" + +#: models/foldermodels.py:94 +msgid "parent" +msgstr "" + +#: models/foldermodels.py:121 +msgid "created at" +msgstr "创建于" + +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Folder" +msgstr "目录" + +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 +msgid "Folders" +msgstr "目录" + +#: models/foldermodels.py:260 +msgid "all items" +msgstr "所有项目" + +#: models/foldermodels.py:261 +msgid "this item only" +msgstr "仅此项目" + +#: models/foldermodels.py:262 +msgid "this item and all children" +msgstr "此项目和所有子项目" + +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "允许" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "拒绝" + +#: models/foldermodels.py:280 +msgid "type" +msgstr "类型" + +#: models/foldermodels.py:297 +msgid "group" +msgstr "组" + +#: models/foldermodels.py:304 +msgid "everybody" +msgstr "所有人" + +#: models/foldermodels.py:309 +msgid "can read" +msgstr "可读" + +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "可编辑" + +#: models/foldermodels.py:325 +msgid "can add children" +msgstr "可增加子项目" + +#: models/foldermodels.py:333 +msgid "folder permission" +msgstr "目录权限" + +#: models/foldermodels.py:334 +msgid "folder permissions" +msgstr "目录权限" + +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." +msgstr "" + +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." +msgstr "" + +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." +msgstr "" + +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." +msgstr "" + +#: models/foldermodels.py:360 +#| msgid "Folders" +msgid "All Folders" +msgstr "" + +#: models/foldermodels.py:362 +msgid "Logical Path" +msgstr "" + +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" +msgstr "" + +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" +msgstr "" + +#: models/foldermodels.py:375 +#| msgid "everybody" +msgid "Everybody" +msgstr "" + +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "" + +#: models/foldermodels.py:389 +msgid "Read" +msgstr "" + +#: models/foldermodels.py:390 +#| msgid "can add children" +msgid "Add children" +msgstr "" + +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "日期令牌" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "作者" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "必须发布作者信息" + +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "必须发布版权" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "像素宽度" + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "像素高度" + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "缩略图选项" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:167 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "未分类的上传" + +#: models/virtualitems.py:73 +msgid "files with missing metadata" +msgstr "确实元数据的文件" + +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "root" +msgstr "根目录" + +#: settings.py:273 +msgid "Show table view" +msgstr "" + +#: settings.py:278 +#| msgid "thumbnail option" +msgid "Show thumbnail view" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Run the selected action" +msgstr "运行所选的动作" + +#: templates/admin/filer/actions.html:5 +msgid "Go" +msgstr "开始" + +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:232 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +msgid "Click here to select the objects across all pages" +msgstr "选择所有页面的对象" + +#: templates/admin/filer/actions.html:14 +#, python-format +msgid "Select all %(total_count)s files and/or folders" +msgstr "选择 %(total_count)s 个文件或目录" + +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:234 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 +msgid "Clear selection" +msgstr "清空选择" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 +msgid "Go back to admin homepage" +msgstr "回到管理首页" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 +msgid "Home" +msgstr "首页" + +#: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 +msgid "Go back to Filer app" +msgstr "回到文件管理器首页" + +#: templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Go back to root folder" +msgstr "回到根目录" + +#: templates/admin/filer/breadcrumbs.html:8 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 +#, python-format +msgid "Go back to '%(folder_name)s' folder" +msgstr "回到 '%(folder_name)s' 目录" + +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "重复" + +#: templates/admin/filer/delete_selected_files_confirmation.html:11 +msgid "" +"Deleting the selected files and/or folders would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "删除所选的文件或目录会将相关的对象同时删除,但是你的账号没有删除下面这些类型对象的权限:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:19 +msgid "" +"Deleting the selected files and/or folders would require deleting the " +"following protected related objects:" +msgstr "删除所选的文件或目录会将询问是否删除以下保护对象:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:27 +msgid "" +"Are you sure you want to delete the selected files and/or folders? All of " +"the following objects and their related items will be deleted:" +msgstr "确认删除所选的文件或目录吗?以下所有相关的对象都会删除:" + +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "不,返回" + +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "是的,我确定" + +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 +msgid "History" +msgstr "历史" + +#: templates/admin/filer/file/change_form.html:37 +#: templates/admin/filer/folder/change_form.html:23 +#: templates/admin/filer/image/change_form.html:37 +msgid "View on site" +msgstr "查看站点" + +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "后退到" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "管理首页" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 +msgid "Folder Icon" +msgstr "目录图标" + +#: templates/admin/filer/folder/choose_copy_destination.html:23 +msgid "" +"Your account doesn't have permissions to copy all of the selected files " +"and/or folders." +msgstr "你的账户没有权限复制所有所选的目录或文件。" + +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "返回" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 +msgid "There are no destination folders available." +msgstr "目标目录无效" + +#: templates/admin/filer/folder/choose_copy_destination.html:35 +msgid "There are no files and/or folders available to copy." +msgstr "没有文件或目录可以复制" + +#: templates/admin/filer/folder/choose_copy_destination.html:40 +msgid "" +"The following files and/or folders will be copied to a destination folder " +"(retaining their tree structure):" +msgstr "以下的文件将复制到目标目录(包含它们的树结构):" + +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 +msgid "Destination folder:" +msgstr "目标目录:" + +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 +msgid "Copy" +msgstr "复制" + +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "不允许将文件复制到相同目录" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 +msgid "" +"Your account doesn't have permissions to resize all of the selected images." +msgstr "你的账号没有权限缩放所有所选的图片。" + +#: templates/admin/filer/folder/choose_images_resize_options.html:18 +msgid "There are no images available to resize." +msgstr "没有图片可缩放。" + +#: templates/admin/filer/folder/choose_images_resize_options.html:20 +msgid "The following images will be resized:" +msgstr "以下图片将被缩放:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:32 +msgid "Choose an existing thumbnail option or enter resize parameters:" +msgstr "选择一个缩略图选项或输入缩放参数:" + +#: templates/admin/filer/folder/choose_images_resize_options.html:36 +msgid "" +"Warning: Images will be resized in-place and originals will be lost. Maybe " +"first make a copy of them to retain the originals." +msgstr "警告:图片将被缩放,并且源文件将被覆盖。你应该先将它们做个备份。" + +#: templates/admin/filer/folder/choose_images_resize_options.html:39 +msgid "Resize" +msgstr "缩放" + +#: templates/admin/filer/folder/choose_move_destination.html:35 +msgid "" +"Your account doesn't have permissions to move all of the selected files " +"and/or folders." +msgstr "你的账号没有移动所有所选文件或目录的权限。" + +#: templates/admin/filer/folder/choose_move_destination.html:47 +msgid "There are no files and/or folders available to move." +msgstr "没有文件或目录可移动。" + +#: templates/admin/filer/folder/choose_move_destination.html:52 +msgid "" +"The following files and/or folders will be moved to a destination folder " +"(retaining their tree structure):" +msgstr "以下的文件将移动到目标目录(包含它们的树结构):" + +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 +msgid "Move" +msgstr "移动" + +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "不允许将文件移动到相同目录。" + +#: templates/admin/filer/folder/choose_rename_format.html:15 +msgid "" +"Your account doesn't have permissions to rename all of the selected files." +msgstr "你的账号没有重命名所有所选文件的权限。" + +#: templates/admin/filer/folder/choose_rename_format.html:18 +msgid "There are no files available to rename." +msgstr "没有文件可重命名。" + +#: templates/admin/filer/folder/choose_rename_format.html:20 +msgid "" +"The following files will be renamed (they will stay in their folders and " +"keep original filename, only displayed filename will be changed):" +msgstr "以下文件将被重命名(源文件不变,只是显示名称被修改而已):" + +#: templates/admin/filer/folder/choose_rename_format.html:59 +msgid "Rename" +msgstr "重命名" + +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "回到父目录" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "修改当前目录属性" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "修改" + +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "点击开始搜索" + +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "搜索" + +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "关闭" + +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "限定" + +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "将搜索限定在当前目录" + +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "将搜索限定在当前目录" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "删除" + +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "新增一个目录" + +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "新增目录" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "上传文件" + +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "必须先选择一个目录" + +#: templates/admin/filer/folder/directory_table_list.html:16 +msgid "Name" +msgstr "名称" + +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:49 +msgid "Owner" +msgstr "所有者" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:33 +msgid "Size" +msgstr "大小" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "动作" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 +#, python-format +msgid "Change '%(item_label)s' folder details" +msgstr "修改 '%(item_label)s' 目录的属性" + +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "%(counter)s 个目录" + +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "%(counter)s 个文件" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "修改目录属性" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "删除目录" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 +msgid "Select this file" +msgstr "选择这个文件" + +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:151 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 +#, python-format +msgid "Change '%(item_label)s' details" +msgstr "修改 '%(item_label)s' 的属性" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "Permissions" +msgstr "权限" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "disabled" +msgstr "禁用" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "enabled" +msgstr "激活" + +#: templates/admin/filer/folder/directory_table_list.html:144 +#, python-format +#| msgid "Change '%(item_label)s' details" +msgid "Canonical url '%(item_label)s'" +msgstr "权威URL %(item_label)s" + +#: templates/admin/filer/folder/directory_table_list.html:148 +#, python-format +#| msgid "Change '%(item_label)s' details" +msgid "Download '%(item_label)s'" +msgstr "下载 %(item_label)s" + +#: templates/admin/filer/folder/directory_table_list.html:152 +msgid "Remove file" +msgstr "删除文件" + +#: templates/admin/filer/folder/directory_table_list.html:160 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "拖放文件到这里或使用“上传文件”按钮" + +#: templates/admin/filer/folder/directory_table_list.html:175 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "拖放文件到:" + +#: templates/admin/filer/folder/directory_table_list.html:185 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "上传" + +#: templates/admin/filer/folder/directory_table_list.html:197 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "取消" + +#: templates/admin/filer/folder/directory_table_list.html:201 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "上传成功!" + +#: templates/admin/filer/folder/directory_table_list.html:205 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "取消上传!" + +#: templates/admin/filer/folder/directory_table_list.html:212 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 +msgid "previous" +msgstr "上一个" + +#: templates/admin/filer/folder/directory_table_list.html:217 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 +#, python-format +msgid "Page %(number)s of %(num_pages)s." +msgstr "第 %(number)s 页,共 %(num_pages)s 页" + +#: templates/admin/filer/folder/directory_table_list.html:222 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 +msgid "next" +msgstr "下一个" + +#: templates/admin/filer/folder/directory_table_list.html:232 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "选择了 %(total_count)s 个" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +#| msgid "Select this file" +msgid "Select all" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +#| msgid "Filer" +msgid "Files" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +msgid "Add new" +msgstr "新增" + +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" +msgstr "Django 网站管理" + +#: templates/admin/filer/folder/new_folder_form.html:15 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "请更正下面的错误。" + +#: templates/admin/filer/folder/new_folder_form.html:30 +msgid "Save" +msgstr "保存" + +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "剪贴板" + +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "粘贴所有对象到这里" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "移动所有剪贴板文件到" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "清空剪贴板" + +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "剪贴板是空的" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "上传失败" + +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:15 +msgid "Expand" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:20 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:107 +#| msgid "file missing" +msgid "File is missing" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:29 +msgid "Type" +msgstr "类型" + +#: templates/admin/filer/tools/detail_info.html:37 +msgid "File-size" +msgstr "文件大小" + +#: templates/admin/filer/tools/detail_info.html:41 +msgid "Modified" +msgstr "修改时间" + +#: templates/admin/filer/tools/detail_info.html:45 +msgid "Created" +msgstr "创建时间" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "found" +msgstr "已找到" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "and" +msgstr "与" + +#: templates/admin/filer/tools/search_form.html:7 +msgid "cancel search" +msgstr "取消搜索" + +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "清空" + +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "或在此放入你的文件" + +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "没选择文件" + +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "查找" + +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "选择文件" + +#: templates/admin/filer/widgets/admin_folder.html:16 +#| msgid "Choose File" +msgid "Choose Folder" +msgstr "" + +#: validation.py:19 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" +msgstr "" + +#: validation.py:22 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" +msgstr "" + +#: validation.py:33 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" +msgstr "" + +#: validation.py:71 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" +msgstr "" + +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." + +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" + +#~ msgid "Open file" +#~ msgstr "Open file" + +#~ msgid "Full size preview" +#~ msgstr "Full size preview" + +#~ msgid "Add Description" +#~ msgstr "Add Description" + +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" + +#~ msgid "none selected" +#~ msgstr "none selected" + +#~ msgid "Add Folder" +#~ msgstr "Add Folder" + +#~ msgid "Subject Location" +#~ msgstr "Subject location" + +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" + +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/zh/LC_MESSAGES/django.mo b/filer/locale/zh/LC_MESSAGES/django.mo new file mode 100644 index 000000000..1f47492f0 Binary files /dev/null and b/filer/locale/zh/LC_MESSAGES/django.mo differ diff --git a/filer/locale/zh/LC_MESSAGES/django.po b/filer/locale/zh/LC_MESSAGES/django.po new file mode 100644 index 000000000..217dde434 --- /dev/null +++ b/filer/locale/zh/LC_MESSAGES/django.po @@ -0,0 +1,1219 @@ +# 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: +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django Filer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: Angelo Dini \n" +"Language-Team: Chinese (http://app.transifex.com/divio/django-filer/language/" +"zh/)\n" +"Language: zh\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: admin/clipboardadmin.py:17 +msgid "You do not have permission to upload files." +msgstr "" + +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "" + +#: admin/clipboardadmin.py:20 +msgid "Can't use this folder, Permission Denied. Please select another folder." +msgstr "" + +#: admin/fileadmin.py:73 +msgid "Advanced" +msgstr "" + +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" + +#: admin/folderadmin.py:434 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "" + +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "" + +#: admin/folderadmin.py:475 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "" + +#: admin/folderadmin.py:612 +msgid "No action selected." +msgstr "" + +#: admin/folderadmin.py:664 +#, python-format +msgid "Successfully moved %(count)d files to clipboard." +msgstr "" + +#: admin/folderadmin.py:669 +msgid "Move selected files to clipboard" +msgstr "" + +#: admin/folderadmin.py:709 +#, python-format +msgid "Successfully disabled permissions for %(count)d files." +msgstr "" + +#: admin/folderadmin.py:711 +#, python-format +msgid "Successfully enabled permissions for %(count)d files." +msgstr "" + +#: admin/folderadmin.py:719 +msgid "Enable permissions for selected files" +msgstr "" + +#: admin/folderadmin.py:725 +msgid "Disable permissions for selected files" +msgstr "" + +#: admin/folderadmin.py:789 +#, python-format +msgid "Successfully deleted %(count)d files and/or folders." +msgstr "" + +#: admin/folderadmin.py:794 +msgid "Cannot delete files and/or folders" +msgstr "" + +#: admin/folderadmin.py:796 +msgid "Are you sure?" +msgstr "" + +#: admin/folderadmin.py:802 +msgid "Delete files and/or folders" +msgstr "" + +#: admin/folderadmin.py:823 +msgid "Delete selected files and/or folders" +msgstr "" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "" + +#: admin/folderadmin.py:934 +#, python-format +msgid "" +"Successfully moved %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" + +#: admin/folderadmin.py:942 admin/folderadmin.py:944 +msgid "Move files and/or folders" +msgstr "" + +#: admin/folderadmin.py:959 +msgid "Move selected files and/or folders" +msgstr "" + +#: admin/folderadmin.py:1016 +#, python-format +msgid "Successfully renamed %(count)d files." +msgstr "" + +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 +msgid "Rename files" +msgstr "" + +#: admin/folderadmin.py:1137 +#, python-format +msgid "" +"Successfully copied %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" + +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 +msgid "Copy files and/or folders" +msgstr "" + +#: admin/folderadmin.py:1174 +msgid "Copy selected files and/or folders" +msgstr "" + +#: admin/folderadmin.py:1279 +#, python-format +msgid "Successfully resized %(count)d images." +msgstr "" + +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 +msgid "Resize images" +msgstr "" + +#: admin/folderadmin.py:1303 +msgid "Resize selected images" +msgstr "" + +#: admin/forms.py:24 +msgid "Suffix which will be appended to filenames of copied files." +msgstr "" + +#: admin/forms.py:31 +#, python-format +msgid "" +"Suffix should be a valid, simple and lowercase filename part, like " +"\"%(valid)s\"." +msgstr "" + +#: admin/forms.py:52 +#, python-format +msgid "Unknown rename format value key \"%(key)s\"." +msgstr "" + +#: admin/forms.py:54 +#, python-format +msgid "Invalid rename format: %(error)s." +msgstr "" + +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 +msgid "thumbnail option" +msgstr "" + +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 +msgid "width" +msgstr "" + +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 +msgid "height" +msgstr "" + +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 +msgid "crop" +msgstr "" + +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 +msgid "upscale" +msgstr "" + +#: admin/forms.py:79 +msgid "Thumbnail option or resize parameters must be choosen." +msgstr "" + +#: admin/imageadmin.py:20 admin/imageadmin.py:112 +msgid "Subject location" +msgstr "" + +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "" + +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "" + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "" + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "" + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" +msgstr "" + +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" +msgstr "" + +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "" + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "" + +#: models/abstract.py:62 +msgid "default alt text" +msgstr "" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "" + +#: models/abstract.py:76 +msgid "subject location" +msgstr "" + +#: models/abstract.py:91 +msgid "image" +msgstr "" + +#: models/abstract.py:92 +msgid "images" +msgstr "" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "" + +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." +msgstr "" + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 +msgid "user" +msgstr "" + +#: models/clipboardmodels.py:17 models/filemodels.py:157 +msgid "files" +msgstr "" + +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 +msgid "clipboard" +msgstr "" + +#: models/clipboardmodels.py:25 +msgid "clipboards" +msgstr "" + +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 +msgid "file" +msgstr "" + +#: models/clipboardmodels.py:56 +msgid "clipboard item" +msgstr "" + +#: models/clipboardmodels.py:57 +msgid "clipboard items" +msgstr "" + +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "folder" +msgstr "" + +#: models/filemodels.py:81 +msgid "file size" +msgstr "" + +#: models/filemodels.py:87 +msgid "sha1" +msgstr "" + +#: models/filemodels.py:94 +msgid "has all mandatory data" +msgstr "" + +#: models/filemodels.py:100 +msgid "original filename" +msgstr "" + +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 +msgid "name" +msgstr "" + +#: models/filemodels.py:116 +msgid "description" +msgstr "" + +#: models/filemodels.py:125 models/foldermodels.py:108 +msgid "owner" +msgstr "" + +#: models/filemodels.py:129 models/foldermodels.py:116 +msgid "uploaded at" +msgstr "" + +#: models/filemodels.py:134 models/foldermodels.py:126 +msgid "modified at" +msgstr "" + +#: models/filemodels.py:140 +msgid "Permissions disabled" +msgstr "" + +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "" + +#: models/foldermodels.py:94 +msgid "parent" +msgstr "" + +#: models/foldermodels.py:121 +msgid "created at" +msgstr "" + +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Folder" +msgstr "" + +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 +msgid "Folders" +msgstr "" + +#: models/foldermodels.py:260 +msgid "all items" +msgstr "" + +#: models/foldermodels.py:261 +msgid "this item only" +msgstr "" + +#: models/foldermodels.py:262 +msgid "this item and all children" +msgstr "" + +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "" + +#: models/foldermodels.py:280 +msgid "type" +msgstr "" + +#: models/foldermodels.py:297 +msgid "group" +msgstr "" + +#: models/foldermodels.py:304 +msgid "everybody" +msgstr "" + +#: models/foldermodels.py:309 +msgid "can read" +msgstr "" + +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "" + +#: models/foldermodels.py:325 +msgid "can add children" +msgstr "" + +#: models/foldermodels.py:333 +msgid "folder permission" +msgstr "" + +#: models/foldermodels.py:334 +msgid "folder permissions" +msgstr "" + +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." +msgstr "" + +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." +msgstr "" + +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." +msgstr "" + +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." +msgstr "" + +#: models/foldermodels.py:360 +msgid "All Folders" +msgstr "" + +#: models/foldermodels.py:362 +msgid "Logical Path" +msgstr "" + +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" +msgstr "" + +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" +msgstr "" + +#: models/foldermodels.py:375 +msgid "Everybody" +msgstr "" + +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "" + +#: models/foldermodels.py:389 +msgid "Read" +msgstr "" + +#: models/foldermodels.py:390 +msgid "Add children" +msgstr "" + +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "" + +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "" + +#: models/virtualitems.py:73 +msgid "files with missing metadata" +msgstr "" + +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "root" +msgstr "" + +#: settings.py:273 +msgid "Show table view" +msgstr "" + +#: settings.py:278 +msgid "Show thumbnail view" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Run the selected action" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Go" +msgstr "" + +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +msgid "Click here to select the objects across all pages" +msgstr "" + +#: templates/admin/filer/actions.html:14 +#, python-format +msgid "Select all %(total_count)s files and/or folders" +msgstr "" + +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 +msgid "Clear selection" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 +msgid "Go back to admin homepage" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 +msgid "Home" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 +msgid "Go back to Filer app" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Go back to root folder" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:8 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 +#, python-format +msgid "Go back to '%(folder_name)s' folder" +msgstr "" + +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:11 +msgid "" +"Deleting the selected files and/or folders would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:19 +msgid "" +"Deleting the selected files and/or folders would require deleting the " +"following protected related objects:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:27 +msgid "" +"Are you sure you want to delete the selected files and/or folders? All of " +"the following objects and their related items will be deleted:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "" + +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 +msgid "History" +msgstr "" + +#: templates/admin/filer/file/change_form.html:37 +#: templates/admin/filer/folder/change_form.html:23 +#: templates/admin/filer/image/change_form.html:37 +msgid "View on site" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 +msgid "Folder Icon" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:23 +msgid "" +"Your account doesn't have permissions to copy all of the selected files and/" +"or folders." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 +msgid "There are no destination folders available." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:35 +msgid "There are no files and/or folders available to copy." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:40 +msgid "" +"The following files and/or folders will be copied to a destination folder " +"(retaining their tree structure):" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 +msgid "Destination folder:" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 +msgid "Copy" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 +msgid "" +"Your account doesn't have permissions to resize all of the selected images." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:18 +msgid "There are no images available to resize." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:20 +msgid "The following images will be resized:" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:32 +msgid "Choose an existing thumbnail option or enter resize parameters:" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:36 +msgid "" +"Warning: Images will be resized in-place and originals will be lost. Maybe " +"first make a copy of them to retain the originals." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:39 +msgid "Resize" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:35 +msgid "" +"Your account doesn't have permissions to move all of the selected files and/" +"or folders." +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:47 +msgid "There are no files and/or folders available to move." +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:52 +msgid "" +"The following files and/or folders will be moved to a destination folder " +"(retaining their tree structure):" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 +msgid "Move" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:15 +msgid "" +"Your account doesn't have permissions to rename all of the selected files." +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:18 +msgid "There are no files available to rename." +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:20 +msgid "" +"The following files will be renamed (they will stay in their folders and " +"keep original filename, only displayed filename will be changed):" +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:59 +msgid "Rename" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:16 +msgid "Name" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 +#, python-format +msgid "Change '%(item_label)s' folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "" + +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 +msgid "Select this file" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 +#, python-format +msgid "Change '%(item_label)s' details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "Permissions" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "disabled" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "enabled" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:144 +msgid "URL copied to clipboard" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:147 +#, python-format +msgid "Canonical url '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:151 +#, python-format +msgid "Download '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 +msgid "previous" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 +#, python-format +msgid "Page %(number)s of %(num_pages)s." +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 +msgid "next" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +msgid "Select all" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +msgid "Files" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +msgid "Add new" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:15 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "" + +#: templates/admin/filer/folder/new_folder_form.html:30 +msgid "Save" +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +msgid "File is missing" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "found" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "and" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:7 +msgid "cancel search" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "" + +#: templates/admin/filer/widgets/admin_folder.html:16 +msgid "Choose Folder" +msgstr "" + +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" +msgstr "" + +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" +msgstr "" + +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" +msgstr "" + +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" +msgstr "" + +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" +msgstr "" + +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." + +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" + +#~ msgid "Open file" +#~ msgstr "Open file" + +#~ msgid "Full size preview" +#~ msgstr "Full size preview" + +#~ msgid "Add Description" +#~ msgstr "Add Description" + +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" + +#~ msgid "none selected" +#~ msgstr "none selected" + +#~ msgid "Add Folder" +#~ msgstr "Add Folder" + +#~ msgid "Subject Location" +#~ msgstr "Subject location" + +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" + +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/zh_CN/LC_MESSAGES/django.mo b/filer/locale/zh_CN/LC_MESSAGES/django.mo new file mode 100644 index 000000000..0da366bff Binary files /dev/null and b/filer/locale/zh_CN/LC_MESSAGES/django.mo differ diff --git a/filer/locale/zh_CN/LC_MESSAGES/django.po b/filer/locale/zh_CN/LC_MESSAGES/django.po new file mode 100644 index 000000000..442ac25a4 --- /dev/null +++ b/filer/locale/zh_CN/LC_MESSAGES/django.po @@ -0,0 +1,1219 @@ +# 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: +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django Filer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: Angelo Dini \n" +"Language-Team: Chinese (China) (http://app.transifex.com/divio/django-filer/" +"language/zh_CN/)\n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: admin/clipboardadmin.py:17 +msgid "You do not have permission to upload files." +msgstr "" + +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "" + +#: admin/clipboardadmin.py:20 +msgid "Can't use this folder, Permission Denied. Please select another folder." +msgstr "" + +#: admin/fileadmin.py:73 +msgid "Advanced" +msgstr "" + +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" + +#: admin/folderadmin.py:434 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "" + +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "" + +#: admin/folderadmin.py:475 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "" + +#: admin/folderadmin.py:612 +msgid "No action selected." +msgstr "" + +#: admin/folderadmin.py:664 +#, python-format +msgid "Successfully moved %(count)d files to clipboard." +msgstr "" + +#: admin/folderadmin.py:669 +msgid "Move selected files to clipboard" +msgstr "" + +#: admin/folderadmin.py:709 +#, python-format +msgid "Successfully disabled permissions for %(count)d files." +msgstr "" + +#: admin/folderadmin.py:711 +#, python-format +msgid "Successfully enabled permissions for %(count)d files." +msgstr "" + +#: admin/folderadmin.py:719 +msgid "Enable permissions for selected files" +msgstr "" + +#: admin/folderadmin.py:725 +msgid "Disable permissions for selected files" +msgstr "" + +#: admin/folderadmin.py:789 +#, python-format +msgid "Successfully deleted %(count)d files and/or folders." +msgstr "" + +#: admin/folderadmin.py:794 +msgid "Cannot delete files and/or folders" +msgstr "" + +#: admin/folderadmin.py:796 +msgid "Are you sure?" +msgstr "" + +#: admin/folderadmin.py:802 +msgid "Delete files and/or folders" +msgstr "" + +#: admin/folderadmin.py:823 +msgid "Delete selected files and/or folders" +msgstr "" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "" + +#: admin/folderadmin.py:934 +#, python-format +msgid "" +"Successfully moved %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" + +#: admin/folderadmin.py:942 admin/folderadmin.py:944 +msgid "Move files and/or folders" +msgstr "" + +#: admin/folderadmin.py:959 +msgid "Move selected files and/or folders" +msgstr "" + +#: admin/folderadmin.py:1016 +#, python-format +msgid "Successfully renamed %(count)d files." +msgstr "" + +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 +msgid "Rename files" +msgstr "" + +#: admin/folderadmin.py:1137 +#, python-format +msgid "" +"Successfully copied %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" + +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 +msgid "Copy files and/or folders" +msgstr "" + +#: admin/folderadmin.py:1174 +msgid "Copy selected files and/or folders" +msgstr "" + +#: admin/folderadmin.py:1279 +#, python-format +msgid "Successfully resized %(count)d images." +msgstr "" + +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 +msgid "Resize images" +msgstr "" + +#: admin/folderadmin.py:1303 +msgid "Resize selected images" +msgstr "" + +#: admin/forms.py:24 +msgid "Suffix which will be appended to filenames of copied files." +msgstr "" + +#: admin/forms.py:31 +#, python-format +msgid "" +"Suffix should be a valid, simple and lowercase filename part, like " +"\"%(valid)s\"." +msgstr "" + +#: admin/forms.py:52 +#, python-format +msgid "Unknown rename format value key \"%(key)s\"." +msgstr "" + +#: admin/forms.py:54 +#, python-format +msgid "Invalid rename format: %(error)s." +msgstr "" + +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 +msgid "thumbnail option" +msgstr "" + +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 +msgid "width" +msgstr "" + +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 +msgid "height" +msgstr "" + +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 +msgid "crop" +msgstr "" + +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 +msgid "upscale" +msgstr "" + +#: admin/forms.py:79 +msgid "Thumbnail option or resize parameters must be choosen." +msgstr "" + +#: admin/imageadmin.py:20 admin/imageadmin.py:112 +msgid "Subject location" +msgstr "" + +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "" + +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "" + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "" + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "" + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" +msgstr "" + +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" +msgstr "" + +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "" + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "" + +#: models/abstract.py:62 +msgid "default alt text" +msgstr "" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "" + +#: models/abstract.py:76 +msgid "subject location" +msgstr "" + +#: models/abstract.py:91 +msgid "image" +msgstr "" + +#: models/abstract.py:92 +msgid "images" +msgstr "" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "" + +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." +msgstr "" + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 +msgid "user" +msgstr "" + +#: models/clipboardmodels.py:17 models/filemodels.py:157 +msgid "files" +msgstr "" + +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 +msgid "clipboard" +msgstr "" + +#: models/clipboardmodels.py:25 +msgid "clipboards" +msgstr "" + +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 +msgid "file" +msgstr "" + +#: models/clipboardmodels.py:56 +msgid "clipboard item" +msgstr "" + +#: models/clipboardmodels.py:57 +msgid "clipboard items" +msgstr "" + +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "folder" +msgstr "" + +#: models/filemodels.py:81 +msgid "file size" +msgstr "" + +#: models/filemodels.py:87 +msgid "sha1" +msgstr "" + +#: models/filemodels.py:94 +msgid "has all mandatory data" +msgstr "" + +#: models/filemodels.py:100 +msgid "original filename" +msgstr "" + +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 +msgid "name" +msgstr "" + +#: models/filemodels.py:116 +msgid "description" +msgstr "" + +#: models/filemodels.py:125 models/foldermodels.py:108 +msgid "owner" +msgstr "" + +#: models/filemodels.py:129 models/foldermodels.py:116 +msgid "uploaded at" +msgstr "" + +#: models/filemodels.py:134 models/foldermodels.py:126 +msgid "modified at" +msgstr "" + +#: models/filemodels.py:140 +msgid "Permissions disabled" +msgstr "" + +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "" + +#: models/foldermodels.py:94 +msgid "parent" +msgstr "" + +#: models/foldermodels.py:121 +msgid "created at" +msgstr "" + +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Folder" +msgstr "" + +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 +msgid "Folders" +msgstr "" + +#: models/foldermodels.py:260 +msgid "all items" +msgstr "" + +#: models/foldermodels.py:261 +msgid "this item only" +msgstr "" + +#: models/foldermodels.py:262 +msgid "this item and all children" +msgstr "" + +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "" + +#: models/foldermodels.py:280 +msgid "type" +msgstr "" + +#: models/foldermodels.py:297 +msgid "group" +msgstr "" + +#: models/foldermodels.py:304 +msgid "everybody" +msgstr "" + +#: models/foldermodels.py:309 +msgid "can read" +msgstr "" + +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "" + +#: models/foldermodels.py:325 +msgid "can add children" +msgstr "" + +#: models/foldermodels.py:333 +msgid "folder permission" +msgstr "" + +#: models/foldermodels.py:334 +msgid "folder permissions" +msgstr "" + +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." +msgstr "" + +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." +msgstr "" + +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." +msgstr "" + +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." +msgstr "" + +#: models/foldermodels.py:360 +msgid "All Folders" +msgstr "" + +#: models/foldermodels.py:362 +msgid "Logical Path" +msgstr "" + +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" +msgstr "" + +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" +msgstr "" + +#: models/foldermodels.py:375 +msgid "Everybody" +msgstr "" + +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "" + +#: models/foldermodels.py:389 +msgid "Read" +msgstr "" + +#: models/foldermodels.py:390 +msgid "Add children" +msgstr "" + +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "" + +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "" + +#: models/virtualitems.py:73 +msgid "files with missing metadata" +msgstr "" + +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "root" +msgstr "" + +#: settings.py:273 +msgid "Show table view" +msgstr "" + +#: settings.py:278 +msgid "Show thumbnail view" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Run the selected action" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Go" +msgstr "" + +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +msgid "Click here to select the objects across all pages" +msgstr "" + +#: templates/admin/filer/actions.html:14 +#, python-format +msgid "Select all %(total_count)s files and/or folders" +msgstr "" + +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 +msgid "Clear selection" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 +msgid "Go back to admin homepage" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 +msgid "Home" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 +msgid "Go back to Filer app" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Go back to root folder" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:8 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 +#, python-format +msgid "Go back to '%(folder_name)s' folder" +msgstr "" + +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:11 +msgid "" +"Deleting the selected files and/or folders would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:19 +msgid "" +"Deleting the selected files and/or folders would require deleting the " +"following protected related objects:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:27 +msgid "" +"Are you sure you want to delete the selected files and/or folders? All of " +"the following objects and their related items will be deleted:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "" + +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 +msgid "History" +msgstr "" + +#: templates/admin/filer/file/change_form.html:37 +#: templates/admin/filer/folder/change_form.html:23 +#: templates/admin/filer/image/change_form.html:37 +msgid "View on site" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 +msgid "Folder Icon" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:23 +msgid "" +"Your account doesn't have permissions to copy all of the selected files and/" +"or folders." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 +msgid "There are no destination folders available." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:35 +msgid "There are no files and/or folders available to copy." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:40 +msgid "" +"The following files and/or folders will be copied to a destination folder " +"(retaining their tree structure):" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 +msgid "Destination folder:" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 +msgid "Copy" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 +msgid "" +"Your account doesn't have permissions to resize all of the selected images." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:18 +msgid "There are no images available to resize." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:20 +msgid "The following images will be resized:" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:32 +msgid "Choose an existing thumbnail option or enter resize parameters:" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:36 +msgid "" +"Warning: Images will be resized in-place and originals will be lost. Maybe " +"first make a copy of them to retain the originals." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:39 +msgid "Resize" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:35 +msgid "" +"Your account doesn't have permissions to move all of the selected files and/" +"or folders." +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:47 +msgid "There are no files and/or folders available to move." +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:52 +msgid "" +"The following files and/or folders will be moved to a destination folder " +"(retaining their tree structure):" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 +msgid "Move" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:15 +msgid "" +"Your account doesn't have permissions to rename all of the selected files." +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:18 +msgid "There are no files available to rename." +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:20 +msgid "" +"The following files will be renamed (they will stay in their folders and " +"keep original filename, only displayed filename will be changed):" +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:59 +msgid "Rename" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:16 +msgid "Name" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 +#, python-format +msgid "Change '%(item_label)s' folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "" + +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 +msgid "Select this file" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 +#, python-format +msgid "Change '%(item_label)s' details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "Permissions" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "disabled" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "enabled" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:144 +msgid "URL copied to clipboard" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:147 +#, python-format +msgid "Canonical url '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:151 +#, python-format +msgid "Download '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 +msgid "previous" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 +#, python-format +msgid "Page %(number)s of %(num_pages)s." +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 +msgid "next" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +msgid "Select all" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +msgid "Files" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +msgid "Add new" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:15 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "" + +#: templates/admin/filer/folder/new_folder_form.html:30 +msgid "Save" +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +msgid "File is missing" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "found" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "and" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:7 +msgid "cancel search" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "" + +#: templates/admin/filer/widgets/admin_folder.html:16 +msgid "Choose Folder" +msgstr "" + +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" +msgstr "" + +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" +msgstr "" + +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" +msgstr "" + +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" +msgstr "" + +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" +msgstr "" + +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." + +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" + +#~ msgid "Open file" +#~ msgstr "Open file" + +#~ msgid "Full size preview" +#~ msgstr "Full size preview" + +#~ msgid "Add Description" +#~ msgstr "Add Description" + +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" + +#~ msgid "none selected" +#~ msgstr "none selected" + +#~ msgid "Add Folder" +#~ msgstr "Add Folder" + +#~ msgid "Subject Location" +#~ msgstr "Subject location" + +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" + +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/locale/zh_TW/LC_MESSAGES/django.mo b/filer/locale/zh_TW/LC_MESSAGES/django.mo new file mode 100644 index 000000000..fdfa81427 Binary files /dev/null and b/filer/locale/zh_TW/LC_MESSAGES/django.mo differ diff --git a/filer/locale/zh_TW/LC_MESSAGES/django.po b/filer/locale/zh_TW/LC_MESSAGES/django.po new file mode 100644 index 000000000..a14b91d38 --- /dev/null +++ b/filer/locale/zh_TW/LC_MESSAGES/django.po @@ -0,0 +1,1219 @@ +# 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: +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django Filer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-30 18:10+0200\n" +"PO-Revision-Date: 2012-07-13 15:50+0000\n" +"Last-Translator: Angelo Dini \n" +"Language-Team: Chinese (Taiwan) (http://app.transifex.com/divio/django-filer/" +"language/zh_TW/)\n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: admin/clipboardadmin.py:17 +msgid "You do not have permission to upload files." +msgstr "" + +#: admin/clipboardadmin.py:18 +msgid "Can't find folder to upload. Please refresh and try again" +msgstr "" + +#: admin/clipboardadmin.py:20 +msgid "Can't use this folder, Permission Denied. Please select another folder." +msgstr "" + +#: admin/fileadmin.py:73 +msgid "Advanced" +msgstr "" + +#: admin/fileadmin.py:188 +msgid "canonical URL" +msgstr "" + +#: admin/folderadmin.py:411 admin/folderadmin.py:582 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" + +#: admin/folderadmin.py:434 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "" + +#: admin/folderadmin.py:460 +#, python-format +msgid "Directory listing for %(folder_name)s" +msgstr "" + +#: admin/folderadmin.py:475 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "" + +#: admin/folderadmin.py:612 +msgid "No action selected." +msgstr "" + +#: admin/folderadmin.py:664 +#, python-format +msgid "Successfully moved %(count)d files to clipboard." +msgstr "" + +#: admin/folderadmin.py:669 +msgid "Move selected files to clipboard" +msgstr "" + +#: admin/folderadmin.py:709 +#, python-format +msgid "Successfully disabled permissions for %(count)d files." +msgstr "" + +#: admin/folderadmin.py:711 +#, python-format +msgid "Successfully enabled permissions for %(count)d files." +msgstr "" + +#: admin/folderadmin.py:719 +msgid "Enable permissions for selected files" +msgstr "" + +#: admin/folderadmin.py:725 +msgid "Disable permissions for selected files" +msgstr "" + +#: admin/folderadmin.py:789 +#, python-format +msgid "Successfully deleted %(count)d files and/or folders." +msgstr "" + +#: admin/folderadmin.py:794 +msgid "Cannot delete files and/or folders" +msgstr "" + +#: admin/folderadmin.py:796 +msgid "Are you sure?" +msgstr "" + +#: admin/folderadmin.py:802 +msgid "Delete files and/or folders" +msgstr "" + +#: admin/folderadmin.py:823 +msgid "Delete selected files and/or folders" +msgstr "" + +#: admin/folderadmin.py:930 +#, python-format +msgid "Folders with names %s already exist at the selected destination" +msgstr "" + +#: admin/folderadmin.py:934 +#, python-format +msgid "" +"Successfully moved %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" + +#: admin/folderadmin.py:942 admin/folderadmin.py:944 +msgid "Move files and/or folders" +msgstr "" + +#: admin/folderadmin.py:959 +msgid "Move selected files and/or folders" +msgstr "" + +#: admin/folderadmin.py:1016 +#, python-format +msgid "Successfully renamed %(count)d files." +msgstr "" + +#: admin/folderadmin.py:1025 admin/folderadmin.py:1027 +#: admin/folderadmin.py:1042 +msgid "Rename files" +msgstr "" + +#: admin/folderadmin.py:1137 +#, python-format +msgid "" +"Successfully copied %(count)d files and/or folders to folder " +"'%(destination)s'." +msgstr "" + +#: admin/folderadmin.py:1155 admin/folderadmin.py:1157 +msgid "Copy files and/or folders" +msgstr "" + +#: admin/folderadmin.py:1174 +msgid "Copy selected files and/or folders" +msgstr "" + +#: admin/folderadmin.py:1279 +#, python-format +msgid "Successfully resized %(count)d images." +msgstr "" + +#: admin/folderadmin.py:1286 admin/folderadmin.py:1288 +msgid "Resize images" +msgstr "" + +#: admin/folderadmin.py:1303 +msgid "Resize selected images" +msgstr "" + +#: admin/forms.py:24 +msgid "Suffix which will be appended to filenames of copied files." +msgstr "" + +#: admin/forms.py:31 +#, python-format +msgid "" +"Suffix should be a valid, simple and lowercase filename part, like " +"\"%(valid)s\"." +msgstr "" + +#: admin/forms.py:52 +#, python-format +msgid "Unknown rename format value key \"%(key)s\"." +msgstr "" + +#: admin/forms.py:54 +#, python-format +msgid "Invalid rename format: %(error)s." +msgstr "" + +#: admin/forms.py:68 models/thumbnailoptionmodels.py:37 +msgid "thumbnail option" +msgstr "" + +#: admin/forms.py:72 models/thumbnailoptionmodels.py:15 +msgid "width" +msgstr "" + +#: admin/forms.py:73 models/thumbnailoptionmodels.py:20 +msgid "height" +msgstr "" + +#: admin/forms.py:74 models/thumbnailoptionmodels.py:25 +msgid "crop" +msgstr "" + +#: admin/forms.py:75 models/thumbnailoptionmodels.py:30 +msgid "upscale" +msgstr "" + +#: admin/forms.py:79 +msgid "Thumbnail option or resize parameters must be choosen." +msgstr "" + +#: admin/imageadmin.py:20 admin/imageadmin.py:112 +msgid "Subject location" +msgstr "" + +#: admin/imageadmin.py:21 +msgid "Location of the main subject of the scene. Format: \"x,y\"." +msgstr "" + +#: admin/imageadmin.py:59 +msgid "Invalid subject location format. " +msgstr "" + +#: admin/imageadmin.py:67 +msgid "Subject location is outside of the image. " +msgstr "" + +#: admin/imageadmin.py:76 +#, python-brace-format +msgid "Your input: \"{subject_location}\". " +msgstr "" + +#: admin/permissionadmin.py:10 models/foldermodels.py:380 +msgid "Who" +msgstr "" + +#: admin/permissionadmin.py:11 models/foldermodels.py:401 +msgid "What" +msgstr "" + +#: admin/views.py:55 +msgid "Folder with this name already exists." +msgstr "" + +#: apps.py:11 templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/directory_listing.html:33 +msgid "Filer" +msgstr "" + +#: contrib/django_cms/cms_toolbars.py:44 +msgid "Media library" +msgstr "" + +#: models/abstract.py:62 +msgid "default alt text" +msgstr "" + +#: models/abstract.py:69 +msgid "default caption" +msgstr "" + +#: models/abstract.py:76 +msgid "subject location" +msgstr "" + +#: models/abstract.py:91 +msgid "image" +msgstr "" + +#: models/abstract.py:92 +msgid "images" +msgstr "" + +#: models/abstract.py:148 +#, python-format +msgid "" +"Image format not recognized or image size exceeds limit of %(max_pixels)d " +"million pixels by a factor of two or more. Before uploading again, check " +"file format or resize image to %(width)d x %(height)d resolution or lower." +msgstr "" + +#: models/abstract.py:156 +#, python-format +msgid "" +"Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " +"million pixels. Before uploading again, resize image to %(width)d x " +"%(height)d resolution or lower." +msgstr "" + +#: models/clipboardmodels.py:11 models/foldermodels.py:289 +msgid "user" +msgstr "" + +#: models/clipboardmodels.py:17 models/filemodels.py:157 +msgid "files" +msgstr "" + +#: models/clipboardmodels.py:24 models/clipboardmodels.py:50 +msgid "clipboard" +msgstr "" + +#: models/clipboardmodels.py:25 +msgid "clipboards" +msgstr "" + +#: models/clipboardmodels.py:44 models/filemodels.py:74 +#: models/filemodels.py:156 +msgid "file" +msgstr "" + +#: models/clipboardmodels.py:56 +msgid "clipboard item" +msgstr "" + +#: models/clipboardmodels.py:57 +msgid "clipboard items" +msgstr "" + +#: models/filemodels.py:66 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "folder" +msgstr "" + +#: models/filemodels.py:81 +msgid "file size" +msgstr "" + +#: models/filemodels.py:87 +msgid "sha1" +msgstr "" + +#: models/filemodels.py:94 +msgid "has all mandatory data" +msgstr "" + +#: models/filemodels.py:100 +msgid "original filename" +msgstr "" + +#: models/filemodels.py:110 models/foldermodels.py:102 +#: models/thumbnailoptionmodels.py:10 +msgid "name" +msgstr "" + +#: models/filemodels.py:116 +msgid "description" +msgstr "" + +#: models/filemodels.py:125 models/foldermodels.py:108 +msgid "owner" +msgstr "" + +#: models/filemodels.py:129 models/foldermodels.py:116 +msgid "uploaded at" +msgstr "" + +#: models/filemodels.py:134 models/foldermodels.py:126 +msgid "modified at" +msgstr "" + +#: models/filemodels.py:140 +msgid "Permissions disabled" +msgstr "" + +#: models/filemodels.py:141 +msgid "" +"Disable any permission checking for this file. File will be publicly " +"accessible to anyone." +msgstr "" + +#: models/foldermodels.py:94 +msgid "parent" +msgstr "" + +#: models/foldermodels.py:121 +msgid "created at" +msgstr "" + +#: models/foldermodels.py:136 templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Folder" +msgstr "" + +#: models/foldermodels.py:137 +#: templates/admin/filer/folder/directory_thumbnail_list.html:12 +msgid "Folders" +msgstr "" + +#: models/foldermodels.py:260 +msgid "all items" +msgstr "" + +#: models/foldermodels.py:261 +msgid "this item only" +msgstr "" + +#: models/foldermodels.py:262 +msgid "this item and all children" +msgstr "" + +#: models/foldermodels.py:266 +msgid "inherit" +msgstr "" + +#: models/foldermodels.py:267 +msgid "allow" +msgstr "" + +#: models/foldermodels.py:268 +msgid "deny" +msgstr "" + +#: models/foldermodels.py:280 +msgid "type" +msgstr "" + +#: models/foldermodels.py:297 +msgid "group" +msgstr "" + +#: models/foldermodels.py:304 +msgid "everybody" +msgstr "" + +#: models/foldermodels.py:309 +msgid "can read" +msgstr "" + +#: models/foldermodels.py:317 +msgid "can edit" +msgstr "" + +#: models/foldermodels.py:325 +msgid "can add children" +msgstr "" + +#: models/foldermodels.py:333 +msgid "folder permission" +msgstr "" + +#: models/foldermodels.py:334 +msgid "folder permissions" +msgstr "" + +#: models/foldermodels.py:348 +msgid "Folder cannot be selected with type \"all items\"." +msgstr "" + +#: models/foldermodels.py:350 +msgid "Folder has to be selected when type is not \"all items\"." +msgstr "" + +#: models/foldermodels.py:352 +msgid "User or group cannot be selected together with \"everybody\"." +msgstr "" + +#: models/foldermodels.py:354 +msgid "At least one of user, group, or \"everybody\" has to be selected." +msgstr "" + +#: models/foldermodels.py:360 +msgid "All Folders" +msgstr "" + +#: models/foldermodels.py:362 +msgid "Logical Path" +msgstr "" + +#: models/foldermodels.py:371 +#, python-brace-format +msgid "User: {user}" +msgstr "" + +#: models/foldermodels.py:373 +#, python-brace-format +msgid "Group: {group}" +msgstr "" + +#: models/foldermodels.py:375 +msgid "Everybody" +msgstr "" + +#: models/foldermodels.py:388 templates/admin/filer/widgets/admin_file.html:45 +msgid "Edit" +msgstr "" + +#: models/foldermodels.py:389 +msgid "Read" +msgstr "" + +#: models/foldermodels.py:390 +msgid "Add children" +msgstr "" + +#: models/imagemodels.py:18 +msgid "date taken" +msgstr "" + +#: models/imagemodels.py:25 +msgid "author" +msgstr "" + +#: models/imagemodels.py:32 +msgid "must always publish author credit" +msgstr "" + +#: models/imagemodels.py:37 +msgid "must always publish copyright" +msgstr "" + +#: models/thumbnailoptionmodels.py:16 +msgid "width in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:21 +msgid "height in pixel." +msgstr "" + +#: models/thumbnailoptionmodels.py:38 +msgid "thumbnail options" +msgstr "" + +#: models/virtualitems.py:46 +#: templates/admin/filer/folder/directory_table_list.html:4 +#: templates/admin/filer/folder/directory_table_list.html:170 +#: templates/admin/filer/folder/directory_thumbnail_list.html:5 +#: templates/admin/filer/folder/directory_thumbnail_list.html:146 +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Unsorted Uploads" +msgstr "" + +#: models/virtualitems.py:73 +msgid "files with missing metadata" +msgstr "" + +#: models/virtualitems.py:87 templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "root" +msgstr "" + +#: settings.py:273 +msgid "Show table view" +msgstr "" + +#: settings.py:278 +msgid "Show thumbnail view" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Run the selected action" +msgstr "" + +#: templates/admin/filer/actions.html:5 +msgid "Go" +msgstr "" + +#: templates/admin/filer/actions.html:14 +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +msgid "Click here to select the objects across all pages" +msgstr "" + +#: templates/admin/filer/actions.html:14 +#, python-format +msgid "Select all %(total_count)s files and/or folders" +msgstr "" + +#: templates/admin/filer/actions.html:16 +#: templates/admin/filer/folder/directory_table_list.html:237 +#: templates/admin/filer/folder/directory_thumbnail_list.html:212 +msgid "Clear selection" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/directory_listing.html:28 +msgid "Go back to admin homepage" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:4 +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/directory_listing.html:29 +msgid "Home" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:5 +#: templates/admin/filer/folder/directory_listing.html:32 +msgid "Go back to Filer app" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:6 +#: templates/admin/filer/folder/directory_listing.html:35 +msgid "Go back to root folder" +msgstr "" + +#: templates/admin/filer/breadcrumbs.html:8 +#: templates/admin/filer/breadcrumbs.html:18 +#: templates/admin/filer/folder/change_form.html:10 +#: templates/admin/filer/folder/directory_listing.html:39 +#: templates/admin/filer/folder/directory_listing.html:47 +#, python-format +msgid "Go back to '%(folder_name)s' folder" +msgstr "" + +#: templates/admin/filer/change_form.html:26 +msgid "Duplicates" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:11 +msgid "" +"Deleting the selected files and/or folders would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:19 +msgid "" +"Deleting the selected files and/or folders would require deleting the " +"following protected related objects:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:27 +msgid "" +"Are you sure you want to delete the selected files and/or folders? All of " +"the following objects and their related items will be deleted:" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:46 +#: templates/admin/filer/folder/choose_copy_destination.html:64 +#: templates/admin/filer/folder/choose_move_destination.html:72 +msgid "No, take me back" +msgstr "" + +#: templates/admin/filer/delete_selected_files_confirmation.html:47 +msgid "Yes, I'm sure" +msgstr "" + +#: templates/admin/filer/file/change_form.html:35 +#: templates/admin/filer/folder/change_form.html:21 +#: templates/admin/filer/image/change_form.html:35 +msgid "History" +msgstr "" + +#: templates/admin/filer/file/change_form.html:37 +#: templates/admin/filer/folder/change_form.html:23 +#: templates/admin/filer/image/change_form.html:37 +msgid "View on site" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:6 +#: templates/admin/filer/folder/change_form.html:7 +#: templates/admin/filer/folder/change_form.html:8 +#: templates/admin/filer/folder/directory_listing.html:102 +msgid "Go back to" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:6 +msgid "admin homepage" +msgstr "" + +#: templates/admin/filer/folder/change_form.html:37 +#: templates/admin/filer/folder/directory_listing.html:95 +#: templates/admin/filer/folder/directory_listing.html:103 +#: templates/admin/filer/folder/directory_table_list.html:29 +#: templates/admin/filer/folder/directory_table_list.html:59 +#: templates/admin/filer/folder/directory_table_list.html:181 +#: templates/admin/filer/folder/directory_thumbnail_list.html:27 +#: templates/admin/filer/folder/directory_thumbnail_list.html:61 +#: templates/admin/filer/folder/directory_thumbnail_list.html:156 +msgid "Folder Icon" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:23 +msgid "" +"Your account doesn't have permissions to copy all of the selected files and/" +"or folders." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:25 +#: templates/admin/filer/folder/choose_copy_destination.html:31 +#: templates/admin/filer/folder/choose_copy_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:37 +#: templates/admin/filer/folder/choose_move_destination.html:43 +#: templates/admin/filer/folder/choose_move_destination.html:49 +msgid "Take me back" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:29 +#: templates/admin/filer/folder/choose_move_destination.html:41 +msgid "There are no destination folders available." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:35 +msgid "There are no files and/or folders available to copy." +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:40 +msgid "" +"The following files and/or folders will be copied to a destination folder " +"(retaining their tree structure):" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:54 +#: templates/admin/filer/folder/choose_move_destination.html:64 +msgid "Destination folder:" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:65 +#: templates/admin/filer/folder/choose_copy_destination.html:68 +#: templates/admin/filer/folder/directory_listing.html:178 +msgid "Copy" +msgstr "" + +#: templates/admin/filer/folder/choose_copy_destination.html:67 +msgid "It is not allowed to copy files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:15 +msgid "" +"Your account doesn't have permissions to resize all of the selected images." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:18 +msgid "There are no images available to resize." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:20 +msgid "The following images will be resized:" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:32 +msgid "Choose an existing thumbnail option or enter resize parameters:" +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:36 +msgid "" +"Warning: Images will be resized in-place and originals will be lost. Maybe " +"first make a copy of them to retain the originals." +msgstr "" + +#: templates/admin/filer/folder/choose_images_resize_options.html:39 +msgid "Resize" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:35 +msgid "" +"Your account doesn't have permissions to move all of the selected files and/" +"or folders." +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:47 +msgid "There are no files and/or folders available to move." +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:52 +msgid "" +"The following files and/or folders will be moved to a destination folder " +"(retaining their tree structure):" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:73 +#: templates/admin/filer/folder/choose_move_destination.html:76 +#: templates/admin/filer/folder/directory_listing.html:181 +msgid "Move" +msgstr "" + +#: templates/admin/filer/folder/choose_move_destination.html:75 +msgid "It is not allowed to move files into same folder" +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:15 +msgid "" +"Your account doesn't have permissions to rename all of the selected files." +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:18 +msgid "There are no files available to rename." +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:20 +msgid "" +"The following files will be renamed (they will stay in their folders and " +"keep original filename, only displayed filename will be changed):" +msgstr "" + +#: templates/admin/filer/folder/choose_rename_format.html:59 +msgid "Rename" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:94 +msgid "Go back to the parent folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change current folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:131 +msgid "Change" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:141 +msgid "Click here to run search for entered phrase" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:144 +msgid "Search" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:151 +msgid "Close" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:153 +msgid "Limit" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:158 +msgid "Check it to limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:159 +msgid "Limit the search to current folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:175 +msgid "Delete" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:203 +msgid "Adds a new Folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:206 +msgid "New Folder" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:211 +#: templates/admin/filer/folder/directory_listing.html:218 +#: templates/admin/filer/folder/directory_listing.html:221 +#: templates/admin/filer/folder/directory_listing.html:228 +#: templates/admin/filer/folder/directory_listing.html:235 +msgid "Upload Files" +msgstr "" + +#: templates/admin/filer/folder/directory_listing.html:233 +msgid "You have to select a folder first" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:16 +msgid "Name" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:17 +#: templates/admin/filer/tools/detail_info.html:50 +msgid "Owner" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:18 +#: templates/admin/filer/tools/detail_info.html:34 +msgid "Size" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:19 +msgid "Action" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:28 +#: templates/admin/filer/folder/directory_table_list.html:35 +#: templates/admin/filer/folder/directory_table_list.html:58 +#: templates/admin/filer/folder/directory_table_list.html:65 +#: templates/admin/filer/folder/directory_thumbnail_list.html:26 +#: templates/admin/filer/folder/directory_thumbnail_list.html:32 +#: templates/admin/filer/folder/directory_thumbnail_list.html:60 +#: templates/admin/filer/folder/directory_thumbnail_list.html:66 +#, python-format +msgid "Change '%(item_label)s' folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:76 +#: templates/admin/filer/tools/search_form.html:5 +#, python-format +msgid "%(counter)s folder" +msgid_plural "%(counter)s folders" +msgstr[0] "" + +#: templates/admin/filer/folder/directory_table_list.html:77 +#: templates/admin/filer/tools/search_form.html:6 +#, python-format +msgid "%(counter)s file" +msgid_plural "%(counter)s files" +msgstr[0] "" + +#: templates/admin/filer/folder/directory_table_list.html:83 +msgid "Change folder details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:84 +msgid "Remove folder" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:96 +#: templates/admin/filer/folder/directory_table_list.html:104 +#: templates/admin/filer/folder/directory_table_list.html:119 +#: templates/admin/filer/folder/directory_thumbnail_list.html:95 +#: templates/admin/filer/folder/directory_thumbnail_list.html:104 +#: templates/admin/filer/folder/directory_thumbnail_list.html:119 +msgid "Select this file" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:107 +#: templates/admin/filer/folder/directory_table_list.html:122 +#: templates/admin/filer/folder/directory_table_list.html:154 +#: templates/admin/filer/folder/directory_thumbnail_list.html:107 +#: templates/admin/filer/folder/directory_thumbnail_list.html:122 +#, python-format +msgid "Change '%(item_label)s' details" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "Permissions" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "disabled" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:131 +#: templates/admin/filer/folder/directory_thumbnail_list.html:130 +msgid "enabled" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:144 +msgid "URL copied to clipboard" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:147 +#, python-format +msgid "Canonical url '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:151 +#, python-format +msgid "Download '%(item_label)s'" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:155 +msgid "Remove file" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:163 +#: templates/admin/filer/folder/directory_thumbnail_list.html:138 +msgid "Drop files here or use the \"Upload Files\" button" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:178 +#: templates/admin/filer/folder/directory_thumbnail_list.html:153 +msgid "Drop your file to upload into:" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:188 +#: templates/admin/filer/folder/directory_thumbnail_list.html:163 +msgid "Upload" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:200 +#: templates/admin/filer/folder/directory_thumbnail_list.html:175 +msgid "cancel" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:204 +#: templates/admin/filer/folder/directory_thumbnail_list.html:179 +msgid "Upload success!" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:208 +#: templates/admin/filer/folder/directory_thumbnail_list.html:183 +msgid "Upload canceled!" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:215 +#: templates/admin/filer/folder/directory_thumbnail_list.html:190 +msgid "previous" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:220 +#: templates/admin/filer/folder/directory_thumbnail_list.html:195 +#, python-format +msgid "Page %(number)s of %(num_pages)s." +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:225 +#: templates/admin/filer/folder/directory_thumbnail_list.html:200 +msgid "next" +msgstr "" + +#: templates/admin/filer/folder/directory_table_list.html:235 +#: templates/admin/filer/folder/directory_thumbnail_list.html:210 +#, python-format +msgid "Select all %(total_count)s" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:15 +#: templates/admin/filer/folder/directory_thumbnail_list.html:80 +msgid "Select all" +msgstr "" + +#: templates/admin/filer/folder/directory_thumbnail_list.html:77 +msgid "Files" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +#: templates/admin/filer/folder/new_folder_form.html:7 +msgid "Add new" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:4 +msgid "Django site admin" +msgstr "" + +#: templates/admin/filer/folder/new_folder_form.html:15 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "" + +#: templates/admin/filer/folder/new_folder_form.html:30 +msgid "Save" +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:9 +msgid "Your browser does not support audio." +msgstr "" + +#: templates/admin/filer/templatetags/file_icon.html:14 +msgid "Your browser does not support video." +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:9 +msgid "Clipboard" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:21 +msgid "Paste all items here" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Move all clipboard files to" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:27 +msgid "Empty Clipboard" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard.html:50 +msgid "the clipboard is empty" +msgstr "" + +#: templates/admin/filer/tools/clipboard/clipboard_item_rows.html:16 +msgid "upload failed" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:11 +msgid "Download" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:16 +msgid "Expand" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:21 +#: templates/admin/filer/widgets/admin_file.html:32 +#: templatetags/filer_admin_tags.py:108 +msgid "File is missing" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:30 +msgid "Type" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:38 +msgid "File-size" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:42 +msgid "Modified" +msgstr "" + +#: templates/admin/filer/tools/detail_info.html:46 +msgid "Created" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "found" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:5 +msgid "and" +msgstr "" + +#: templates/admin/filer/tools/search_form.html:7 +msgid "cancel search" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:10 +#: templates/admin/filer/widgets/admin_file.html:39 +#: templates/admin/filer/widgets/admin_folder.html:18 +msgid "Clear" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:22 +msgid "or drop your file here" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:35 +msgid "no file selected" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:50 +#: templates/admin/filer/widgets/admin_folder.html:14 +msgid "Lookup" +msgstr "" + +#: templates/admin/filer/widgets/admin_file.html:51 +msgid "Choose File" +msgstr "" + +#: templates/admin/filer/widgets/admin_folder.html:16 +msgid "Choose Folder" +msgstr "" + +#: validation.py:20 +#, python-brace-format +msgid "File \"{file_name}\": Upload denied by site security policy" +msgstr "" + +#: validation.py:23 +#, python-brace-format +msgid "File \"{file_name}\": {file_type} upload denied by site security policy" +msgstr "" + +#: validation.py:34 +#, python-brace-format +msgid "File \"{file_name}\": HTML upload denied by site security policy" +msgstr "" + +#: validation.py:72 +#, python-brace-format +msgid "" +"File \"{file_name}\": Rejected due to potential cross site scripting " +"vulnerability" +msgstr "" + +#: validation.py:84 +#, python-brace-format +msgid "File \"{file_name}\": SVG file format not recognized" +msgstr "" + +#~ msgid "Resize parameters must be choosen." +#~ msgstr "Resize parameters must be choosen." + +#~ msgid "Choose resize parameters:" +#~ msgstr "Choose resize parameters:" + +#~ msgid "Open file" +#~ msgstr "Open file" + +#~ msgid "Full size preview" +#~ msgstr "Full size preview" + +#~ msgid "Add Description" +#~ msgstr "Add Description" + +#~ msgid "Author" +#~ msgstr "Author" + +#~ msgid "Add Alt-Text" +#~ msgstr "Add Alt-Text" + +#~ msgid "Add caption" +#~ msgstr "Add caption" + +#~ msgid "Add Tags" +#~ msgstr "Add Tags" + +#~ msgid "Change File" +#~ msgstr "Change File" + +#~ msgid "none selected" +#~ msgstr "none selected" + +#~ msgid "Add Folder" +#~ msgstr "Add Folder" + +#~ msgid "Subject Location" +#~ msgstr "Subject location" + +#~ msgid "" +#~ "\n" +#~ " %(counter)s file" +#~ msgid_plural "" +#~ "%(counter)s files\n" +#~ " " +#~ msgstr[0] "15c0f2d28d6dab1af1f6d94906beb627_pl_0" + +#~ msgid "Upload File" +#~ msgstr "Upload File" diff --git a/filer/management/commands/filer_check.py b/filer/management/commands/filer_check.py new file mode 100644 index 000000000..2213de57d --- /dev/null +++ b/filer/management/commands/filer_check.py @@ -0,0 +1,183 @@ +import os + +from django.core.management.base import BaseCommand +from django.utils.module_loading import import_string + +from PIL import UnidentifiedImageError + +from filer import settings as filer_settings +from filer.models.filemodels import File +from filer.utils.loader import load_model + + +class Command(BaseCommand): + help = "Check for orphaned files, missing file references, and set image dimensions." + + def add_arguments(self, parser): + parser.add_argument( + '--orphans', + action='store_true', + dest='orphans', + default=False, + help="Scan media folders for orphaned files.", + ) + parser.add_argument( + '--delete-orphans', + action='store_true', + dest='delete_orphans', + default=False, + help="Delete orphaned files from storage.", + ) + parser.add_argument( + '--missing', + action='store_true', + dest='missing', + default=False, + help="Check file references and report missing files.", + ) + parser.add_argument( + '--delete-missing', + action='store_true', + dest='delete_missing', + default=False, + help="Delete database entries if files are missing in the media folder.", + ) + parser.add_argument( + '--image-dimensions', + action='store_true', + dest='image_dimensions', + default=False, + help="Set image dimensions if they are not set.", + ) + parser.add_argument( + '--noinput', + '--no-input', + action='store_false', + dest='interactive', + default=True, + help="Do not prompt the user for any interactive input.", + ) + + def handle(self, *args, **options): + if options['missing']: + self.verify_references(options) + if options['delete_missing']: + if options['interactive']: + if input( + "\nThis will delete missing file references from the database.\n" + "Type 'yes' to continue, or 'no' to cancel: " + ) != 'yes': + self.stdout.write("Aborted: Missing file references were not deleted.\n") + self.stdout.flush() + return + self.verify_references(options) + + if options['orphans'] or options['delete_orphans']: + if options['delete_orphans'] and options['interactive']: + if input( + "\nThis will delete orphaned files from storage.\n" + "Type 'yes' to continue, or 'no' to cancel: " + ) != 'yes': + self.stdout.write("Aborted: Orphaned files were not deleted.\n") + self.stdout.flush() + return + self.verify_storages(options) + + if options['image_dimensions']: + self.image_dimensions(options) + + def verify_references(self, options): + """ + Checks that every file reference in the database exists in storage. + If a file is missing, either report it or delete the reference based on the provided options. + """ + for file in File.objects.all(): + if not file.file.storage.exists(file.file.name): + if options['delete_missing']: + file.delete() + verbose_msg = f"Deleted missing file reference '{file.folder}/{file}' from the database." + else: + verbose_msg = f"File reference '{file.folder}/{file}' is missing in storage." + if options.get('verbosity', 1) > 2: + self.stdout.write(verbose_msg + "\n") + self.stdout.flush() + elif options.get('verbosity'): + self.stdout.write(os.path.join(str(file.folder), str(file)) + "\n") + self.stdout.flush() + + def verify_storages(self, options): + """ + Scans all storages defined in FILER_STORAGES (e.g., public and private) + for orphaned files, then reports or deletes them based on the options. + """ + + def walk(storage, prefix, label_prefix): + # If the directory does not exist, there is nothing to scan + if not storage.exists(prefix): + return + child_dirs, files = storage.listdir(prefix) + for filename in files: + actual_path = os.path.join(prefix, filename) + relfilename = os.path.join(label_prefix, filename) + if not File.objects.filter(file=actual_path).exists(): + if options['delete_orphans']: + storage.delete(actual_path) + message = f"Deleted orphaned file '{relfilename}'" + else: + message = f"Found orphaned file '{relfilename}'" + if options.get('verbosity', 1) > 2: + self.stdout.write(message + "\n") + self.stdout.flush() + elif options.get('verbosity'): + self.stdout.write(relfilename + "\n") + self.stdout.flush() + for child in child_dirs: + walk(storage, os.path.join(prefix, child), os.path.join(label_prefix, child)) + + # Loop through each storage configuration (e.g., public, private, etc.) + for storage_name, storage_config in filer_settings.FILER_STORAGES.items(): + storage_settings = storage_config.get('main') + if not storage_settings: + continue + storage = import_string(storage_settings['ENGINE'])() + if storage_settings.get('OPTIONS', {}).get('location'): + storage.location = storage_settings['OPTIONS']['location'] + # Set label_prefix: for public and private storages, use their names. + label_prefix = storage_name if storage_name in ['public', 'private'] else storage_settings.get('UPLOAD_TO_PREFIX', '') + walk(storage, storage_settings.get('UPLOAD_TO_PREFIX', ''), label_prefix) + + def image_dimensions(self, options): + """ + For images without set dimensions (_width == 0 or None), try to read their dimensions + and save them, handling SVG files and possible image errors. + """ + from django.db.models import Q + + import easy_thumbnails + from easy_thumbnails.VIL import Image as VILImage + + from filer.utils.compatibility import PILImage + + ImageModel = load_model(filer_settings.FILER_IMAGE_MODEL) + images_without_dimensions = ImageModel.objects.filter(Q(_width=0) | Q(_width__isnull=True)) + self.stdout.write(f"Setting dimensions for {images_without_dimensions.count()} images" + "\n") + self.stdout.flush() + for image in images_without_dimensions: + file_holder = image.file_ptr if getattr(image, 'file_ptr', None) else image + try: + imgfile = file_holder.file + imgfile.seek(0) + except FileNotFoundError: + continue + if image.file.name.lower().endswith('.svg'): + # For SVG files, use VILImage (invalid SVGs do not throw errors) + with VILImage.load(imgfile) as vil_image: + image._width, image._height = vil_image.size + else: + try: + with PILImage.open(imgfile) as pil_image: + image._width, image._height = pil_image.size + image._transparent = easy_thumbnails.utils.is_transparent(pil_image) + except UnidentifiedImageError: + continue + image.save() diff --git a/filer/management/commands/generate_thumbnails.py b/filer/management/commands/generate_thumbnails.py new file mode 100644 index 000000000..64bf3df2f --- /dev/null +++ b/filer/management/commands/generate_thumbnails.py @@ -0,0 +1,28 @@ +from django.core.management.base import BaseCommand + +from filer.models.imagemodels import Image + + +class Command(BaseCommand): + + def handle(self, *args, **options): + """ + Generates image thumbnails + + NOTE: To keep memory consumption stable avoid iteration over the Image queryset + """ + pks = Image.objects.all().values_list('id', flat=True) + total = len(pks) + for idx, pk in enumerate(pks): + image = None + try: + image = Image.objects.get(pk=pk) + self.stdout.write(u'Processing image {0} / {1} {2}'.format(idx + 1, total, image)) + self.stdout.flush() + image.thumbnails + image.icons + except IOError as e: + self.stderr.write('Failed to generate thumbnails: {0}'.format(str(e))) + self.stderr.flush() + finally: + del image diff --git a/filer/migrations/0008_thumbnailoption_alter_image_options_and_more.py b/filer/migrations/0008_thumbnailoption_alter_image_options_and_more.py new file mode 100644 index 000000000..97260eb30 --- /dev/null +++ b/filer/migrations/0008_thumbnailoption_alter_image_options_and_more.py @@ -0,0 +1,133 @@ +# Generated by Django 5.1.15 on 2026-04-30 04:52 + +import django.db.models.deletion +import filer.fields.multistorage_file +import filer.models.filemodels +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + ('contenttypes', '0002_remove_content_type_name'), + ('filer', '0007_filer_file_size'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='ThumbnailOption', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100, verbose_name='name')), + ('width', models.IntegerField(help_text='width in pixel.', verbose_name='width')), + ('height', models.IntegerField(help_text='height in pixel.', verbose_name='height')), + ('crop', models.BooleanField(default=True, verbose_name='crop')), + ('upscale', models.BooleanField(default=True, verbose_name='upscale')), + ], + options={ + 'verbose_name': 'thumbnail option', + 'verbose_name_plural': 'thumbnail options', + 'ordering': ('width', 'height'), + }, + ), + migrations.AlterModelOptions( + name='image', + options={'default_manager_name': 'objects', 'verbose_name': 'image', 'verbose_name_plural': 'images'}, + ), + migrations.AddField( + model_name='file', + name='mime_type', + field=models.CharField(default='application/octet-stream', help_text='MIME type of uploaded content', max_length=255, validators=[filer.models.filemodels.mimetype_validator]), + ), + migrations.AddField( + model_name='image', + name='_transparent', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='file', + name='_file_size', + field=models.BigIntegerField(blank=True, null=True, verbose_name='file size'), + ), + migrations.AlterField( + model_name='file', + name='file', + field=filer.fields.multistorage_file.MultiStorageFileField(blank=True, db_index=True, max_length=1024, null=True, upload_to=filer.fields.multistorage_file.generate_filename_multistorage, verbose_name='file'), + ), + migrations.AlterField( + model_name='file', + name='owner', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='owned_%(class)ss', to=settings.AUTH_USER_MODEL, verbose_name='owner'), + ), + migrations.AlterField( + model_name='file', + name='polymorphic_ctype', + field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_%(app_label)s.%(class)s_set+', to='contenttypes.contenttype'), + ), + migrations.AlterField( + model_name='folder', + name='level', + field=models.PositiveIntegerField(editable=False), + ), + migrations.AlterField( + model_name='folder', + name='lft', + field=models.PositiveIntegerField(editable=False), + ), + migrations.AlterField( + model_name='folder', + name='rght', + field=models.PositiveIntegerField(editable=False), + ), + migrations.AlterField( + model_name='image', + name='_height', + field=models.FloatField(blank=True, null=True), + ), + migrations.AlterField( + model_name='image', + name='_width', + field=models.FloatField(blank=True, null=True), + ), + migrations.AlterField( + model_name='image', + name='default_alt_text', + field=models.CharField(blank=True, max_length=255, null=True, verbose_name='default alt text'), + ), + migrations.AlterField( + model_name='image', + name='default_caption', + field=models.CharField(blank=True, max_length=255, null=True, verbose_name='default caption'), + ), + migrations.AlterField( + model_name='image', + name='file_ptr', + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, related_name='%(app_label)s_%(class)s_file', serialize=False, to='filer.file'), + ), + migrations.AlterField( + model_name='image', + name='subject_location', + field=models.CharField(blank=True, default='', max_length=64, verbose_name='subject location'), + ), + migrations.CreateModel( + name='FolderPermission', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('type', models.SmallIntegerField(choices=[(0, 'all items'), (1, 'this item only'), (2, 'this item and all children')], default=0, verbose_name='type')), + ('everybody', models.BooleanField(default=False, verbose_name='everybody')), + ('can_read', models.SmallIntegerField(blank=True, choices=[(None, 'inherit'), (1, 'allow'), (0, 'deny')], default=None, null=True, verbose_name='can read')), + ('can_edit', models.SmallIntegerField(blank=True, choices=[(None, 'inherit'), (1, 'allow'), (0, 'deny')], default=None, null=True, verbose_name='can edit')), + ('can_add_children', models.SmallIntegerField(blank=True, choices=[(None, 'inherit'), (1, 'allow'), (0, 'deny')], default=None, null=True, verbose_name='can add children')), + ('folder', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='filer.folder', verbose_name='folder')), + ('group', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='filer_folder_permissions', to='auth.group', verbose_name='group')), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='filer_folder_permissions', to=settings.AUTH_USER_MODEL, verbose_name='user')), + ], + options={ + 'verbose_name': 'folder permission', + 'verbose_name_plural': 'folder permissions', + }, + ), + ] diff --git a/filer/models/__init__.py b/filer/models/__init__.py index 1f406fa1d..05e3867af 100644 --- a/filer/models/__init__.py +++ b/filer/models/__init__.py @@ -1,8 +1,12 @@ -#-*- coding: utf-8 -*- -from .mixins import * -from .filemodels import * -from .clipboardmodels import * -from .imagemodels import * -from .foldermodels import * -from .virtualitems import * -from .archivemodels import * +from .clipboardmodels import * # noqa +from .filemodels import * # noqa +from .foldermodels import * # noqa +from .imagemodels import * # noqa +from .thumbnailoptionmodels import * # noqa +from .virtualitems import * # noqa + +# PBS-specific: keep archive models for backward compatibility +try: + from .archivemodels import * # noqa +except ImportError: + pass diff --git a/filer/models/abstract.py b/filer/models/abstract.py new file mode 100644 index 000000000..f4747fd23 --- /dev/null +++ b/filer/models/abstract.py @@ -0,0 +1,306 @@ +import logging + +from django.conf import settings +from django.core.checks import Warning +from django.core.checks import register as register_check +from django.core.exceptions import ValidationError +from django.db import models +from django.utils.functional import cached_property +from django.utils.translation import gettext_lazy as _ + +import easy_thumbnails.utils +try: + from easy_thumbnails.VIL import Image as VILImage +except (ImportError, ModuleNotFoundError): + VILImage = None +from PIL.Image import MAX_IMAGE_PIXELS + +from .. import settings as filer_settings +from ..utils.compatibility import PILImage +from ..utils.filer_easy_thumbnails import FilerThumbnailer +from ..utils.pil_exif import get_exif_for_file +from .filemodels import File + + +logger = logging.getLogger(__name__) + + +# We can never exceed the max pixel value set by Pillow's PIL Image MAX_IMAGE_PIXELS +# as if we allow it, it will fail while thumbnailing (first in the admin thumbnails +# and then in the page itself. +# Refer this https://github.com/python-pillow/Pillow/blob/b723e9e62e4706a85f7e44cb42b3d838dae5e546/src/PIL/Image.py#L3148 +FILER_MAX_IMAGE_PIXELS = getattr(settings, "FILER_MAX_IMAGE_PIXELS", MAX_IMAGE_PIXELS) +if MAX_IMAGE_PIXELS is not None: + FILER_MAX_IMAGE_PIXELS = min(FILER_MAX_IMAGE_PIXELS, MAX_IMAGE_PIXELS) + + +@register_check() +def max_pixel_setting_check(app_configs, **kwargs): + if not FILER_MAX_IMAGE_PIXELS: + return [ + Warning( + "Both settings.FILER_MAX_IMAGE_PIXELS and PIL.Image.MAX_IMAGE_PIXELS are not set.", + hint="Set FILER_MAX_IMAGE_PIXELS to a positive integer value in your settings.py. " + "This setting is used to limit the maximum number of pixels an image can have " + "to protect your site from memory bombs.", + obj=settings, + ) + ] + return [] + + +class BaseImage(File): + SIDEBAR_IMAGE_WIDTH = 210 + DEFAULT_THUMBNAILS = { + 'admin_clipboard_icon': {'size': (32, 32), 'crop': True, + 'upscale': True}, + 'admin_sidebar_preview': {'size': (SIDEBAR_IMAGE_WIDTH, 0), 'upscale': True}, + 'admin_directory_listing_icon': {'size': (48, 48), + 'crop': True, 'upscale': True}, + 'admin_tiny_icon': {'size': (32, 32), 'crop': True, 'upscale': True}, + } + file_type = 'Image' + _icon = "image" + _filename_extensions = ['.jpg', '.jpeg', '.png', '.gif', '.svg', '.webp'] + + _height = models.FloatField( + null=True, + blank=True, + ) + + _width = models.FloatField( + null=True, + blank=True, + ) + + _transparent = models.BooleanField( + null=False, + default=False, + ) + + default_alt_text = models.CharField( + _("default alt text"), + max_length=255, + blank=True, + null=True, + ) + + default_caption = models.CharField( + _("default caption"), + max_length=255, + blank=True, + null=True, + ) + + subject_location = models.CharField( + _("subject location"), + max_length=64, + blank=True, + default='', + ) + + file_ptr = models.OneToOneField( + to='filer.File', + parent_link=True, + related_name='%(app_label)s_%(class)s_file', + on_delete=models.CASCADE, + ) + + class Meta: + app_label = 'filer' + verbose_name = _("image") + verbose_name_plural = _("images") + abstract = True + default_manager_name = 'objects' + + @classmethod + def matches_file_type(cls, iname, ifile, mime_type): + # source: https://www.freeformatter.com/mime-types-list.html + from ..settings import IMAGE_MIME_TYPES + if not mime_type: + return False + maintype, subtype = mime_type.split('/') + return maintype == 'image' and subtype in IMAGE_MIME_TYPES + + def file_data_changed(self, post_init=False): + attrs_updated = super().file_data_changed(post_init=post_init) + if attrs_updated: + try: + try: + imgfile = self.file.file + except ValueError: + imgfile = self.file_ptr.file + imgfile.seek(0) + if self.mime_type == 'image/svg+xml': + self._width, self._height = VILImage.load(imgfile).size + self._transparent = True + else: + pil_image = PILImage.open(imgfile) + self._width, self._height = pil_image.size + self._transparent = easy_thumbnails.utils.is_transparent(pil_image) + imgfile.seek(0) + except Exception as e: + logger.warning( + "Could not read image dimensions for '%s' (mime=%s): %s: %s", + getattr(self, 'original_filename', '?'), + getattr(self, 'mime_type', '?'), + type(e).__name__, + e, + ) + if post_init is False: + # in case `imgfile` could not be found, unset dimensions + # but only if not initialized by loading a fixture file + self._width, self._height = None, None + self._transparent = False + return attrs_updated + + def clean(self): + # We check the Image size and calculate the pixel before + # the image gets attached to a folder and saved. We also + # send the error msg in the JSON and also post the message + # so that they know what is wrong with the image they uploaded + # Only check pixel size for new uploads (no pk yet) + if self.file and FILER_MAX_IMAGE_PIXELS and not self.pk: + if self._width is None or self._height is None: + # Image dimensions could not be determined – this can happen + # for valid images that Pillow cannot fully parse (e.g. unusual + # JPEG markers, CMYK colour space, progressive encoding, etc.). + # Do NOT reject the upload; just skip the pixel-limit check and + # log a warning so operators can investigate if needed. + logger.warning( + "Skipping pixel-limit check for '%s' (mime=%s): " + "image dimensions could not be determined.", + getattr(self, 'original_filename', '?'), + getattr(self, 'mime_type', '?'), + ) + super().clean() + return + + width, height = max(1, self.width), max(1, self.height) + pixels: int = width * height + aspect: float = width / height + res_x: int = int((FILER_MAX_IMAGE_PIXELS * aspect) ** 0.5) + res_y: int = int(res_x / aspect) + if pixels > 2 * FILER_MAX_IMAGE_PIXELS: + msg = _( + "Image format not recognized or image size exceeds limit of %(max_pixels)d million " + "pixels by a factor of two or more. Before uploading again, check file format or resize " + "image to %(width)d x %(height)d resolution or lower." + ) % dict(max_pixels=FILER_MAX_IMAGE_PIXELS // 1000000, width=res_x, height=res_y) + raise ValidationError(str(msg), code="image_size") + + if pixels > FILER_MAX_IMAGE_PIXELS: + msg = _( + "Image size (%(pixels)d million pixels) exceeds limit of %(max_pixels)d " + "million pixels. Before uploading again, resize image to %(width)d x %(height)d " + "resolution or lower." + ) % dict(pixels=pixels // 1000000, max_pixels=FILER_MAX_IMAGE_PIXELS // 1000000, + width=res_x, height=res_y) + raise ValidationError(str(msg), code="image_size") + super().clean() + + def save(self, *args, **kwargs): + self.has_all_mandatory_data = self._check_validity() + super().save(*args, **kwargs) + + def _check_validity(self): + if not self.name: + return False + return True + + def sidebar_image_ratio(self): + if self.width: + return float(self.width) / float(self.SIDEBAR_IMAGE_WIDTH) + else: + return 1.0 + + @cached_property + def exif(self): + try: + return get_exif_for_file(self.file) + except Exception: + return {} + + def has_edit_permission(self, request): + return self.has_generic_permission(request, 'edit') + + def has_read_permission(self, request): + return self.has_generic_permission(request, 'read') + + def has_add_children_permission(self, request): + return self.has_generic_permission(request, 'add_children') + + def has_generic_permission(self, request, permission_type): + """ + Return true if the current user has permission on this + image. Return the string 'ALL' if the user has all rights. + """ + user = request.user + if not user.is_authenticated: + return False + elif user.is_superuser: + return True + elif user == self.owner: + return True + elif self.folder: + return self.folder.has_generic_permission(request, permission_type) + else: + return False + + @property + def label(self): + if self.name in ['', None]: + return self.original_filename or 'unnamed file' + else: + return self.name + + @property + def width(self): + return self._width or 0.0 + + @property + def height(self): + return self._height or 0.0 + + def _generate_thumbnails(self, required_thumbnails): + from filer.utils.cdn import get_cdn_url + _thumbnails = {} + for name, opts in required_thumbnails.items(): + try: + opts.update({'subject_location': self.subject_location}) + thumb = self.file.get_thumbnail(opts) + _thumbnails[name] = get_cdn_url(self, thumb.url) + except Exception as e: + # catch exception and manage it. We can re-raise it for debugging + # purposes and/or just logging it, provided user configured + # proper logging configuration + if filer_settings.FILER_ENABLE_LOGGING: + logger.error('Error while generating thumbnail: %s', e) + if filer_settings.FILER_DEBUG: + raise + return _thumbnails + + @property + def icons(self): + required_thumbnails = { + size: { + 'size': (int(size), int(size)), + 'crop': True, + 'upscale': True, + 'subject_location': self.subject_location, + } + for size in filer_settings.FILER_ADMIN_ICON_SIZES} + return self._generate_thumbnails(required_thumbnails) + + @property + def thumbnails(self): + return self._generate_thumbnails(BaseImage.DEFAULT_THUMBNAILS) + + @property + def easy_thumbnails_thumbnailer(self): + tn = FilerThumbnailer( + file=self.file, name=self.file.name, + source_storage=self.file.source_storage, + thumbnail_storage=self.file.thumbnail_storage, + thumbnail_basedir=self.file.thumbnail_basedir) + return tn diff --git a/filer/models/archivemodels.py b/filer/models/archivemodels.py index 70bed0d7f..3bc657119 100644 --- a/filer/models/archivemodels.py +++ b/filer/models/archivemodels.py @@ -107,11 +107,13 @@ def _extract_zip(self, filer_file): file. It first creates the parent folder of the selected file if it does not already exist, similair to mkdir -p. """ + import posixpath zippy = zipfile.ZipFile(filer_file) entries = zippy.infolist() for entry in entries: full_path = to_unicode(entry.filename) - filename = os.path.basename(full_path) + # Use posixpath since zip files always use '/' as separator + filename = posixpath.basename(full_path) parent_dir = self._create_parent_folders(full_path) if filename: data = zippy.read(entry) @@ -119,9 +121,12 @@ def _extract_zip(self, filer_file): def _create_parent_folders(self, full_path): """Creates the folder parents for a given entry.""" - dir_parents_of_entry = full_path.split(os.sep)[:-1] + # Zip files always use '/' as path separator, regardless of OS + dir_parents_of_entry = full_path.replace('\\', '/').split('/')[:-1] parent_dir = self.folder for directory_name in dir_parents_of_entry: + if not directory_name: + continue parent_dir = self._create_folder( directory_name, parent_dir) return parent_dir @@ -156,8 +161,10 @@ def _is_valid_image(self, content_file): def _create_file(self, basename, folder, data): """Helper wrapper of creating a filer file.""" + import mimetypes file_data = ContentFile(data, name=basename) - matched_file_types = matching_file_subtypes(basename, None, None) + mime_type = mimetypes.guess_type(basename)[0] + matched_file_types = matching_file_subtypes(basename, None, mime_type) FileSubClass = matched_file_types[0] if (FileSubClass is FilerImage and not self._is_valid_image(file_data)): diff --git a/filer/models/clipboardmodels.py b/filer/models/clipboardmodels.py index bc846f072..cde011818 100644 --- a/filer/models/clipboardmodels.py +++ b/filer/models/clipboardmodels.py @@ -1,22 +1,36 @@ -#-*- coding: utf-8 -*- +from django.conf import settings from django.contrib.auth import models as auth_models from django.db import models from django.utils.translation import gettext_lazy as _ -from filer.models import filemodels + +from . import filemodels class Clipboard(models.Model): user = models.OneToOneField( - auth_models.User, verbose_name=_('user'), related_name="filer_clipboard", on_delete=models.CASCADE + getattr(settings, 'AUTH_USER_MODEL', 'auth.User'), + verbose_name=_('user'), + related_name="filer_clipboard", + on_delete=models.CASCADE, ) + files = models.ManyToManyField( - 'File', verbose_name=_('files'), related_name="in_clipboards", - through='ClipboardItem') + 'File', + verbose_name=_('files'), + related_name="in_clipboards", + through='ClipboardItem', + ) + + # PBS-specific: folder_name used for clipboard upload paths folder_name = "_clipboard" + class Meta: + app_label = 'filer' + verbose_name = _("clipboard") + verbose_name_plural = _("clipboards") + def append_file(self, file_obj): try: - # We have to check if file is already in the clipboard as otherwise polymorphic complains self.files.get(pk=file_obj.pk) return False except filemodels.File.DoesNotExist: @@ -30,19 +44,23 @@ def empty(self): empty.alters_data = True def __str__(self): - return "Clipboard %s of %s" % (self.id, self.user) - - class Meta: - app_label = 'filer' - verbose_name = _('clipboard') - verbose_name_plural = _('clipboards') + return f"Clipboard {self.id} of {self.user}" class ClipboardItem(models.Model): - file = models.ForeignKey('File', verbose_name=_('file'), on_delete=models.CASCADE) - clipboard = models.ForeignKey(Clipboard, verbose_name=_('clipboard'), on_delete=models.CASCADE) + file = models.ForeignKey( + 'File', + verbose_name=_("file"), + on_delete=models.CASCADE, + ) + + clipboard = models.ForeignKey( + Clipboard, + verbose_name=_("clipboard"), + on_delete=models.CASCADE, + ) class Meta: app_label = 'filer' - verbose_name = _('clipboard item') - verbose_name_plural = _('clipboard items') + verbose_name = _("clipboard item") + verbose_name_plural = _("clipboard items") diff --git a/filer/models/filemodels.py b/filer/models/filemodels.py index 20da2d068..2191aff6a 100644 --- a/filer/models/filemodels.py +++ b/filer/models/filemodels.py @@ -1,37 +1,46 @@ -#-*- coding: utf-8 -*- import hashlib +import mimetypes import os -import filer import logging +from datetime import datetime, timezone +from django.conf import settings from django.contrib.auth import models as auth_models -from django.urls import reverse -from django.core.files.base import ContentFile from django.core.exceptions import ValidationError -from django.db import (models, IntegrityError, transaction) -from django.db.models import DEFERRED +from django.core.files.base import ContentFile +from django.db import models, IntegrityError, transaction +from django.db.models import DEFERRED, Count +from django.urls import NoReverseMatch, reverse +from django.utils.functional import cached_property +from django.utils import timezone as django_timezone from django.utils.translation import gettext_lazy as _ -from filer.fields.multistorage_file import MultiStorageFileField -from filer.models import mixins -from filer.utils.cms_roles import * -from filer.utils.files import matching_file_subtypes -from filer import settings as filer_settings -from filer.utils.cache import invalidate_folder_listing_cache, invalidate_folder_listing_cache_for_file -from django.db.models import Count -from django.utils import timezone -from polymorphic.models import PolymorphicModel from polymorphic.managers import PolymorphicManager +from polymorphic.models import PolymorphicModel from polymorphic.query import PolymorphicQuerySet +from .. import settings as filer_settings +from ..fields.multistorage_file import MultiStorageFileField +from ..utils.cache import invalidate_folder_listing_cache, invalidate_folder_listing_cache_for_file +from ..utils.cms_roles import ( + get_sites_without_restriction_perm, + has_admin_role, + has_role_on_site, + can_restrict_on_site, +) +from ..utils.files import matching_file_subtypes +from . import mixins + +import filer + logger = logging.getLogger(__name__) def silence_error_if_missing_file(exception): """ - Ugly way of checking in an exception describes a 'missing file'. + Ugly way of checking if an exception describes a 'missing file'. """ - missing_files_errs = ('no such file', 'does not exist', ) + missing_files_errs = ('no such file', 'does not exist',) def find_msg_in_error(msg): return msg in str(exception).lower() @@ -41,7 +50,12 @@ def find_msg_in_error(msg): class FileQuerySet(PolymorphicQuerySet): + def only(self, *fields): + fields = set(fields) + fields.update(["_file_size", "sha1", "is_public"]) + return super().only(*fields) + # PBS-specific querysets def readonly(self, user): Folder = filer.models.foldermodels.Folder return self.filter(folder__folder_type=Folder.CORE_FOLDER) @@ -69,9 +83,7 @@ def unrestricted(self, user): class FileManager(PolymorphicManager): queryset_class = FileQuerySet - # Proxy all unknown method calls to the queryset, so that its members are - # directly accessible as PolymorphicModel.objects.* - # Exclude any special functions (__) from this automatic proxying. + # Proxy all unknown method calls to the queryset def __getattr__(self, name): if name.startswith('__'): return super(PolymorphicManager, self).__getattr__(self, name) @@ -82,69 +94,145 @@ def find_all_duplicates(self): for file_data in self.get_queryset().values('sha1').annotate( count=Count('id')).filter(count__gt=1)} + def find_duplicates(self, file_obj): + return [i for i in self.exclude(pk=file_obj.pk).filter(sha1=file_obj.sha1)] -class AliveFileManager(FileManager): - # this is required in order to make sure that other models that are - # related to filer files will get an DoesNotExist exception if the file - # is in trash +# PBS-specific managers for trash system +class AliveFileManager(FileManager): def get_queryset(self): - return super(AliveFileManager, self).get_queryset().filter( - deleted_at__isnull=True) + return super().get_queryset().filter(deleted_at__isnull=True) class TrashFileManager(FileManager): - def get_queryset(self): - return super(TrashFileManager, self).get_queryset().filter( - deleted_at__isnull=False) + return super().get_queryset().filter(deleted_at__isnull=False) -@mixins.trashable -class File(PolymorphicModel, - mixins.IconsMixin): +def is_public_default(): + # not using this setting directly as `is_public` default value + # so that Django doesn't generate new migrations upon setting change + return filer_settings.FILER_IS_PUBLIC_DEFAULT - file_type = 'File' - _icon = "file" - folder = models.ForeignKey('filer.Folder', verbose_name=_('folder'), related_name='all_files', - null=True, blank=True, on_delete=models.deletion.CASCADE) - file = MultiStorageFileField(_('file'), null=True, blank=True, db_index=True, max_length=1024) - _file_size = models.IntegerField(_('file size'), null=True, blank=True) - sha1 = models.CharField(_('sha1'), max_length=40, blank=True, default='') +def mimetype_validator(value): + if not mimetypes.guess_extension(value): + msg = "'{mimetype}' is not a recognized MIME-Type." + raise ValidationError(msg.format(mimetype=value)) + - has_all_mandatory_data = models.BooleanField(_('has all mandatory data'), default=False, editable=False) +@mixins.trashable +class File(PolymorphicModel, mixins.IconsMixin): + file_type = 'File' + _icon = 'file' + _file_data_changed_hint = None + + folder = models.ForeignKey( + 'filer.Folder', + verbose_name=_("folder"), + related_name='all_files', + null=True, + blank=True, + on_delete=models.CASCADE, + ) + + file = MultiStorageFileField( + _("file"), + null=True, + blank=True, + db_index=True, + max_length=1024, + ) + + _file_size = models.BigIntegerField( + _("file size"), + null=True, + blank=True, + ) + + sha1 = models.CharField( + _("sha1"), + max_length=40, + blank=True, + default='', + ) + + has_all_mandatory_data = models.BooleanField( + _("has all mandatory data"), + default=False, + editable=False, + ) + + original_filename = models.CharField( + _("original filename"), + max_length=255, + blank=True, + null=True, + ) - original_filename = models.CharField(_('original filename'), max_length=255, blank=True, null=True) name = models.CharField( - max_length=255, null=True, blank=True, verbose_name=_('file name'), + max_length=255, + null=True, + blank=True, + verbose_name=_("file name"), help_text=_('Change the FILE name for an image in the cloud storage' ' system; be sure to include the extension ' '(.jpg or .png, for example) to ensure asset remains ' - 'valid.')) + 'valid.'), + ) + title = models.CharField( - max_length=255, null=True, blank=True, verbose_name=_('name'), + max_length=255, + null=True, + blank=True, + verbose_name=_("name"), help_text=_('Used in the Photo Gallery plugin as a title or name for' - ' an image; not displayed via the image plugin.')) + ' an image; not displayed via the image plugin.'), + ) + description = models.TextField( - null=True, blank=True, verbose_name=_('description'), + null=True, + blank=True, + verbose_name=_("description"), help_text=_('Used in the Photo Gallery plugin as a description;' - ' not displayed via the image plugin.')) - - owner = models.ForeignKey(auth_models.User, - related_name='owned_%(class)ss', on_delete=models.SET_NULL, - null=True, blank=True, verbose_name=_('owner')) - - uploaded_at = models.DateTimeField(_('uploaded at'), auto_now_add=True) - modified_at = models.DateTimeField(_('modified at'), auto_now=True) + ' not displayed via the image plugin.'), + ) + + owner = models.ForeignKey( + getattr(settings, 'AUTH_USER_MODEL', 'auth.User'), + related_name='owned_%(class)ss', + on_delete=models.SET_NULL, + null=True, + blank=True, + verbose_name=_("owner"), + ) + + uploaded_at = models.DateTimeField( + _("uploaded at"), + auto_now_add=True, + ) + + modified_at = models.DateTimeField( + _("modified at"), + auto_now=True, + ) is_public = models.BooleanField( default=filer_settings.FILER_IS_PUBLIC_DEFAULT, - verbose_name=_('Permissions disabled'), - help_text=_('Disable any permission checking for this ' +\ - 'file. File will be publicly accessible ' +\ - 'to anyone.')) - + verbose_name=_("Permissions disabled"), + help_text=_("Disable any permission checking for this " + "file. File will be publicly accessible " + "to anyone."), + ) + + mime_type = models.CharField( + max_length=255, + help_text="MIME type of uploaded content", + validators=[mimetype_validator], + default='application/octet-stream', + ) + + # PBS-specific: restricted field restricted = models.BooleanField( _("Restrict Editors and Writers from being able to edit " "or delete this asset"), default=False, @@ -152,13 +240,19 @@ class File(PolymorphicModel, 'Editors and Writers will still be able to ' 'view the asset, add it to a plugin or smart ' 'snippet but will not be able to delete or ' - 'modify the current version of the asset.')) - + 'modify the current version of the asset.'), + ) + # PBS-specific: trash managers objects = AliveFileManager() trash = TrashFileManager() all_objects = FileManager() + class Meta: + app_label = 'filer' + verbose_name = _("file") + verbose_name_plural = _("files") + @classmethod def matches_file_type(cls, iname, ifile, request): return True # I match all files... @@ -170,8 +264,8 @@ def matches_file_type(cls, iname, ifile, request): _UNKNOWN = object() def __init__(self, *args, **kwargs): - super(File, self).__init__(*args, **kwargs) - # Use __dict__ to avoid triggering deferred field loading + super().__init__(*args, **kwargs) + # PBS: Use __dict__ to avoid triggering deferred field loading # which can cause recursion in Django 5.1+ (from_db calls __init__). raw_is_public = self.__dict__.get('is_public', DEFERRED) if raw_is_public is DEFERRED: @@ -200,6 +294,40 @@ def __init__(self, *args, **kwargs): raw_folder_id = self.__dict__.get('folder_id', DEFERRED) self._old_folder_id = self._UNKNOWN if raw_folder_id is DEFERRED else raw_folder_id + @cached_property + def mime_maintype(self): + return self.mime_type.split('/')[0] + + @cached_property + def mime_subtype(self): + return self.mime_type.split('/')[1] + + def file_data_changed(self, post_init=False): + """ + This is called whenever self.file changes (including initial set in __init__). + Returns True if data related attributes were updated, False otherwise. + """ + if self._file_data_changed_hint is not None: + data_changed_hint = self._file_data_changed_hint + self._file_data_changed_hint = None + if not data_changed_hint: + return False + if post_init and self._file_size and self.sha1: + return False + try: + self._file_size = self.file.size + except: # noqa + self._file_size = None + try: + self.generate_sha1() + except Exception: + self.sha1 = '' + try: + self.mime_type = mimetypes.guess_type(self.file.name)[0] or 'application/octet-stream' + except Exception: + pass + return True + def clean(self): if self.name: self.name = self.name.strip() @@ -214,7 +342,7 @@ def clean(self): old_file_type = self.get_real_instance_class() new_file_type = matching_file_subtypes(self.name, None, None)[0] - if not old_file_type is new_file_type: + if old_file_type is not new_file_type: supported_extensions = getattr( old_file_type, '_filename_extensions', []) if supported_extensions: @@ -224,15 +352,15 @@ def clean(self): ', '.join(supported_extensions)) else: err_msg = "Extension %s is not allowed for this file " \ - "type." % (extension, ) + "type." % (extension,) raise ValidationError(err_msg) if self.folder: entries = self.folder.entries_with_names([self.actual_name]) if entries and any(entry.pk != self.pk for entry in entries): raise ValidationError( - _('Current folder already contains a file named %s') % \ - self.actual_name) + _('Current folder already contains a file named %s') % + self.actual_name) def _move_file(self): """ @@ -250,29 +378,21 @@ def _move_file(self): dst_storage = self.file.storages['private'] # delete the thumbnail - # We are toggling the is_public to make sure that easy_thumbnails can - # delete the thumbnails self.is_public = not self.is_public self.file.delete_thumbnails() self.is_public = not self.is_public - # This is needed because most of the remote File Storage backend do not - # open the file. src_file = src_storage.open(src_file_name) - src_file.open() - self.file = dst_storage.save(dst_file_name, - ContentFile(src_file.read(), name=os.path.basename(dst_file_name))) - src_file.close() + with src_file.open() as f: + content_file = ContentFile(f.read()) + self._file_data_changed_hint = False + self.file = dst_storage.save(dst_file_name, content_file) src_storage.delete(src_file_name) def _copy_file(self, destination, overwrite=False): """ Copies the file to a destination files and returns it. """ - if overwrite: - # If the destination file already exists default storage backend - # does not overwrite it but generates another filename. - # TODO: Find a way to override this behavior. raise NotImplementedError src_file_name = self._current_file_location @@ -281,14 +401,10 @@ def _copy_file(self, destination, overwrite=False): if hasattr(storage, 'copy'): storage.copy(src_file_name, destination) else: - # This is needed because most of the remote File Storage backend do not - # open the file. src_file = storage.open(src_file_name) src_file.open() file_content = src_file.read() src_file.close() - # Delete existing file at destination to prevent Django's storage - # from deduplicating the filename (appending random suffix). if storage.exists(destination): storage.delete(destination) destination = storage.save(destination, @@ -301,11 +417,15 @@ def _copy_file(self, destination, overwrite=False): def generate_sha1(self): sha = hashlib.sha1() self.file.seek(0) - sha.update(self.file.read()) + while True: + buf = self.file.read(104857600) + if not buf: + break + sha.update(buf) self.sha1 = sha.hexdigest() - # to make sure later operations can read the whole file self.file.seek(0) + # PBS-specific: set restricted from folder def set_restricted_from_folder(self): if self.folder and self.folder.restricted: self.restricted = self.folder.restricted @@ -315,14 +435,13 @@ def save(self, *args, **kwargs): # check if this is a subclass of "File" or not and set # _file_type_plugin_name if self.__class__ == File: - # what should we do now? - # maybe this has a subclass, but is being saved as a File instance - # anyway. do we need to go check all possible subclasses? pass elif issubclass(self.__class__, File): self._file_type_plugin_name = self.__class__.__name__ + # Ensure file metadata is computed on first save + if not self.sha1 and self.file: + self.file_data_changed() # cache the file size - # TODO: only do this if needed (depending on the storage backend the whole file will be downloaded) try: self._file_size = self.file.size except: @@ -332,10 +451,9 @@ def save(self, *args, **kwargs): self._old_is_public = self.is_public # generate SHA1 hash - # TODO: only do this if needed (depending on the storage backend the whole file will be downloaded) try: self.generate_sha1() - except (IOError, TypeError, ValueError) as e: + except (IOError, TypeError, ValueError): pass replaced_file = (self._old_sha1 is not self._UNKNOWN and self._old_sha1 != self.sha1) @@ -343,11 +461,11 @@ def save(self, *args, **kwargs): old_folder_id = self._old_folder_id if filer_settings.FOLDER_AFFECTS_URL and (self._is_path_changed() or replaced_file): if replaced_file and not self._is_name_changed(): - self.name = None # if new file submitted for same id we overwrite what was previously in name + self.name = None self._force_commit = True self.update_location_on_storage(*args, **kwargs) else: - super(File, self).save(*args, **kwargs) + super().save(*args, **kwargs) # Invalidate cache for the current folder invalidate_folder_listing_cache_for_file(self) # If file moved between folders, also invalidate the old folder @@ -374,9 +492,6 @@ def _is_name_changed(self): def _is_path_changed(self): """ Used to detect if file location on storage should be updated or not. - Since this is used only to check if location should be updated, - the values will be reset after the file is copied in the - destination location on storage. """ # If previous values are unknown (deferred), skip change-detection # to avoid triggering unnecessary file copies/moves on storage. @@ -390,7 +505,6 @@ def _is_path_changed(self): name_changed = self._old_name != self.name folder_changed = self._old_folder_id != getattr(self.folder, 'id', None) - return name_changed or folder_changed def _delete_thumbnails(self): @@ -401,10 +515,7 @@ def _delete_thumbnails(self): def update_location_on_storage(self, *args, **kwargs): old_location = self._current_file_location - # thumbnails might get physically deleted evenif the transaction fails - # though luck... they get re-created anyway... self._delete_thumbnails() - # check if file content has changed if self._old_sha1 != self.sha1: # actual file content needs to be replaced on storage prior to # filer file instance save @@ -423,20 +534,13 @@ def update_location_on_storage(self, *args, **kwargs): def copy_and_save(): saved_as = self._copy_file(new_location) assert saved_as == new_location, '%s %s' % (saved_as, new_location) + self._file_data_changed_hint = False self.file = saved_as super(File, self).save(*args, **kwargs) if self._force_commit: try: with transaction.atomic(savepoint=False): - # The manual transaction management here breaks the transaction management - # from django.contrib.admin.options.ModelAdmin.change_view - # This isn't a big problem because the only CRUD operation done afterwards - # is an insertion in django_admin_log. If this method rollbacks the transaction - # then we will have an entry in the admin log describing an action - # that didn't actually finish succesfull. - # This 'hack' can be removed once django adds support for on_commit and - # on_rollback hooks (see: https://code.djangoproject.com/ticket/14051) copy_and_save() except: # delete the file from new_location if the db update failed @@ -451,27 +555,12 @@ def copy_and_save(): copy_and_save() return new_location + # PBS-specific: soft delete / trash system def soft_delete(self, *args, **kwargs): """ - This method works as a default delete action of a filer file. - It will not actually delete the item from the database, instead it - will make it inaccessible for the default manager. - It just `fakes` a deletion by doing the following: - 1. sets a deletion time that will be used to distinguish - `alive` and `trashed` filer files. - 2. makes a copy of the actual file on storage and saves it to - a trash location on storage. Also tries to ignore if the - actual file is missing from storage. - 3. updates only the filer file path in the database (no model - save is done since it tries to bypass the logic defined - in the save method) - 4. deletes the file(and all it's thumbnails) from the - original location if no other filer files are referencing - it. - All the metadata of this filer file will remain intact. + Soft-delete: moves file to trash location on storage. """ - deletion_time = kwargs.pop('deletion_time', timezone.now()) - # move file to a `trash` location + deletion_time = kwargs.pop('deletion_time', django_timezone.now()) to_trash = filer.utils.generate_filename.get_trash_path(self) old_location, new_location = self.file.name, None try: @@ -482,18 +571,13 @@ def soft_delete(self, *args, **kwargs): logger.error('Error while trying to copy file: %s to %s.' % ( old_location, to_trash), e) else: - # if there are no more references to the file on storage delete it - # and all its thumbnails if not File.objects.exclude(pk=self.pk).filter( file=old_location, is_public=self.is_public).exists(): self.file.delete(False) finally: - # even if `copy_file` fails, user is trying to delete this file so - # in worse case scenario this file is not restorable new_location = new_location or to_trash File.objects.filter(pk=self.pk).update( deleted_at=deletion_time, file=new_location) - self.deleted_at = deletion_time self.file = new_location # Invalidate cache for the folder this file was in @@ -501,24 +585,20 @@ def soft_delete(self, *args, **kwargs): def hard_delete(self, *args, **kwargs): """ - This method deletes the filer file from the database and from storage. + Hard-delete: removes from DB and storage. """ - # delete the model before deleting the file from storage - super(File, self).delete(*args, **kwargs) - # delete the actual file from storage and all its thumbnails - # if there are no other filer files referencing it. + super().delete(*args, **kwargs) if not File.objects.filter(file=self.file.name, is_public=self.is_public).exists(): self.file.delete(False) def delete(self, *args, **kwargs): - super(File, self).delete_restorable(*args, **kwargs) + super().delete_restorable(*args, **kwargs) delete.alters_data = True def _set_valid_name_for_restore(self): """ - Generates the first available name so this file - can be restored in the folder. + Generates the first available name for restore. """ basename, extension = os.path.splitext(self.clean_actual_name) if self.folder: @@ -537,7 +617,6 @@ def _set_valid_name_for_restore(self): i = 1 while self.clean_actual_name in existing_file_names: filename = "%s_%s%s" % (basename, i, extension) - # set actual name if self.name in ('', None): self.original_filename = filename else: @@ -546,9 +625,7 @@ def _set_valid_name_for_restore(self): def restore(self): """ - Restores the file to its folder location. - If there's already an existing file with the same name, it will - generate a new filename. + Restores the file to its folder location. """ if self.folder_id: Folder = filer.models.foldermodels.Folder @@ -558,7 +635,6 @@ def restore(self): self.folder = Folder.trash.get(id=self.folder_id) self.folder.restore_path() - # at this point this file's folder should be `alive` self.folder = filer.models.Folder.objects.get(id=self.folder_id) old_location, new_location = self.file.name, None @@ -580,7 +656,6 @@ def restore(self): name=self.name, original_filename=self.original_filename) self.deleted_at = None self.file.name = new_location - # restore to user clipboard if self.owner_id and not self.folder_id: try: clipboard = filer.models.tools.get_user_clipboard(self.owner) @@ -590,21 +665,28 @@ def restore(self): # Invalidate cache for the folder this file was restored to invalidate_folder_listing_cache_for_file(self) + def __str__(self): + try: + name = self.pretty_logical_path + except: + name = self.actual_name + return name + @property def label(self): if self.name in ['', None]: text = self.original_filename or 'unnamed file' else: text = self.name - text = "%s" % (text,) - return text + return f"{text}" def _cmp(self, a, b): - return (a > b) - (a < b) + return (a > b) - (a < b) def __lt__(self, other): return self._cmp(self.label.lower(), other.label.lower()) < 0 + # PBS-specific: hash-based actual_name @property def actual_name(self): if not self.sha1: @@ -638,11 +720,7 @@ def upload_to_name(self): @property def clean_actual_name(self): - """The name displayed to the user. - Uses self.name if set, otherwise it falls back on self.original_filename. - - This property is used for enforcing unique filenames within the same folder. - """ + """The name displayed to the user.""" if self.name in ('', None): name = "%s" % (self.original_filename,) else: @@ -659,41 +737,90 @@ def pretty_logical_path(self): full_path = '{}{}{}'.format(directory_path, os.sep, self.actual_name) return full_path - def __str__(self): - try: - name = self.pretty_logical_path - except: - name = self.actual_name - return name + # Upstream: permission methods + def has_edit_permission(self, request): + return request.user.has_perm("filer.change_file") and self.has_generic_permission(request, 'edit') - def get_admin_url_path(self): + def has_read_permission(self, request): + return self.has_generic_permission(request, 'read') + + def has_add_children_permission(self, request): + return request.user.has_perm("filer.add_file") and self.has_generic_permission(request, 'add_children') + + def has_generic_permission(self, request, permission_type): + user = request.user + if not user.is_authenticated: + return False + elif user.is_superuser: + return True + elif user == self.owner: + return True + elif self.folder: + return self.folder.has_generic_permission(request, permission_type) + else: + return False + + def get_admin_url(self, action): return reverse( - 'admin:%s_%s_change' % (self._meta.app_label, - self._meta.model_name,), + 'admin:{}_{}_{}'.format( + self._meta.app_label, + self._meta.model_name, + action + ), args=(self.pk,) ) + def get_admin_url_path(self): + return self.get_admin_url("change") + + def get_admin_change_url(self): + return self.get_admin_url("change") + + def get_admin_expand_view_url(self): + return self.get_admin_url("expand") + def get_admin_delete_url(self): - return reverse( - 'admin:{0}_{1}_delete'.format(self._meta.app_label, self._meta.model_name,), - args=(self.pk,)) + return self.get_admin_url("delete") @property def url(self): """ to make the model behave like a file field """ + if self.is_in_trash(): + return '' try: r = self.file.url - except: + except: # noqa r = '' - return r + from filer.utils.cdn import get_cdn_url + return get_cdn_url(self, r) + + @property + def canonical_time(self): + if settings.USE_TZ: + return int((self.uploaded_at - datetime(1970, 1, 1, 1, tzinfo=timezone.utc)).total_seconds()) + else: + return int((self.uploaded_at - datetime(1970, 1, 1, 1)).total_seconds()) + + @property + def canonical_url(self): + url = '' + if self.file and self.is_public: + try: + url = reverse('canonical', kwargs={ + 'uploaded_at': self.canonical_time, + 'file_id': self.id + }) + except NoReverseMatch: + pass + return url @property def path(self): try: return self.file.path - except: + except: # noqa return "" @property @@ -709,10 +836,6 @@ def extension(self): @property def logical_folder(self): - """ - if this file is not in a specific folder return the Special "unfiled" - Folder object - """ if not self.folder: from filer.models.virtualitems import UnfiledImages return UnfiledImages() @@ -721,10 +844,6 @@ def logical_folder(self): @property def logical_path(self): - """ - Gets logical path of the folder in the tree structure. - Used to generate breadcrumbs - """ folder_path = [] if self.folder: folder_path.extend(self.folder.get_ancestors()) @@ -735,6 +854,7 @@ def logical_path(self): def duplicates(self): return list(File.objects.find_duplicates(self)) + # PBS-specific: site/core permission methods def is_core(self): if self.folder: return self.folder.is_core() @@ -752,21 +872,14 @@ def is_restricted_for_user(self, user): not can_restrict_on_site(user, self.folder.site))) def can_change_restricted(self, user): - """ - Checks if restriction operation is available for this file. - """ perm = 'filer.can_restrict_operations' if not user.has_perm(perm, self) and not user.has_perm(perm): return False if not self.folder: - # cannot restrict unfiled files return False - if not can_restrict_on_site(user, self.folder.site): return False - if self.folder.restricted == self.restricted == True: - # only parent can be set to True return False if self.folder.restricted == self.restricted == False: return True @@ -778,44 +891,26 @@ def can_change_restricted(self, user): def has_change_permission(self, user): if not self.folder: - # clipboard and unfiled files return True - if self.is_readonly_for_user(user): - # nobody can change core folder - # leaving these on True based on the fact that core folders are - # displayed as readonly fields return True - - # only admins can change site folders with no site owner if not self.folder.site and has_admin_role(user): return True - if self.folder.site: can_change_file = (user.has_perm('filer.change_file', self) or user.has_perm('filer.change_file')) return can_change_file and has_role_on_site(user, self.folder.site) - return False def has_delete_permission(self, user): if not self.folder: - # clipboard and unfiled files return True - # nobody can delete core files if self.is_readonly_for_user(user): return False - # only admins can delete site files with no site owner if not self.folder.site and has_admin_role(user): return True - if self.folder.site: can_delete_file = (user.has_perm('filer.delete_file', self) or user.has_perm('filer.delete_file')) return can_delete_file and has_role_on_site(user, self.folder.site) return False - - class Meta: - app_label = 'filer' - verbose_name = _('file') - verbose_name_plural = _('files') diff --git a/filer/models/foldermodels.py b/filer/models/foldermodels.py index 6cb245ffb..0e497062c 100644 --- a/filer/models/foldermodels.py +++ b/filer/models/foldermodels.py @@ -1,24 +1,104 @@ -#-*- coding: utf-8 -*- -from django.contrib.sites.models import Site +import itertools +import logging + +from django.conf import settings from django.contrib.auth import models as auth_models -from django.urls import reverse +from django.contrib.sites.models import Site from django.core.exceptions import ValidationError -from django.db import (models, IntegrityError, transaction) -from django.db.models import (query, Q, signals, DEFERRED) +from django.db import models, IntegrityError, transaction +from django.db.models import Q, query, signals, DEFERRED from django.dispatch import receiver +from django.urls import reverse +from django.utils.functional import cached_property +from django.utils.html import format_html, format_html_join +from django.utils.translation import gettext from django.utils.translation import gettext_lazy as _ -from urllib.parse import quote -from filer.utils.cms_roles import * -from filer.models import mixins -from filer import settings as filer_settings -from filer.utils.cache import invalidate_folder_listing_cache from django.utils import timezone +from urllib.parse import quote + import mptt -import itertools + +from .. import settings as filer_settings +from ..cache import get_folder_permission_cache, update_folder_permission_cache +from ..utils.cache import invalidate_folder_listing_cache +from ..utils.cms_roles import ( + get_sites_for_user, + get_sites_without_restriction_perm, + has_admin_role, + has_admin_role_on_site, + has_role_on_site, + can_restrict_on_site, +) +from . import mixins + import filer -class FoldersChainableQuerySetMixin(object): +logger = logging.getLogger(__name__) + + +class FolderPermissionManager(models.Manager): + """ + These methods are called by introspection from "has_generic_permission" on + the folder model. + """ + def get_read_id_list(self, user): + return self.__get_id_list(user, "can_read") + + def get_edit_id_list(self, user): + return self.__get_id_list(user, "can_edit") + + def get_add_children_id_list(self, user): + return self.__get_id_list(user, "can_add_children") + + def __get_id_list(self, user, attr): + if user.is_superuser or not filer_settings.FILER_ENABLE_PERMISSIONS: + return 'All' + cached_id_list = get_folder_permission_cache(user, attr) + if cached_id_list: + return cached_id_list + + allow_list = set() + deny_list = set() + group_ids = user.groups.all().values_list('id', flat=True) + q = Q(user=user) | Q(group__in=group_ids) | Q(everybody=True) + perms = self.filter(q) + + for perm in perms: + p = getattr(perm, attr) + + if p is None: + continue + + if not perm.folder: + assert perm.type == FolderPermission.ALL + + if p == FolderPermission.ALLOW: + allow_list.update(Folder.objects.all().values_list('id', flat=True)) + else: + deny_list.update(Folder.objects.all().values_list('id', flat=True)) + continue + + folder_id = perm.folder.id + + if p == FolderPermission.ALLOW: + allow_list.add(folder_id) + else: + deny_list.add(folder_id) + + if perm.type in [FolderPermission.ALL, FolderPermission.CHILDREN]: + if p == FolderPermission.ALLOW: + allow_list.update(perm.folder.get_descendants_ids()) + else: + deny_list.update(perm.folder.get_descendants_ids()) + + id_list = allow_list - deny_list + update_folder_permission_cache(user, attr, id_list) + return id_list + + +# PBS-specific: chainable queryset mixin with trash/restriction support +class FoldersChainableQuerySetMixin: def with_bad_metadata(self): return self.filter(has_all_mandatory_data=False) @@ -55,10 +135,8 @@ def restricted_descendants(self, user): descendant_filter |= q if not descendant_filter: return self.none() - # since this method is called to check permissions on descendants it - # should only query the alive assets restr_q = Q(Q(restricted=True) | Q( - Q(all_files__restricted=True) & \ + Q(all_files__restricted=True) & Q(all_files__deleted_at__isnull=True))) restr_q &= Q(site__in=sites) return self.model.objects.filter( @@ -77,8 +155,7 @@ def alive(self): return self.filter(deleted_at__isnull=True) -class FolderQueryset(query.QuerySet, - FoldersChainableQuerySetMixin): +class FolderQueryset(query.QuerySet, FoldersChainableQuerySetMixin): pass @@ -94,16 +171,11 @@ def __getattr__(self, name): class AliveFolderManager(FolderManager): - # this is required in order to make sure that other models that are - # related to filer folders will get an DoesNotExist exception if the - # folder is in trash - def get_queryset(self): return FolderQueryset(self.model, using=self._db).alive() class TrashFolderManager(FolderManager): - def get_queryset(self): return FolderQueryset(self.model, using=self._db).in_trash() @@ -119,12 +191,12 @@ class Folder(models.Model, mixins.IconsMixin): in this way. Make sure the linked models obey the AbstractFile interface (Duck Type). """ - file_type = 'Folder' is_root = False can_have_subfolders = True _icon = 'plainfolder' + # PBS-specific: folder types SITE_FOLDER = 0 CORE_FOLDER = 1 @@ -133,58 +205,113 @@ class Folder(models.Model, mixins.IconsMixin): CORE_FOLDER: 'Core Folder', } - parent = models.ForeignKey('self', verbose_name=('parent'), null=True, - blank=True, related_name='children', on_delete=models.CASCADE) - name = models.CharField(_('name'), max_length=255) - - owner = models.ForeignKey(auth_models.User, verbose_name=('owner'), - related_name='filer_owned_folders', - on_delete=models.SET_NULL, - null=True, blank=True) - - uploaded_at = models.DateTimeField(_('uploaded at'), auto_now_add=True) - - created_at = models.DateTimeField(_('created at'), auto_now_add=True) - modified_at = models.DateTimeField(_('modified at'), auto_now=True) - - folder_type = models.IntegerField(choices=list(FOLDER_TYPES.items()), - default=SITE_FOLDER) - - site = models.ForeignKey(Site, null=True, blank=True, - on_delete=models.SET_NULL, - help_text=_("Select the site which will use " - "this folder.")) + parent = models.ForeignKey( + 'self', + verbose_name=_('parent'), + null=True, + blank=True, + related_name='children', + on_delete=models.CASCADE, + ) + + name = models.CharField( + _('name'), + max_length=255, + ) + + owner = models.ForeignKey( + getattr(settings, 'AUTH_USER_MODEL', 'auth.User'), + verbose_name=_('owner'), + related_name='filer_owned_folders', + on_delete=models.SET_NULL, + null=True, + blank=True, + ) + + uploaded_at = models.DateTimeField( + _('uploaded at'), + auto_now_add=True, + ) + + created_at = models.DateTimeField( + _('created at'), + auto_now_add=True, + ) + + modified_at = models.DateTimeField( + _('modified at'), + auto_now=True, + ) + + # PBS-specific fields + folder_type = models.IntegerField( + choices=list(FOLDER_TYPES.items()), + default=SITE_FOLDER, + ) + + site = models.ForeignKey( + Site, + null=True, + blank=True, + on_delete=models.SET_NULL, + help_text=_("Select the site which will use this folder."), + ) restricted = models.BooleanField( _("Restrict Editors and Writers from being able to edit " - "or delete anything from this folder"), default=False, + "or delete anything from this folder"), + default=False, help_text=_('If this box is checked, ' 'Editors and Writers will still be able to ' 'view this folder assets, add them to a plugin or smart ' 'snippet but will not be able to delete or ' - 'modify the current version of the assets.')) + 'modify the current version of the assets.'), + ) - shared = models.ManyToManyField(Site, blank=True, + shared = models.ManyToManyField( + Site, + blank=True, related_name='shared', verbose_name=_("Share folder with sites"), help_text=_("All the sites which you share this folder with will " "be able to use this folder on their pages, with all of " "its assets. However, they will not be able to change, " - "delete or move it, not even add new assets.")) + "delete or move it, not even add new assets."), + ) + # PBS-specific: trash managers objects = AliveFolderManager() trash = TrashFolderManager() all_objects = FolderManager() + class Meta: + ordering = ('name',) + permissions = ( + ("can_use_directory_listing", "Can use directory listing"), + ("can_restrict_operations", "Can restrict files or folders"), + ) + app_label = 'filer' + verbose_name = _("Folder") + verbose_name_plural = _("Folders") + def __init__(self, *args, **kwargs): - super(Folder, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) if self.__dict__.get('name', DEFERRED) is not DEFERRED: self._old_name = self.name if self.__dict__.get('parent_id', DEFERRED) is not DEFERRED: self._old_parent_id = self.parent_id - def clean(self): + def __str__(self): + try: + name = self.pretty_logical_path + except: + name = self.name + return name + + def __repr__(self): + return f'<{self.__class__.__name__}(pk={self.pk}): {self.name}>' + def clean(self): if self.name == filer.models.clipboardmodels.Clipboard.folder_name: raise ValidationError( _('%s is reserved for internal use. ' @@ -197,8 +324,7 @@ def clean(self): parent=self.parent_id, name=self.name) if self.pk: - duplicate_folders_q = duplicate_folders_q.exclude( - pk=self.pk) + duplicate_folders_q = duplicate_folders_q.exclude(pk=self.pk) if duplicate_folders_q.exists(): raise ValidationError( @@ -207,24 +333,16 @@ def clean(self): if not self.parent: if (self.folder_type == Folder.SITE_FOLDER and - not self.site): + not self.site): raise ValidationError('Folder is a Site folder. ' 'Site is required.') if (self.folder_type == Folder.CORE_FOLDER and not self.parent and - self.site): + self.site): raise ValidationError('Folder is a Core folder. ' 'Site must be empty.') def set_metadata_from_parent(self): - """ - This will keep the rules: - * site for site folders can be changed only for the folders - with no parent(root folders) - * core folders should not have any site - * if parent restricted keep restriction from parent - """ if self.parent: - # site folders - make sure it keeps the site from parent self.site = self.parent.site self.folder_type = self.parent.folder_type if self.parent.restricted: @@ -239,7 +357,6 @@ def has_new_metadata_value(self): if not self.pk: return True metadata_fields = ['restricted', 'site_id', 'folder_type'] - # metadata should be preserved for trashed folder too old_metadata = self.__class__.all_objects.\ filter(pk=self.pk).values(*metadata_fields).get() for field in metadata_fields: @@ -252,10 +369,6 @@ def is_affecting_file_paths(self): self._old_parent_id != getattr(self, 'parent_id', None)) def update_descendants_metadata(self): - """ - Folder type and restriction should be preserved - to all descendants - """ descendants = None if self._update_descendants: descendants = self.get_descendants() @@ -283,7 +396,7 @@ def update_descendants_metadata(self): def save(self, *args, **kwargs): if not filer_settings.FOLDER_AFFECTS_URL: self.set_metadata_from_parent() - super(Folder, self).save(*args, **kwargs) + super().save(*args, **kwargs) self.update_descendants_metadata() invalidate_folder_listing_cache(self) return @@ -299,12 +412,11 @@ def delete_from_locations(locations, storages): try: with transaction.atomic(savepoint=False): self.set_metadata_from_parent() - super(Folder, self).save(*args, **kwargs) + super().save(*args, **kwargs) self.update_descendants_metadata() if self.is_affecting_file_paths(): desc_ids = list(self.get_descendants( include_self=True).values_list('id', flat=True)) - # update location only for alive files file_mgr = filer.models.filemodels.File.objects all_files = file_mgr.filter(folder__in=desc_ids) for f in all_files: @@ -321,16 +433,15 @@ def delete_from_locations(locations, storages): delete_from_locations(old_locations, storages) invalidate_folder_listing_cache(self) + # PBS-specific: trash methods def soft_delete(self): deletion_time = timezone.now() desc_ids = list(self.get_descendants( include_self=True).values_list('id', flat=True)) - # soft delete all alive files file_mgr = filer.models.filemodels.File.objects files_qs = file_mgr.filter(folder__in=desc_ids) for filer_file in files_qs: filer_file.soft_delete(deletion_time=deletion_time) - # soft delete all alive folders Folder.objects.filter( id__in=desc_ids).update(deleted_at=deletion_time) self.deleted_at = deletion_time @@ -338,19 +449,15 @@ def soft_delete(self): invalidate_folder_listing_cache(self) def hard_delete(self): - # This would happen automatically by ways of the delete - # cascade, but then the individual .delete() methods - # won't be called and the files won't be deleted - # from the filesystem. desc_ids = list(self.get_descendants( include_self=True).values_list('id', flat=True)) file_mgr = filer.models.filemodels.File.all_objects for file_obj in file_mgr.filter(folder__in=desc_ids): file_obj.hard_delete() - super(Folder, self).delete() + super().delete() def delete(self, *args, **kwargs): - super(Folder, self).delete_restorable(*args, **kwargs) + super().delete_restorable(*args, **kwargs) delete.alters_data = True def _generate_valid_name_for_restore(self): @@ -363,12 +470,6 @@ def _generate_valid_name_for_restore(self): return name def restore_path(self): - """ - This method makes this folder path to be a valid destination for - for restoring files/sub-folders. - * it restores all the trashed folders in this folder's path. - * files from the folders in path will not be restored. - """ trashed_ancestors = self.get_ancestors(include_self=True).filter( deleted_at__isnull=False) first_node_trashed = trashed_ancestors[:1] @@ -381,11 +482,7 @@ def restore_path(self): trashed_ancestors.update(deleted_at=None) def restore(self): - """ - Restores all files and subfolders contained in this folder. - """ self.restore_path() - # add self since it was restored with restore_path method desc_ids = [self.id] descendants = self.get_descendants(include_self=True).filter( deleted_at__isnull=False) @@ -394,7 +491,6 @@ def restore(self): Folder.trash.filter(id=descendant.id).update( deleted_at=None, name=new_name) desc_ids.append(descendant.id) - # restore self and descendants files file_mgr = filer.models.filemodels.File.trash files_qs = file_mgr.filter(folder__in=desc_ids) for filer_file in files_qs: @@ -441,9 +537,6 @@ def files(self): return filer.models.File.objects.filter(folder=self) def entries_with_names(self, names): - """Returns an iterator yielding the files and folders that are direct - children of this folder and have their names in the given list of names. - """ q = Q(name__in=names) q |= Q(original_filename__in=names) & (Q(name__isnull=True) | Q(name='')) files_with_names = filer.models.File.objects.filter( @@ -453,21 +546,22 @@ def entries_with_names(self, names): return list(itertools.chain(files_with_names, folders_with_names)) def pretty_path_entries(self): - """Returns a list of all the descendant's `alive` entries logical path""" subdirs = self.get_descendants(include_self=True).filter( deleted_at__isnull=True) subdir_files = filer.models.File.objects.filter(folder__in=subdirs) file_paths = [x.pretty_logical_path for x in subdir_files] dir_paths = [x.pretty_logical_path for x in subdirs] - paths = file_paths + dir_paths - return paths + return file_paths + dir_paths + + def get_descendants_ids(self): + desc = [] + for child in self.children.all(): + desc.append(child.id) + desc.extend(child.get_descendants_ids()) + return desc @property def logical_path(self): - """ - Gets logical path of the folder in the tree structure. - Used to generate breadcrumbs - """ folder_path = [] try: if self.parent: @@ -486,22 +580,58 @@ def pretty_logical_path(self): def quoted_logical_path(self): return quote(self.pretty_logical_path) + # Upstream permission methods + def has_edit_permission(self, request): + return request.user.has_perm("filer.change_folder") and self.has_generic_permission(request, 'edit') + + def has_read_permission(self, request): + return self.has_generic_permission(request, 'read') + + def has_add_children_permission(self, request): + return request.user.has_perm("filer.change_folder") and self.has_generic_permission(request, 'add_children') + + def has_generic_permission(self, request, permission_type): + user = request.user + if not user.is_authenticated: + return False + elif user.is_superuser: + return True + elif user == self.owner: + return True + else: + if not hasattr(self, "permission_cache") or\ + permission_type not in self.permission_cache or \ + request.user.pk != self.permission_cache['user'].pk: + if not hasattr(self, "permission_cache") or request.user.pk != self.permission_cache['user'].pk: + self.permission_cache = { + 'user': request.user, + } + func = getattr(FolderPermission.objects, + "get_%s_id_list" % permission_type) + permission = func(user) + if permission == "All": + self.permission_cache[permission_type] = True + self.permission_cache['read'] = True + self.permission_cache['edit'] = True + self.permission_cache['add_children'] = True + else: + self.permission_cache[permission_type] = self.id in permission + return self.permission_cache[permission_type] + + def get_admin_change_url(self): + return reverse('admin:filer_folder_change', args=(self.id,)) + def get_admin_url_path(self): return reverse('admin:filer_folder_change', args=(self.id,)) def get_admin_directory_listing_url_path(self): return reverse('admin:filer-directory_listing', args=(self.id,)) - def __str__(self): - try: - name = self.pretty_logical_path - except: - name = self.name - return name - - @property - def actual_name(self): - return self.name + def get_admin_delete_url(self): + return reverse( + f'admin:{self._meta.app_label}_{self._meta.model_name}_delete', + args=(self.pk,) + ) def contains_folder(self, folder_name): try: @@ -510,12 +640,17 @@ def contains_folder(self, folder_name): except Folder.DoesNotExist: return False + @property + def actual_name(self): + return self.name + @property def get_folder_type_display(self): if self.shared.exists(): return 'Shared by site' return Folder.FOLDER_TYPES[self.folder_type] + # PBS-specific: site/core permission methods def is_core(self): return self.folder_type == Folder.CORE_FOLDER @@ -531,9 +666,6 @@ def is_restricted_for_user(self, user): not can_restrict_on_site(user, self.site))) def can_change_restricted(self, user): - """ - Checks if restriction operation is available for this folder. - """ perm = 'filer.can_restrict_operations' if (not (user.has_perm(perm, self) or user.has_perm(perm)) or not can_restrict_on_site(user, self.site)): @@ -541,7 +673,6 @@ def can_change_restricted(self, user): if not self.parent: return True if self.parent.restricted == self.restricted == True: - # only parent can be set to True return False if self.parent.restricted == self.restricted == False: return True @@ -552,33 +683,25 @@ def can_change_restricted(self, user): return True def has_add_permission(self, user): - # nobody can add subfolders in core folders if (self.is_readonly_for_user(user) or self.is_restricted_for_user(user)): return False - # only site admins can add subfolders in site folders with no site if not self.site and has_admin_role(user): return True - # regular users need to have permissions to add folders and - # need to have a role over the site owner of the folder if not self.site or not has_role_on_site(user, self.site): return False perm = 'filer.add_folder' return user.has_perm(perm, self.site) or user.has_perm(perm) def has_change_permission(self, user): - # nobody can change core folder if (self.is_readonly_for_user(user) or self.is_restricted_for_user(user)): return False - # only admins can change site folders with no site owner if not self.site and has_admin_role(user): return True - if not self.site: return False if not self.parent: - # only site admins can change root site folders return has_admin_role_on_site(user, self.site) perm = 'filer.change_folder' return ((user.has_perm(perm, self.site) or user.has_perm(perm)) and @@ -588,29 +711,16 @@ def has_delete_permission(self, user): if (self.is_readonly_for_user(user) or self.is_restricted_for_user(user)): return False - - # only super users can delete site folders with no site owner if not self.site and user.is_superuser: return True - if not self.site: return False if not self.parent: - # only site admins can delete root site folders return has_admin_role_on_site(user, self.site) perm = 'filer.delete_folder' return ((user.has_perm(perm, self.site) or user.has_perm(perm)) and has_role_on_site(user, self.site)) - class Meta: - ordering = ('name',) - permissions = (("can_use_directory_listing", - "Can use directory listing"), - ("can_restrict_operations", - "Can restrict files or folders"),) - app_label = 'filer' - verbose_name = _("Folder") - verbose_name_plural = _("Folders") # MPTT registration try: @@ -633,3 +743,150 @@ def update_shared_sites_for_descendants(instance, **kwargs): descendants = instance.get_descendants() for desc_folder in descendants: desc_folder.shared.set(sites) + + +# Upstream: FolderPermission model +class FolderPermission(models.Model): + ALL = 0 + THIS = 1 + CHILDREN = 2 + + ALLOW = 1 + DENY = 0 + + TYPES = [ + (ALL, _("all items")), + (THIS, _("this item only")), + (CHILDREN, _("this item and all children")), + ] + + PERMISIONS = [ + (None, _("inherit")), + (ALLOW, _("allow")), + (DENY, _("deny")), + ] + + folder = models.ForeignKey( + Folder, + verbose_name=("folder"), + null=True, + blank=True, + on_delete=models.CASCADE, + ) + + type = models.SmallIntegerField( + _("type"), + choices=TYPES, + default=ALL, + ) + + user = models.ForeignKey( + getattr(settings, 'AUTH_USER_MODEL', 'auth.User'), + related_name="filer_folder_permissions", + on_delete=models.SET_NULL, + verbose_name=_("user"), + blank=True, + null=True, + ) + + group = models.ForeignKey( + auth_models.Group, + related_name="filer_folder_permissions", + verbose_name=_("group"), + blank=True, + null=True, + on_delete=models.CASCADE, + ) + + everybody = models.BooleanField( + _("everybody"), + default=False, + ) + + can_read = models.SmallIntegerField( + _("can read"), + choices=PERMISIONS, + blank=True, + null=True, + default=None, + ) + + can_edit = models.SmallIntegerField( + _("can edit"), + choices=PERMISIONS, + blank=True, + null=True, + default=None, + ) + + can_add_children = models.SmallIntegerField( + _("can add children"), + choices=PERMISIONS, + blank=True, + null=True, + default=None, + ) + + class Meta: + verbose_name = _('folder permission') + verbose_name_plural = _('folder permissions') + app_label = 'filer' + + objects = FolderPermissionManager() + + def __str__(self): + return self.pretty_logical_path + + def __repr__(self): + return f'<{self.__class__.__name__}(pk={self.pk}): folder="{self.pretty_logical_path}">' + + def clean(self): + if self.type == self.ALL and self.folder: + raise ValidationError(_('Folder cannot be selected with type "all items".')) + if self.type != self.ALL and not self.folder: + raise ValidationError(_('Folder has to be selected when type is not "all items".')) + if self.everybody and (self.user or self.group): + raise ValidationError(_('User or group cannot be selected together with "everybody".')) + if not self.user and not self.group and not self.everybody: + raise ValidationError(_('At least one of user, group, or "everybody" has to be selected.')) + + @cached_property + def pretty_logical_path(self): + if self.folder: + return self.folder.pretty_logical_path + return gettext("All Folders") + + pretty_logical_path.short_description = _("Logical Path") + + @cached_property + def who(self): + parts = [] + if self.user: + parts.append(_("User: {user}").format(user=self.user)) + if self.group: + parts.append(_("Group: {group}").format(group=self.group)) + if self.everybody: + parts.append(_("Everybody")) + if parts: + return format_html_join("; ", '{}', ((p,) for p in parts)) + return '–' + + who.short_description = _("Who") + + @cached_property + def what(self): + mapping = { + 'can_edit': _("Edit"), + 'can_read': _("Read"), + 'can_add_children': _("Add children"), + } + perms = [] + for key, text in mapping.items(): + perm = getattr(self, key) + if perm == self.ALLOW: + perms.append(text) + elif perm == self.DENY: + perms.append('\u0336'.join(text) + '\u0336') + return format_html_join(", ", '{}', ((p,) for p in perms)) + + what.short_description = _("What") diff --git a/filer/models/imagemodels.py b/filer/models/imagemodels.py index 825b7f2ad..e385cf595 100644 --- a/filer/models/imagemodels.py +++ b/filer/models/imagemodels.py @@ -1,59 +1,34 @@ -#-*- coding: utf-8 -*- import logging - -try: - from PIL import Image as PILImage -except ImportError: - try: - import Image as PILImage - except ImportError: - raise ImportError("The Python Imaging Library was not found.") from datetime import datetime -from django.db import models -from django.utils.translation import gettext_lazy as _ -from django.utils import timezone + from django.conf import settings from django.core.exceptions import ValidationError -from filer import settings as filer_settings -from filer.models.filemodels import File -from filer.utils.pil_exif import get_exif_for_file -import os +from django.db import models +from django.utils.timezone import get_current_timezone, make_aware, now +from django.utils.translation import gettext_lazy as _ + +from .abstract import BaseImage -logger = logging.getLogger("filer") +logger = logging.getLogger("filer") -class Image(File): - SIDEBAR_IMAGE_WIDTH = 210 - DEFAULT_THUMBNAILS = { - 'admin_clipboard_icon': {'size': (32, 32), 'crop': True, - 'upscale': True}, - 'admin_sidebar_preview': {'size': (SIDEBAR_IMAGE_WIDTH, 10000)}, - 'admin_directory_listing_icon': {'size': (48, 48), - 'crop': True, 'upscale': True}, - 'admin_tiny_icon': {'size': (32, 32), 'crop': True, 'upscale': True}, - } - file_type = 'Image' - _icon = "image" - _filename_extensions = ['.jpg', '.jpeg', '.png', '.gif', '.ico', '.svg', '.webp'] - _height = models.IntegerField(null=True, blank=True) - _width = models.IntegerField(null=True, blank=True) +# This is the standard Image model which can be swapped for a custom model using FILER_IMAGE_MODEL setting +class Image(BaseImage): + date_taken = models.DateTimeField( + _("date taken"), + null=True, + blank=True, + editable=False, + ) - date_taken = models.DateTimeField(_('date taken'), null=True, blank=True, - editable=False) + author = models.CharField( + _("author"), + max_length=255, + null=True, + blank=True, + ) - default_alt_text = models.TextField( - _('default alt text'), blank=True, null=True, - help_text=_('Describes the essence of the image for users who have ' - 'images turned off in their browser, or are visually ' - 'impaired and using a screen reader; and it is used to ' - 'identify images to search engines.')) - default_caption = models.TextField( - _('default caption'), blank=True, null=True, - help_text=_('Caption text is displayed directly below an image ' - 'plugin to add context; there is no character limit;' - 'for images fewer than 200 pixels ' - 'wide, the caption text is only displayed on hover.')) default_credit = models.CharField( _('default credit text'), max_length=255, blank=True, null=True, help_text=_('Credit text gives credit to the owner or licensor of ' @@ -63,23 +38,19 @@ class Image(File): 'of an image in the photo gallery plugin; there is a ' '30-character limit, including spaces.')) - author = models.CharField(_('author'), max_length=255, null=True, blank=True) + must_always_publish_author_credit = models.BooleanField( + _("must always publish author credit"), + default=False, + ) - must_always_publish_author_credit = models.BooleanField(_('must always publish author credit'), default=False) - must_always_publish_copyright = models.BooleanField(_('must always publish copyright'), default=False) + must_always_publish_copyright = models.BooleanField( + _('must always publish copyright'), + default=False, + ) - subject_location = models.CharField(_('subject location'), max_length=64, null=True, blank=True, - default=None) - - @classmethod - def matches_file_type(cls, iname, ifile, request): - # This was originally in admin/clipboardadmin.py it was inside of a try - # except, I have moved it here outside of a try except because I can't - # figure out just what kind of exception this could generate... all it was - # doing for me was obscuring errors... - # --Dave Butler - iext = os.path.splitext(iname)[1].lower() - return iext in Image._filename_extensions + class Meta(BaseImage.Meta): + swappable = 'FILER_IMAGE_MODEL' + default_manager_name = 'objects' def clean(self): if self.default_credit: @@ -93,115 +64,27 @@ def clean(self): raise ValidationError( "Ensure default credit text has at most 30 characters (" "%s characters found)." % len(self.default_credit)) - super(Image, self).clean() + super().clean() def save(self, *args, **kwargs): - self.full_clean() if self.date_taken is None: try: exif_date = self.exif.get('DateTimeOriginal', None) if exif_date is not None: - d, t = str.split(exif_date.values) + d, t = exif_date.split(" ") year, month, day = d.split(':') hour, minute, second = t.split(':') if getattr(settings, "USE_TZ", False): - tz = timezone.get_current_timezone() - self.date_taken = timezone.make_aware(datetime( + tz = get_current_timezone() + self.date_taken = make_aware(datetime( int(year), int(month), int(day), int(hour), int(minute), int(second)), tz) else: self.date_taken = datetime( int(year), int(month), int(day), int(hour), int(minute), int(second)) - except: + except Exception: pass if self.date_taken is None: - self.date_taken = timezone.now() - self.has_all_mandatory_data = self._check_validity() - try: - # do this more efficient somehow? - self.file.seek(0) - self._width, self._height = PILImage.open(self.file).size - except Exception: - # probably the image is missing. nevermind. - pass - super(Image, self).save(*args, **kwargs) - - def _check_validity(self): - if not self.name: - return False - return True - - def sidebar_image_ratio(self): - if self.width: - return float(self.width) / float(self.SIDEBAR_IMAGE_WIDTH) - else: - return 1.0 - - def _get_exif(self): - if hasattr(self, '_exif_cache'): - return self._exif_cache - else: - if self.file: - self._exif_cache = get_exif_for_file(self.file.path) - else: - self._exif_cache = {} - return self._exif_cache - exif = property(_get_exif) - - @property - def label(self): - if self.name in ['', None]: - return self.original_filename or 'unnamed file' - else: - return self.name - - @property - def width(self): - return self._width or 0 - - @property - def height(self): - return self._height or 0 - - def _generate_thumbnails(self, required_thumbnails): - _thumbnails = {} - if self.is_in_trash(): - return _thumbnails - for name, opts in list(required_thumbnails.items()): - try: - opts.update({'subject_location': self.subject_location}) - thumb = self.file.get_thumbnail(opts) - _thumbnails[name] = thumb.url - except Exception as e: - # catch exception and manage it. We can re-raise it for debugging - # purposes and/or just logging it, provided user configured - # proper logging configuration - if filer_settings.FILER_ENABLE_LOGGING: - logger.error('Error while generating thumbnail: %s',e) - if filer_settings.FILER_DEBUG: - raise e - return _thumbnails - - @property - def icons(self): - required_thumbnails = dict( - (size, {'size': (int(size), int(size)), - 'crop': True, - 'upscale': True, - 'subject_location': self.subject_location}) - for size in filer_settings.FILER_ADMIN_ICON_SIZES) - return self._generate_thumbnails(required_thumbnails) - - @property - def thumbnails(self): - return self._generate_thumbnails(Image.DEFAULT_THUMBNAILS) - - @property - def easy_thumbnails_thumbnailer(self): - return self.file - - class Meta: - app_label = 'filer' - verbose_name = _('image') - verbose_name_plural = _('images') + self.date_taken = now() + super().save(*args, **kwargs) diff --git a/filer/models/mixins.py b/filer/models/mixins.py index 783d1123b..1d4cb2ce7 100644 --- a/filer/models/mixins.py +++ b/filer/models/mixins.py @@ -1,10 +1,13 @@ -#-*- coding: utf-8 -*- -from filer.settings import FILER_ADMIN_ICON_SIZES, FILER_STATICMEDIA_PREFIX +import warnings + from django.db import models +from django.templatetags.static import static from django.utils.translation import gettext_lazy as _ +from ..settings import FILER_ADMIN_ICON_SIZES + -class IconsMixin(object): +class IconsMixin: """ Can be used on any model that has a _icon attribute. will return a dict containing urls for icons of different sizes with that name. @@ -14,11 +17,15 @@ def icons(self): r = {} if getattr(self, '_icon', False): for size in FILER_ADMIN_ICON_SIZES: - r[size] = "%sicons/%s_%sx%s.png" % ( - FILER_STATICMEDIA_PREFIX, self._icon, size, size) + try: + r[size] = static("filer/icons/{}_{}x{}.png".format( + self._icon, size, size)) + except ValueError: + pass return r +# PBS-specific: trashable decorator def trashable(cls): deleted_at = models.DateTimeField( diff --git a/filer/models/thumbnailoptionmodels.py b/filer/models/thumbnailoptionmodels.py new file mode 100644 index 000000000..883df7989 --- /dev/null +++ b/filer/models/thumbnailoptionmodels.py @@ -0,0 +1,61 @@ +from django.db import models +from django.utils.translation import gettext_lazy as _ + + +class ThumbnailOption(models.Model): + """ + This class defines the option use to create the thumbnail. + """ + name = models.CharField( + _("name"), + max_length=100, + ) + + width = models.IntegerField( + _("width"), + help_text=_("width in pixel."), + ) + + height = models.IntegerField( + _("height"), + help_text=_("height in pixel."), + ) + + crop = models.BooleanField( + _("crop"), + default=True, + ) + + upscale = models.BooleanField( + _("upscale"), + default=True, + ) + + class Meta: + app_label = 'filer' + ordering = ('width', 'height') + verbose_name = _("thumbnail option") + verbose_name_plural = _("thumbnail options") + + def __str__(self): + return f'{self.name} -- {self.width} x {self.height}' + + @property + def as_dict(self): + """ + This property returns a dictionary suitable for Thumbnailer.get_thumbnail() + + Sample code: + # thumboption_obj is a ThumbnailOption instance + # filerimage is a Image instance + option_dict = thumboption_obj.as_dict + thumbnailer = filerimage.easy_thumbnails_thumbnailer + thumb_image = thumbnailer.get_thumbnail(option_dict) + """ + return { + 'size': (self.width, self.height), + 'width': self.width, + 'height': self.height, + 'crop': self.crop, + 'upscale': self.upscale, + } diff --git a/filer/models/virtualitems.py b/filer/models/virtualitems.py index 89c9cae51..44fccc9bb 100644 --- a/filer/models/virtualitems.py +++ b/filer/models/virtualitems.py @@ -1,10 +1,11 @@ -#-*- coding: utf-8 -*- from django.urls import reverse from django.utils.translation import gettext_lazy as _ -from filer.models import mixins -from filer.models.filemodels import File -from filer.models.foldermodels import Folder -from filer.utils.cms_roles import * + +from .. import settings as filer_settings +from ..utils.cms_roles import has_admin_role +from . import mixins +from .filemodels import File +from .foldermodels import Folder class DummyFolder(mixins.IconsMixin): @@ -14,6 +15,8 @@ class DummyFolder(mixins.IconsMixin): is_smart_folder = True can_have_subfolders = False parent = None + pk = None + id = None _icon = "plainfolder" @property @@ -43,10 +46,16 @@ def logical_path(self): class UnfiledImages(DummyFolder): + """PBS name for unsorted/unfiled images.""" name = _("unfiled files") is_root = True + is_unsorted_uploads = True _icon = "unfiled_folder" + def __init__(self, user=None): + super().__init__() + self.user = user + def _files(self): return File.objects.filter( folder__isnull=True, clipboarditem__isnull=True) @@ -56,6 +65,10 @@ def get_admin_directory_listing_url_path(self): return reverse('admin:filer-directory_listing-unfiled_images') +# Upstream compat alias +UnsortedImages = UnfiledImages + + class ImagesWithMissingData(DummyFolder): name = _("files with missing metadata") is_root = True @@ -93,12 +106,12 @@ def contains_folder(self, folder_name): return False def entries_with_names(self, names): - # children of te root folder can only be folders, so we don't have to look for files return self.children.filter(name__in=names) def get_admin_directory_listing_url_path(self): return reverse('admin:filer-directory_listing-root') + # PBS-specific permission methods def is_restricted_for_user(self, user): return not has_admin_role(user) diff --git a/filer/server/backends/base.py b/filer/server/backends/base.py index 6a843ea0e..5e811ee4e 100644 --- a/filer/server/backends/base.py +++ b/filer/server/backends/base.py @@ -1,18 +1,14 @@ -#-*- coding: utf-8 -*- -from django.utils.encoding import smart_str -import mimetypes import os +from django.utils.encoding import smart_str + -class ServerBase(object): +class ServerBase: """ Server classes define a way to serve a Django File object. Warning: this API is EXPERIMENTAL and may change at any time. """ - def get_mimetype(self, path): - return mimetypes.guess_type(path)[0] or 'application/octet-stream' - def default_headers(self, **kwargs): self.save_as_header(**kwargs) self.size_header(**kwargs) @@ -21,24 +17,29 @@ def save_as_header(self, response, **kwargs): """ * if save_as is False the header will not be added * if save_as is a filename, it will be used in the header - * if save_as is None the filename will be determined from the file path + * if save_as is True or None the filename will be determined from the + file path """ save_as = kwargs.get('save_as', None) - if save_as == False: + if save_as is False: return file_obj = kwargs.get('file_obj', None) - filename = None - if save_as: - filename = save_as - else: + if save_as is True or save_as is None: filename = os.path.basename(file_obj.path) - response['Content-Disposition'] = smart_str('attachment; filename=%s' % filename) + else: + filename = save_as + response['Content-Disposition'] = smart_str( + 'attachment; filename=%s' % filename) def size_header(self, response, **kwargs): size = kwargs.get('size', None) - #file = kwargs.get('file', None) + # file = kwargs.get('file', None) if size: response['Content-Length'] = size - # we should not do this, because it accesses the file. and that might be an expensive operation. + # we should not do this, because it accesses the file. and that might + # be an expensive operation. # elif file and file.size is not None: # response['Content-Length'] = file.size + + def serve(self, request, filer_file, **kwargs): + raise NotImplementedError(".serve() must be overridden") diff --git a/filer/server/backends/default.py b/filer/server/backends/default.py index 172ac1871..736061a75 100644 --- a/filer/server/backends/default.py +++ b/filer/server/backends/default.py @@ -1,10 +1,12 @@ -#-*- coding: utf-8 -*- +import mimetypes import os import stat + from django.http import Http404, HttpResponse, HttpResponseNotModified from django.utils.http import http_date from django.views.static import was_modified_since -from filer.server.backends.base import ServerBase + +from .base import ServerBase class DefaultServer(ServerBase): @@ -14,19 +16,22 @@ class DefaultServer(ServerBase): This will only work for files that can be accessed in the local filesystem. """ - def serve(self, request, file_obj, **kwargs): - fullpath = file_obj.path + def serve(self, request, filer_file, **kwargs): + fullpath = filer_file.path # the following code is largely borrowed from `django.views.static.serve` # and django-filetransfers: filetransfers.backends.default if not os.path.exists(fullpath): raise Http404('"%s" does not exist' % fullpath) # Respect the If-Modified-Since header. statobj = os.stat(fullpath) - mimetype = self.get_mimetype(fullpath) + mime_type = getattr(filer_file, 'mime_type', None) + if mime_type is None: + mime_type = mimetypes.guess_type(fullpath)[0] or 'application/octet-stream' + response_params = {'content_type': mime_type} if not was_modified_since(request.META.get('HTTP_IF_MODIFIED_SINCE'), statobj[stat.ST_MTIME]): - return HttpResponseNotModified(content_type=mimetype) - response = HttpResponse(open(fullpath, 'rb').read(), content_type=mimetype) + return HttpResponseNotModified(**response_params) + response = HttpResponse(open(fullpath, 'rb').read(), **response_params) response["Last-Modified"] = http_date(statobj[stat.ST_MTIME]) - self.default_headers(request=request, response=response, file_obj=file_obj, **kwargs) + self.default_headers(request=request, response=response, file_obj=filer_file, **kwargs) return response diff --git a/filer/server/backends/nginx.py b/filer/server/backends/nginx.py index d0b6e9adf..73e222b20 100644 --- a/filer/server/backends/nginx.py +++ b/filer/server/backends/nginx.py @@ -1,6 +1,8 @@ -#-*- coding: utf-8 -*- +import mimetypes + from django.http import HttpResponse -from filer.server.backends.base import ServerBase + +from .base import ServerBase class NginxXAccelRedirectServer(ServerBase): @@ -18,11 +20,13 @@ def __init__(self, location, nginx_location): def get_nginx_location(self, path): return path.replace(self.location, self.nginx_location) - def serve(self, request, file_obj, **kwargs): - # we should not use get_mimetype() here, because it tries to access the file in the filesystem. - #response = HttpResponse(content_type=self.get_mimetype(file.path)) + def serve(self, request, filer_file, **kwargs): response = HttpResponse() - nginx_path = self.get_nginx_location(file_obj.path) + mime_type = getattr(filer_file, 'mime_type', None) + if mime_type is None: + mime_type = mimetypes.guess_type(filer_file.path)[0] or 'application/octet-stream' + response['Content-Type'] = mime_type + nginx_path = self.get_nginx_location(filer_file.path) response['X-Accel-Redirect'] = nginx_path - self.default_headers(request=request, response=response, file_obj=file_obj, **kwargs) + self.default_headers(request=request, response=response, file_obj=filer_file, **kwargs) return response diff --git a/filer/server/backends/xsendfile.py b/filer/server/backends/xsendfile.py index cd3316f64..27d73654f 100644 --- a/filer/server/backends/xsendfile.py +++ b/filer/server/backends/xsendfile.py @@ -1,17 +1,20 @@ -#-*- coding: utf-8 -*- +import mimetypes + from django.http import HttpResponse -from filer.server.backends.base import ServerBase + +from .base import ServerBase class ApacheXSendfileServer(ServerBase): - def serve(self, request, file_obj, **kwargs): + def serve(self, request, filer_file, **kwargs): response = HttpResponse() - response['X-Sendfile'] = file_obj.path + response['X-Sendfile'] = filer_file.path # This is needed for lighttpd, hopefully this will # not be needed after this is fixed: # http://redmine.lighttpd.net/issues/2076 - response['Content-Type'] = self.get_mimetype(file_obj.path) + response['Content-Type'] = getattr(filer_file, 'mime_type', None) or \ + mimetypes.guess_type(filer_file.path)[0] or 'application/octet-stream' - self.default_headers(request=request, response=response, file_obj=file_obj, **kwargs) + self.default_headers(request=request, response=response, file_obj=filer_file, **kwargs) return response diff --git a/filer/server/main_server_urls.py b/filer/server/main_server_urls.py index bb555c1a3..232c1fe2a 100644 --- a/filer/server/main_server_urls.py +++ b/filer/server/main_server_urls.py @@ -1,8 +1,8 @@ -#-*- coding: utf-8 -*- from django.urls import re_path from . import views + urlpatterns = [ - re_path(r'^(?P.*)$', views.serve_protected_file) + re_path(r'^(?P.*)$', views.serve_protected_file), ] diff --git a/filer/server/thumbnails_server_urls.py b/filer/server/thumbnails_server_urls.py index 072f51cac..7d2cb0395 100644 --- a/filer/server/thumbnails_server_urls.py +++ b/filer/server/thumbnails_server_urls.py @@ -1,8 +1,8 @@ -#-*- coding: utf-8 -*- from django.urls import re_path from . import views + urlpatterns = [ - re_path(r'^(?P.*)$', views.serve_protected_thumbnail) + re_path(r'^(?P.*)$', views.serve_protected_thumbnail), ] diff --git a/filer/server/urls.py b/filer/server/urls.py index 14a1a0f4d..8f758dcc9 100644 --- a/filer/server/urls.py +++ b/filer/server/urls.py @@ -1,8 +1,12 @@ -#-*- coding: utf-8 -*- -from django.urls import re_path, include -from filer import settings as filer_settings +from django.urls import include, re_path -urlpatterns = [ - re_path(r'^' + filer_settings.FILER_PRIVATEMEDIA_STORAGE.base_url.lstrip('/'), include('filer.server.main_server_urls')), - re_path(r'^' + filer_settings.FILER_PRIVATEMEDIA_THUMBNAIL_STORAGE.base_url.lstrip('/'), include('filer.server.thumbnails_server_urls')) -] +from .. import settings as filer_settings + + +if not filer_settings.FILER_0_8_COMPATIBILITY_MODE: + urlpatterns = [ + re_path(r'^' + filer_settings.FILER_PRIVATEMEDIA_STORAGE.base_url.lstrip('/'), include('filer.server.main_server_urls')), + re_path(r'^' + filer_settings.FILER_PRIVATEMEDIA_THUMBNAIL_STORAGE.base_url.lstrip('/'), include('filer.server.thumbnails_server_urls')), + ] +else: + urlpatterns = [] diff --git a/filer/server/views.py b/filer/server/views.py index ea26c9def..90b394abb 100644 --- a/filer/server/views.py +++ b/filer/server/views.py @@ -1,14 +1,20 @@ -#-*- coding: utf-8 -*- +from django.conf import settings +from django.core.exceptions import PermissionDenied from django.http import Http404 +from django.views.decorators.cache import never_cache + from easy_thumbnails.files import ThumbnailFile -from filer import settings as filer_settings -from filer.models import File -from filer.utils.filer_easy_thumbnails import thumbnail_to_original_filename + +from .. import settings as filer_settings +from ..models import File +from ..utils.filer_easy_thumbnails import thumbnail_to_original_filename + server = filer_settings.FILER_PRIVATEMEDIA_SERVER thumbnail_server = filer_settings.FILER_PRIVATEMEDIA_THUMBNAIL_SERVER +@never_cache def serve_protected_file(request, path): """ Serve protected files to authenticated users with read permissions. @@ -17,9 +23,15 @@ def serve_protected_file(request, path): file_obj = File.objects.get(file=path, is_public=False) except File.DoesNotExist: raise Http404('File not found') - return server.serve(request, file_obj=file_obj.file, save_as=False) + if not file_obj.has_read_permission(request): + if settings.DEBUG: + raise PermissionDenied + else: + raise Http404('File not found') + return server.serve(request, file_obj, save_as=False) +@never_cache def serve_protected_thumbnail(request, path): """ Serve protected thumbnails to authenticated users. @@ -32,8 +44,14 @@ def serve_protected_thumbnail(request, path): file_obj = File.objects.get(file=source_path, is_public=False) except File.DoesNotExist: raise Http404('File not found') + if not file_obj.has_read_permission(request): + if settings.DEBUG: + raise PermissionDenied + else: + raise Http404('File not found') try: thumbnail = ThumbnailFile(name=path, storage=file_obj.file.thumbnail_storage) + thumbnail.mime_type = file_obj.mime_type return thumbnail_server.serve(request, thumbnail, save_as=False) except Exception: raise Http404('File not found') diff --git a/filer/settings.py b/filer/settings.py index 689ff2b60..7d2c96520 100644 --- a/filer/settings.py +++ b/filer/settings.py @@ -1,44 +1,73 @@ -#-*- coding: utf-8 -*- +import logging import os from django.conf import settings -from django.utils.module_loading import import_string +from django.utils.module_loading import import_string as get_storage_class +from django.utils.translation import gettext_lazy as _ -from filer.utils.loader import load_object -from filer.utils.recursive_dictionary import RecursiveDictionaryWithExcludes +from .utils.loader import load_object +from .utils.recursive_dictionary import RecursiveDictionaryWithExcludes -FILER_DEBUG = getattr(settings, 'FILER_DEBUG', False) # When True makes +logger = logging.getLogger(__name__) + +# FILER_IMAGE_MODEL setting is used to swap Image model. +# If such global setting does not exist, it will be created at this point (with default model name). +# This is needed especially when using this setting in migrations. +if not hasattr(settings, 'FILER_IMAGE_MODEL'): + setattr(settings, 'FILER_IMAGE_MODEL', 'filer.Image') +FILER_IMAGE_MODEL = settings.FILER_IMAGE_MODEL + +FILER_DEBUG = getattr(settings, 'FILER_DEBUG', False) # When True makes FILER_SUBJECT_LOCATION_IMAGE_DEBUG = getattr(settings, 'FILER_SUBJECT_LOCATION_IMAGE_DEBUG', False) +FILER_WHITESPACE_COLOR = getattr(settings, 'FILER_WHITESPACE_COLOR', '#FFFFFF') FILER_0_8_COMPATIBILITY_MODE = getattr(settings, 'FILER_0_8_COMPATIBILITY_MODE', False) FILER_ENABLE_LOGGING = getattr(settings, 'FILER_ENABLE_LOGGING', False) if FILER_ENABLE_LOGGING: - FILER_ENABLE_LOGGING = (FILER_ENABLE_LOGGING and (getattr(settings, 'LOGGING') and - ('' in settings.LOGGING['loggers'] or - 'filer' in settings.LOGGING['loggers']))) + FILER_ENABLE_LOGGING = ( + FILER_ENABLE_LOGGING and (getattr(settings, 'LOGGING') + and ('' in settings.LOGGING['loggers'] + or 'filer' in settings.LOGGING['loggers']))) +# PBS-specific: nohash rootfolders FILER_NOHASH_ROOTFOLDERS = getattr(settings, 'FILER_NOHASH_ROOTFOLDERS', []) + FILER_ENABLE_PERMISSIONS = getattr(settings, 'FILER_ENABLE_PERMISSIONS', False) +FILER_ALLOW_REGULAR_USERS_TO_ADD_ROOT_FOLDERS = getattr(settings, 'FILER_ALLOW_REGULAR_USERS_TO_ADD_ROOT_FOLDERS', False) FILER_IS_PUBLIC_DEFAULT = getattr(settings, 'FILER_IS_PUBLIC_DEFAULT', True) -FILER_PAGINATE_BY = getattr(settings, 'FILER_PAGINATE_BY', 20) +FILER_PAGINATE_BY = getattr(settings, 'FILER_PAGINATE_BY', 100) + +if hasattr(settings, "FILER_ADMIN_ICON_SIZES"): + logger.warning("FILER_ADMIN_ICON_SIZES is deprecated and will be removed in the future.") + +_ICON_SIZES = getattr(settings, 'FILER_ADMIN_ICON_SIZES', ('16', '32', '48', '64')) +# Reliably sort by integer value, but keep icon size as string. +FILER_ADMIN_ICON_SIZES = [str(i) for i in sorted([int(s) for s in _ICON_SIZES])] + +# PBS legacy compat FILER_STATICMEDIA_PREFIX = getattr(settings, 'FILER_STATICMEDIA_PREFIX', None) if not FILER_STATICMEDIA_PREFIX: FILER_STATICMEDIA_PREFIX = (getattr(settings, 'STATIC_URL', None) or settings.MEDIA_URL) + 'filer/' -FILER_ADMIN_ICON_SIZES = getattr(settings, "FILER_ADMIN_ICON_SIZES", ('32',)) +# Currently, these two icon sizes are hard-coded into the admin and admin templates +FILER_TABLE_ICON_SIZE = getattr(settings, "FILER_TABLE_ICON_SIZE", 40) +FILER_THUMBNAIL_ICON_SIZE = getattr(settings, "FILER_THUMBNAIL_ICON_SIZE", 120) +DEFERRED_THUMBNAIL_SIZES = ( + FILER_TABLE_ICON_SIZE, + 2 * FILER_TABLE_ICON_SIZE, + FILER_THUMBNAIL_ICON_SIZE, + 2 * FILER_THUMBNAIL_ICON_SIZE, +) + # This is an ordered iterable that describes a list of # classes that I should check for when adding files -FILER_FILE_MODELS = getattr(settings, 'FILER_FILE_MODELS', - ( - 'filer.models.imagemodels.Image', - 'filer.models.archivemodels.Archive', - 'filer.models.filemodels.File', - ) -) +FILER_FILE_MODELS = getattr( + settings, 'FILER_FILE_MODELS', + (FILER_IMAGE_MODEL, 'filer.Archive', 'filer.File')) _FALLBACK_STORAGE_BACKEND = 'django.core.files.storage.FileSystemStorage' @@ -46,7 +75,7 @@ DEFAULT_FILE_STORAGE = settings.STORAGES['default'].get('BACKEND', _FALLBACK_STORAGE_BACKEND) else: DEFAULT_FILE_STORAGE = getattr(settings, 'DEFAULT_FILE_STORAGE', _FALLBACK_STORAGE_BACKEND) - # Django 5.1+ removed the legacy DEFAULT_FILE_STORAGE setting and relies + # PBS: Django 5.1+ removed the legacy DEFAULT_FILE_STORAGE setting and relies # exclusively on STORAGES['default']. If the host project (e.g. bento) # defines STORAGES without a 'default' key, Django's internal # default_storage lookup will raise InvalidStorageError. Inject the @@ -61,23 +90,23 @@ 'main': { 'ENGINE': None, 'OPTIONS': {}, - }, + }, 'thumbnails': { 'ENGINE': None, 'OPTIONS': {}, - } + } }, 'private': { 'main': { 'ENGINE': None, 'OPTIONS': {}, - }, + }, 'thumbnails': { 'ENGINE': None, 'OPTIONS': {}, - }, }, - } + }, +} DEFAULT_FILER_STORAGES = { @@ -180,47 +209,47 @@ FILER_STORAGES.rec_update(user_filer_storages) + def update_storage_settings(user_settings, defaults, s, t): if not user_settings[s][t]['ENGINE']: user_settings[s][t]['ENGINE'] = defaults[s][t]['ENGINE'] user_settings[s][t]['OPTIONS'] = defaults[s][t]['OPTIONS'] if t == 'main': - if not 'UPLOAD_TO' in user_settings[s][t]: + if 'UPLOAD_TO' not in user_settings[s][t]: user_settings[s][t]['UPLOAD_TO'] = defaults[s][t]['UPLOAD_TO'] - if not 'UPLOAD_TO_PREFIX' in user_settings[s][t]: + if 'UPLOAD_TO_PREFIX' not in user_settings[s][t]: user_settings[s][t]['UPLOAD_TO_PREFIX'] = defaults[s][t]['UPLOAD_TO_PREFIX'] if t == 'thumbnails': - if not 'THUMBNAIL_OPTIONS' in user_settings[s][t]: + if 'THUMBNAIL_OPTIONS' not in user_settings[s][t]: user_settings[s][t]['THUMBNAIL_OPTIONS'] = defaults[s][t]['THUMBNAIL_OPTIONS'] return user_settings -for s in ['public', 'private']: - for t in ['main', 'thumbnails']: - update_storage_settings(FILER_STORAGES, DEFAULT_FILER_STORAGES, s, t) + +update_storage_settings(FILER_STORAGES, DEFAULT_FILER_STORAGES, 'public', 'main') +update_storage_settings(FILER_STORAGES, DEFAULT_FILER_STORAGES, 'public', 'thumbnails') +update_storage_settings(FILER_STORAGES, DEFAULT_FILER_STORAGES, 'private', 'main') +update_storage_settings(FILER_STORAGES, DEFAULT_FILER_STORAGES, 'private', 'thumbnails') FILER_SERVERS = RecursiveDictionaryWithExcludes(MINIMAL_FILER_SERVERS, rec_excluded_keys=('OPTIONS',)) FILER_SERVERS.rec_update(getattr(settings, 'FILER_SERVERS', {})) + def update_server_settings(settings, defaults, s, t): if not settings[s][t]['ENGINE']: settings[s][t]['ENGINE'] = defaults[s][t]['ENGINE'] settings[s][t]['OPTIONS'] = defaults[s][t]['OPTIONS'] return settings -for t in ['main', 'thumbnails']: - update_server_settings(FILER_SERVERS, DEFAULT_FILER_SERVERS, 'private', t) -# Storage class loader (Django 5.1+) -def get_storage_class(path): - return import_string(path) +update_server_settings(FILER_SERVERS, DEFAULT_FILER_SERVERS, 'private', 'main') +update_server_settings(FILER_SERVERS, DEFAULT_FILER_SERVERS, 'private', 'thumbnails') + # Public media (media accessible without any permission checks) FILER_PUBLICMEDIA_STORAGE = get_storage_class(FILER_STORAGES['public']['main']['ENGINE'])(**FILER_STORAGES['public']['main']['OPTIONS']) FILER_PUBLICMEDIA_UPLOAD_TO = load_object(FILER_STORAGES['public']['main']['UPLOAD_TO']) if 'UPLOAD_TO_PREFIX' in FILER_STORAGES['public']['main']: - FILER_PUBLICMEDIA_UPLOAD_TO = load_object('filer.utils.generate_filename.prefixed_factory')( - FILER_PUBLICMEDIA_UPLOAD_TO, FILER_STORAGES['public']['main']['UPLOAD_TO_PREFIX'] - ) + FILER_PUBLICMEDIA_UPLOAD_TO = load_object('filer.utils.generate_filename.prefixed_factory')(FILER_PUBLICMEDIA_UPLOAD_TO, FILER_STORAGES['public']['main']['UPLOAD_TO_PREFIX']) FILER_PUBLICMEDIA_THUMBNAIL_STORAGE = get_storage_class(FILER_STORAGES['public']['thumbnails']['ENGINE'])(**FILER_STORAGES['public']['thumbnails']['OPTIONS']) FILER_PUBLICMEDIA_THUMBNAIL_OPTIONS = FILER_STORAGES['public']['thumbnails']['THUMBNAIL_OPTIONS'] @@ -229,55 +258,107 @@ def get_storage_class(path): FILER_PRIVATEMEDIA_STORAGE = get_storage_class(FILER_STORAGES['private']['main']['ENGINE'])(**FILER_STORAGES['private']['main']['OPTIONS']) FILER_PRIVATEMEDIA_UPLOAD_TO = load_object(FILER_STORAGES['private']['main']['UPLOAD_TO']) if 'UPLOAD_TO_PREFIX' in FILER_STORAGES['private']['main']: - FILER_PRIVATEMEDIA_UPLOAD_TO = load_object('filer.utils.generate_filename.prefixed_factory')( - FILER_PRIVATEMEDIA_UPLOAD_TO, FILER_STORAGES['private']['main']['UPLOAD_TO_PREFIX'] - ) + FILER_PRIVATEMEDIA_UPLOAD_TO = load_object('filer.utils.generate_filename.prefixed_factory')(FILER_PRIVATEMEDIA_UPLOAD_TO, FILER_STORAGES['private']['main']['UPLOAD_TO_PREFIX']) FILER_PRIVATEMEDIA_THUMBNAIL_STORAGE = get_storage_class(FILER_STORAGES['private']['thumbnails']['ENGINE'])(**FILER_STORAGES['private']['thumbnails']['OPTIONS']) FILER_PRIVATEMEDIA_THUMBNAIL_OPTIONS = FILER_STORAGES['private']['thumbnails']['THUMBNAIL_OPTIONS'] FILER_PRIVATEMEDIA_SERVER = load_object(FILER_SERVERS['private']['main']['ENGINE'])(**FILER_SERVERS['private']['main']['OPTIONS']) FILER_PRIVATEMEDIA_THUMBNAIL_SERVER = load_object(FILER_SERVERS['private']['thumbnails']['ENGINE'])(**FILER_SERVERS['private']['thumbnails']['OPTIONS']) +# By default limit number of simultaneous uploads if we are using SQLite +if settings.DATABASES['default']['ENGINE'].endswith('sqlite3'): + _uploader_connections = 1 +else: + _uploader_connections = 3 +FILER_UPLOADER_CONNECTIONS = getattr( + settings, 'FILER_UPLOADER_CONNECTIONS', _uploader_connections) +FILER_UPLOADER_MAX_FILES = getattr( + settings, 'FILER_UPLOADER_MAX_FILES', 100) +FILER_UPLOADER_MAX_FILE_SIZE = getattr( + settings, 'FILER_UPLOADER_MAX_FILE_SIZE', None) + + +FILER_DUMP_PAYLOAD = getattr(settings, 'FILER_DUMP_PAYLOAD', False) + +FILER_CANONICAL_URL = getattr(settings, 'FILER_CANONICAL_URL', 'canonical/') + +TABLE_LIST_TYPE = 'tb' +THUMBNAIL_LIST_TYPE = 'th' +FILER_FOLDER_ADMIN_LIST_TYPE_CHOICES = ( + TABLE_LIST_TYPE, + THUMBNAIL_LIST_TYPE, +) +FILER_FOLDER_ADMIN_DEFAULT_LIST_TYPE = getattr(settings, 'FILER_FOLDER_ADMIN_DEFAULT_LIST_TYPE', TABLE_LIST_TYPE) +if FILER_FOLDER_ADMIN_DEFAULT_LIST_TYPE not in FILER_FOLDER_ADMIN_LIST_TYPE_CHOICES: + FILER_FOLDER_ADMIN_DEFAULT_LIST_TYPE = TABLE_LIST_TYPE + +FILER_FOLDER_ADMIN_LIST_TYPE_SWITCHER_SETTINGS = { + TABLE_LIST_TYPE: { + 'icon': 'th-list', + 'tooltip_text': _('Show table view'), + 'template': 'admin/filer/folder/directory_table_list.html', + }, + THUMBNAIL_LIST_TYPE: { + 'icon': 'th-large', + 'tooltip_text': _('Show thumbnail view'), + 'template': 'admin/filer/folder/directory_thumbnail_list.html', + }, +} + +IMAGE_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.gif', '.webp'] +IMAGE_MIME_TYPES = ['gif', 'jpeg', 'png', 'x-png', 'svg+xml', 'webp'] + +FILE_VALIDATORS = { + "text/html": ["filer.validation.deny_html"], + "image/svg+xml": ["filer.validation.validate_svg"], + "application/octet-stream": ["filer.validation.deny"], +} + +remove_mime_types = getattr(settings, "FILER_REMOVE_FILE_VALIDATORS", []) +for mime_type in remove_mime_types: # pragma: no cover + if mime_type in FILE_VALIDATORS: + del FILE_VALIDATORS[mime_type] + +for mime_type, validators in getattr(settings, "FILER_ADD_FILE_VALIDATORS", {}).items(): # pragma: no cover + if mime_type in FILE_VALIDATORS: + FILE_VALIDATORS[mime_type] += list(validators) + else: + FILE_VALIDATORS[mime_type] = list(validators) + +FILER_MIME_TYPE_WHITELIST = getattr(settings, "FILER_MIME_TYPE_WHITELIST", []) + + +# Determine if django CMS is installed and if it comes with its own iconset +ICON_CSS_LIB = ("filer/css/admin_filer.fa.icons.css",) +if "cms" in settings.INSTALLED_APPS: # pragma: no cover + try: + from cms import __version__ + from cms.utils.urlutils import static_with_version + + if __version__ >= "4": + ICON_CSS_LIB = ( + static_with_version("cms/css/cms.admin.css"), + "filer/css/admin_filer.cms.icons.css", + ) + except (ModuleNotFoundError, ImportError): + pass + +# SVG are their own thumbnails if their size is below this limit +FILER_MAX_SVG_THUMBNAIL_SIZE = getattr(settings, "FILER_MAX_SVG_THUMBNAIL_SIZE", 1024 * 1024) # 1MB default + +# --- PBS-specific settings --- + +# PBS: folder structure affects the URL of files on storage FOLDER_AFFECTS_URL = getattr(settings, 'FILER_FOLDER_AFFECTS_URL', False) + +# PBS: CDN settings CDN_DOMAIN = getattr(settings, 'FILER_CDN_DOMAIN', None) CDN_INVALIDATION_TIME = getattr(settings, 'FILER_CDN_INVALIDATION_TIME', 0) + +# PBS: Trash settings FILER_TRASH_PREFIX = getattr(settings, 'FILER_TRASH_PREFIX', '_trash') -# defaults to one day -FILER_TRASH_CLEAN_INTERVAL = getattr(settings, 'FILER_TRASH_CLEAN_INTERVAL', 60 * 60 * 24) - - -# Roles Manager that controles how the filer checks permissions -# Must be a callable or a the absolute path of the callable as a string. -# Calling this manager should return an object that must define these functions: -# -# def is_site_admin(user): -# """ -# :param user: django.contrib.auth.models.User to check permissions for -# :return: True if the user is an admin on any site, False otherwise -# """ -# pass - -# def has_perm_on_site(user, site_id, perm): -# """ -# :param user: django.contrib.auth.models.User to check permissions for -# :param site_id: id of django.contrib.sites.models.Site -# on which the user must have the permission -# :param perm: full name (.) of the permission, ex: filer.add_file -# :return: True if the user has the permission on that site, False otherwise -# """ -# pass - -# def get_accessible_sites(user): -# """ -# :return: list of django.contrib.sites.models.Site IDs on which the user has access. -# """ -# pass - -# def get_administered_sites(user): -# """ -# :return: list of django.contrib.sites.models.Site objects on which the user has admin access. -# """ -# pass +FILER_TRASH_CLEAN_INTERVAL = getattr(settings, 'FILER_TRASH_CLEAN_INTERVAL', 60 * 60 * 24) # defaults to one day +# PBS: Roles Manager that controls how the filer checks permissions _default_roles_manager = 'cmsroles.siteadmin.FilerRolesManager' try: import cmsroles # noqa: F401 diff --git a/filer/static/filer/css/admin_filer.cms.icons.css b/filer/static/filer/css/admin_filer.cms.icons.css new file mode 100644 index 000000000..836885eba --- /dev/null +++ b/filer/static/filer/css/admin_filer.cms.icons.css @@ -0,0 +1 @@ +@font-face{font-family:"django-filer-iconfont";src:url("../fonts/django-filer-iconfont.eot?v=3.2.0");src:url("../fonts/django-filer-iconfont.eot?v=3.2.0#iefix") format("eot"),url("../fonts/django-filer-iconfont.woff2?v=3.2.0") format("woff2"),url("../fonts/django-filer-iconfont.woff?v=3.2.0") format("woff"),url("../fonts/django-filer-iconfont.ttf?v=3.2.0") format("truetype"),url("../fonts/django-filer-iconfont.svg?v=3.2.0#django-filer-iconfont") format("svg");font-weight:normal;font-style:normal}.filer-icon{display:inline-block;font-family:django-filer-iconfont;font-size:inherit;text-rendering:auto;line-height:1;transform:translate(0, 0);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.filer-icon-arrow-down:before{content:"\E001"}.filer-icon-caret-down:before{content:"\E002"}.filer-icon-chevron-right:before{content:"\E003"}.filer-icon-download:before{content:"\E004"}.filer-icon-expand:before{content:"\E005"}.filer-icon-link:before{content:"\E006"}.filer-icon-move-to-folder:before{content:"\E007"}.filer-icon-picture:before{content:"\E008"}.filer-icon-remove-selection:before{content:"\E009"}.filer-icon-select:before{content:"\E00A"}.filer-icon-th-large:before{content:"\E00B"}.filer-icon-th-list:before{content:"\E00C"}.filer-icon-upload:before{content:"\E00D"} \ No newline at end of file diff --git a/filer/static/filer/css/admin_filer.css b/filer/static/filer/css/admin_filer.css new file mode 100644 index 000000000..c510053e9 --- /dev/null +++ b/filer/static/filer/css/admin_filer.css @@ -0,0 +1,3 @@ +/*! + * @copyright: https://github.com/divio/django-filer + */html,body{min-width:320px;height:100% !important}.text-left{text-align:left}.text-right{text-align:right}.clearfix:after{content:"";display:table;clear:both}.related-widget-wrapper{float:none !important}.related-lookup.hidden{display:none !important}.tiny{font-size:12px !important;color:var(--dca-gray-light, var(--body-quiet-color, #999)) !important}.nav-pages{position:relative;font-size:12px;color:var(--dca-gray-light, var(--body-quiet-color, #999)) !important;padding-left:10px;padding-right:20px;padding-top:15px;padding-bottom:15px;box-sizing:border-box;background:var(--dca-white, var(--body-bg, #fff))}.nav-pages span{font-size:12px;color:var(--dca-gray-light, var(--body-quiet-color, #999)) !important}.nav-pages .actions{float:right}#id_upload_button:before{display:none}#content #content-main{margin-top:0}.filebrowser.cms-admin-sideframe #container .breadcrumbs+#content,.filebrowser.cms-admin-sideframe #container .breadcrumbs+.messagelist+#content{margin-left:0 !important;margin-right:0 !important}.filebrowser.cms-admin-sideframe #container .breadcrumbs{left:0 !important;padding-left:20px !important}.filebrowser #container{min-width:auto}.filebrowser #container #content{padding:0;box-shadow:0 0 5px 0 rgba(0,0,0,.2)}.filebrowser #container .breadcrumbs+#content,.filebrowser #container .breadcrumbs+.messagelist+#content{margin-left:3% !important}.filebrowser h1.folder_header{position:relative;top:6px}.filebrowser h2{display:none}.filebrowser #content-main{background-color:var(--dca-white, var(--body-bg, #fff))}.filer-widget{width:100%}.field-file,.field-sha1{word-wrap:break-word;word-break:break-all}.well.img-preview{display:none;margin-top:0}.img-wrapper{width:180px;height:180px}.file-duplicates{clear:both;padding:20px 0 0}form .cancel-link{height:auto !important;line-height:inherit !important;padding:10px 15px}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.hidden{display:none !important}.filer-info-bar{min-height:15px;margin:0 0 2px !important;padding:15px 20px;box-shadow:0 0 10px -2px rgba(0,0,0,.2);background-color:var(--dca-white, var(--body-bg, #fff))}.navigator .actions span.all,.navigator .actions span.clear,.navigator .actions span.question{font-size:13px;margin:0 .5em;display:none}#all-items-action-toggle{display:none !important}.image-info{position:relative;float:right;box-sizing:border-box;width:28%;margin-top:0;border:0;border-radius:3px;background:var(--dca-white, var(--body-bg, #fff));box-shadow:0 0 5px 0 rgba(0,0,0,.2)}.image-info .image-details,.image-info .actions-list{margin:0;padding:0}.image-info .image-details.image-details,.image-info .actions-list.image-details{margin:10px 0;padding:0 10px}.image-info .image-details li,.image-info .actions-list li{list-style-type:none}.image-info .image-details a,.image-info .actions-list a{cursor:pointer}.image-info.image-info-detail:before,.image-info.image-info-detail:after{content:" ";display:table}.image-info.image-info-detail:after{clear:both}.image-info.image-info-detail{position:static;float:none;width:100%;margin-bottom:20px;padding:25px;border-radius:0}.image-info.image-info-detail+#content-main .object-tools{margin-top:20px;margin-right:20px;background-color:rgba(0,0,0,0)}.image-info.image-info-detail+#content-main .object-tools:before{display:none}.image-info.image-info-detail .image-details-left{float:left}.image-info.image-info-detail .image-details-right{float:left;margin-left:50px}.image-info.image-info-detail .image-details,.image-info.image-info-detail .actions-list{margin-top:0;border:0 !important}.image-info.image-info-detail .image-details.image-details,.image-info.image-info-detail .actions-list.image-details{margin-top:20px;margin-bottom:15px;padding:0}.image-info.image-info-detail .image-details dt,.image-info.image-info-detail .actions-list dt{float:left;color:var(--dca-gray-light, var(--body-quiet-color, #999));font-size:13px;line-height:1rem !important;font-weight:normal;margin-top:0}.image-info.image-info-detail .image-details dd,.image-info.image-info-detail .actions-list dd{color:var(--dca-gray, var(--body-quiet-color, #666));font-size:13px;line-height:16px !important;padding-left:80px;margin-bottom:5px}.image-info.image-info-detail .image-details .text,.image-info.image-info-detail .actions-list .text{font-size:13px;margin-right:15px}.image-info.image-info-detail .image-details .text strong,.image-info.image-info-detail .actions-list .text strong{font-size:13px}.image-info.image-info-detail .image-details li,.image-info.image-info-detail .actions-list li{color:var(--dca-gray, var(--body-quiet-color, #666));font-size:13px !important;font-weight:normal !important;padding:1px 0 !important;border:0 !important}.image-info.image-info-detail .image-details a,.image-info.image-info-detail .actions-list a{padding:0}.image-info.image-info-detail .image-info-title{overflow:hidden;color:var(--dca-gray, var(--body-quiet-color, #666));white-space:nowrap;text-overflow:ellipsis;padding:0 0 5px}.image-info.image-info-detail .image-info-title .icon{float:left;margin-right:5px}.image-info.image-info-detail .image-preview-container{text-align:left;margin:20px 0 0;padding:0}.image-info.image-info-detail .image-preview-container>img{margin-bottom:15px}.image-info.image-info-detail .actions-list .icon{font-size:16px}.image-info.image-info-detail .actions-list .icon:last-child{float:none}@media screen and (max-width: 720px){.image-info{float:none;width:100%}.image-info.image-info-detail .image-details-left,.image-info.image-info-detail .image-details-right{float:none;margin-left:0}}.image-info-close{position:absolute;top:-10px;right:-7px;font-size:20px;cursor:pointer}.image-info-title{padding:5px 10px;border-bottom:solid 1px var(--dca-gray-lighter, var(--border-color, #ddd))}.image-info-title a{margin-left:5px}.image-preview-container{text-align:center;margin:10px 0;padding:0 10px}.image-preview-container .image-preview{display:inline-block;position:relative;margin-bottom:15px;outline:1px solid var(--dca-gray-lightest, var(--darkened-bg, #f2f2f2));background-image:url("data:image/gif;base64,R0lGODlhCAAIAKECAOPj4/z8/P///////yH5BAEKAAIALAAAAAAIAAgAAAINhBEZh8q6DoTPSWvoKQA7")}.image-preview-container .image-preview img{display:block}.image-preview-container .image-preview-field{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden}.image-preview-container .image-preview-circle{position:relative;z-index:1;width:26px;height:26px;border:solid 2px red;margin:-13px;border-radius:30px;cursor:move;background:hsla(0,0%,100%,.5)}.image-preview-container audio,.image-preview-container video{margin-bottom:15px}.image-preview-container audio:focus,.image-preview-container video:focus{outline:none}.button-group .button{margin-right:10px;padding:10px 15px}.actions-list-dropdown a{display:block;padding:5px 10px}.actions-list-dropdown .caret-down{display:inline-block}.actions-list-dropdown .caret-right{display:none}.actions-list-dropdown.js-collapsed{border-bottom:solid 1px var(--dca-gray-lighter, var(--border-color, #ddd))}.actions-list-dropdown.js-collapsed .caret-down{display:none}.actions-list-dropdown.js-collapsed .caret-right{display:inline-block}.actions-list{border-top:solid 1px var(--dca-gray-lighter, var(--border-color, #ddd))}.actions-list:last-child{border-top:none}.actions-list:last-child a{border-bottom:none}.actions-list a{display:block;font-size:20px;padding:5px 10px;border-bottom:solid 1px var(--dca-gray-lighter, var(--border-color, #ddd))}.actions-list .icon:first-child{width:20px}.actions-list .icon:last-child{float:right;margin-top:3px}.actions-separated-list{display:inline-block;margin:0;padding-left:0}@media screen and (max-width: 720px){.actions-separated-list{float:left;margin-left:0}}.actions-separated-list li{display:inline-block;line-height:34px;vertical-align:middle;padding:0 10px;list-style:none}@media screen and (max-width: 720px){.actions-separated-list li:first-child{padding-left:0}}.actions-separated-list li span{vertical-align:middle}.actions-separated-list li a{color:var(--dca-gray, var(--body-quiet-color, #666))}.actions-separated-list span:before{font-size:18px}.search-is-focused .filter-files-container{position:static}.search-is-focused .filter-filers-container-inner{position:absolute;top:0;left:0;right:0}@media screen and (max-width: 720px){.search-is-focused .filter-filers-container-inner{position:static}}.search-is-focused .breadcrumbs-container{position:relative}.search-is-focused.breadcrumb-min-width .filter-filers-container-inner{position:static}.filter-files-container:before,.filter-files-container:after{content:" ";display:table}.filter-files-container:after{clear:both}.filter-files-container{display:table-cell;vertical-align:middle;position:relative;width:245px;margin:0;padding:0;background:none;box-shadow:none;z-index:1000}@media screen and (max-width: 720px){.filter-files-container{display:block;width:auto;margin-right:0;margin-top:10px}.filter-files-container .filter-files-button{float:none}}.filter-files-container .filer-dropdown-container{position:absolute;top:0;right:0}.filter-files-container .filer-dropdown-container>a,.filter-files-container .filer-dropdown-container>a:visited,.filter-files-container .filer-dropdown-container>a:link:visited,.filter-files-container .filer-dropdown-container>a:link{display:inline-block;line-height:34px;text-align:center;width:34px;height:34px;padding:0}.filter-files-container .filer-dropdown-container.open+.filer-dropdown-menu-checkboxes{display:block;width:calc(100% - 30px)}.filter-files-container .filer-dropdown-container.open+.filer-dropdown-menu-checkboxes li{margin:0;padding:0;list-style-type:none}.filter-files-container .filter-search-wrapper{position:relative;float:left;text-align:right;width:calc(100% - 43px);margin-right:5px}@media screen and (max-width: 720px){.filter-files-container .filter-search-wrapper{float:left}}.filter-files-container .filter-search-wrapper .filer-dropdown-container span{line-height:34px !important;height:34px !important}.filter-files-container .filter-files-button{float:right;text-align:center;white-space:nowrap;height:35px;margin:0;padding:8px !important}.filter-files-container .filter-files-button .icon{position:relative;left:2px;font-size:16px !important;vertical-align:top}.filter-files-container .filter-files-field{color:var(--dca-gray-darkest, var(--body-fg, #333));font-size:12px !important;line-height:35px;font-weight:normal;box-sizing:border-box;min-width:200px !important;height:35px;margin:0;padding:0 35px 0 10px !important;outline:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;transition:max-width 200ms}.filter-files-container .filter-files-field::-ms-clear{display:none}.filter-files-container .filer-dropdown-menu{margin-top:0 !important;margin-right:-1px !important}.filter-files-cancel{margin:5px 20px}body.dz-drag-hover .drag-hover-border{display:none !important}body.dz-drag-hover .navigator-table tbody td,body.dz-drag-hover .navigator-table tbody .unfiled td{background-color:var(--dca-gray-lightest, var(--darkened-bg, #f2f2f2)) !important}body.reset-hover td{background-color:var(--dca-white, var(--body-bg, #fff)) !important}.drag-hover-border{position:fixed;border-top:solid 2px var(--dca-primary, var(--primary, #0bf));border-bottom:solid 2px var(--dca-primary, var(--primary, #0bf));pointer-events:none;z-index:100;display:none}.thumbnail-drag-hover-border{border:solid 2px var(--dca-primary, var(--primary, #0bf))}.filebrowser .navigator-list,.filebrowser .navigator-table{width:100%;margin:0;border-top:solid 1px var(--dca-gray-lighter, var(--border-color, #ddd)) !important;border-collapse:collapse !important}.filebrowser .navigator-list .navigator-header,.filebrowser .navigator-list thead th,.filebrowser .navigator-list tbody td,.filebrowser .navigator-table .navigator-header,.filebrowser .navigator-table thead th,.filebrowser .navigator-table tbody td{text-align:left;font-weight:normal;vertical-align:middle;padding:5px !important;border-left:0 !important;border-bottom:1px solid var(--dca-gray-lighter, var(--border-color, #ddd));border-top:1px solid rgba(0,0,0,0);background:none !important}.filebrowser .navigator-list tbody tr.selected .action-button span,.filebrowser .navigator-table tbody tr.selected .action-button span{color:var(--dca-gray-darkest, var(--body-fg, #333)) !important}.filebrowser .navigator-list .navigator-body,.filebrowser .navigator-list .unfiled td,.filebrowser .navigator-table .navigator-body,.filebrowser .navigator-table .unfiled td{padding:12px 5px !important;background-color:var(--dca-gray-super-lightest, var(--darkened-bg, #f7f7f7)) !important}.filebrowser .navigator-list .navigator-body a,.filebrowser .navigator-list .navigator-body a:hover,.filebrowser .navigator-list .unfiled td a,.filebrowser .navigator-list .unfiled td a:hover,.filebrowser .navigator-table .navigator-body a,.filebrowser .navigator-table .navigator-body a:hover,.filebrowser .navigator-table .unfiled td a,.filebrowser .navigator-table .unfiled td a:hover{color:var(--dca-gray, var(--body-quiet-color, #666)) !important}.filebrowser .navigator-list .column-checkbox,.filebrowser .navigator-table .column-checkbox{text-align:center;width:20px;padding-left:20px !important}.filebrowser .navigator-list .column-checkbox input,.filebrowser .navigator-table .column-checkbox input{vertical-align:middle;margin:0}.filebrowser .navigator-list .column-name a,.filebrowser .navigator-table .column-name a{color:var(--dca-primary, var(--primary, #0bf))}.filebrowser .navigator-list .column-icon,.filebrowser .navigator-table .column-icon{width:50px;padding-top:0 !important;padding-bottom:0 !important}.filebrowser .navigator-list .column-action,.filebrowser .navigator-table .column-action{text-align:center;width:90px;white-space:nowrap;padding-right:20px !important}.filebrowser .navigator-list .column-action a,.filebrowser .navigator-table .column-action a{font-size:16px !important;margin:0}.filebrowser .navigator-list .column-action .action-button,.filebrowser .navigator-table .column-action .action-button{background-image:none !important;margin-bottom:0;border-radius:var(--button-radius, 3px) !important;color:var(--dca-gray-light, var(--button-fg, #999)) !important;background-color:var(--dca-white, var(--button-bg, #fff)) !important;border:1px solid var(--dca-gray-lighter, transparent) !important;background-clip:padding-box;-webkit-appearance:none}.filebrowser .navigator-list .column-action .action-button:focus,.filebrowser .navigator-list .column-action .action-button.focus,.filebrowser .navigator-list .column-action .action-button:hover,.filebrowser .navigator-table .column-action .action-button:focus,.filebrowser .navigator-table .column-action .action-button.focus,.filebrowser .navigator-table .column-action .action-button:hover{color:var(--dca-gray-light, var(--button-fg, #999)) !important;background-color:var(--dca-gray-lightest, var(--darkened-bg, #f2f2f2)) !important;border-color:var(--dca-gray-lighter, transparent) !important;text-decoration:none !important}.filebrowser .navigator-list .column-action .action-button:active,.filebrowser .navigator-list .column-action .action-button.cms-btn-active,.filebrowser .navigator-table .column-action .action-button:active,.filebrowser .navigator-table .column-action .action-button.cms-btn-active{color:var(--dca-gray-light, var(--button-fg, #999)) !important;background-color:var(--dca-white, var(--button-bg, #fff)) !important;border-color:var(--dca-gray-lighter, transparent) !important;filter:brightness(var(--active-brightness)) opacity(1) !important;box-shadow:inset 0 3px 5px rgba(var(--dca-black, var(--body-fg, #000)), 0.125) !important}.filebrowser .navigator-list .column-action .action-button:active:hover,.filebrowser .navigator-list .column-action .action-button:active:focus,.filebrowser .navigator-list .column-action .action-button:active.focus,.filebrowser .navigator-list .column-action .action-button.cms-btn-active:hover,.filebrowser .navigator-list .column-action .action-button.cms-btn-active:focus,.filebrowser .navigator-list .column-action .action-button.cms-btn-active.focus,.filebrowser .navigator-table .column-action .action-button:active:hover,.filebrowser .navigator-table .column-action .action-button:active:focus,.filebrowser .navigator-table .column-action .action-button:active.focus,.filebrowser .navigator-table .column-action .action-button.cms-btn-active:hover,.filebrowser .navigator-table .column-action .action-button.cms-btn-active:focus,.filebrowser .navigator-table .column-action .action-button.cms-btn-active.focus{color:var(--dca-gray-light, var(--button-fg, #999)) !important;background-color:var(--dca-white, var(--button-bg, #fff)) !important;border-color:var(--dca-gray-lighter, transparent) !important;filter:brightness(calc(var(--focus-brightness) * var(--active-brightness))) opacity(1) !important}.filebrowser .navigator-list .column-action .action-button:active,.filebrowser .navigator-list .column-action .action-button.cms-btn-active,.filebrowser .navigator-table .column-action .action-button:active,.filebrowser .navigator-table .column-action .action-button.cms-btn-active{background-image:none !important}.filebrowser .navigator-list .column-action .action-button.cms-btn-disabled,.filebrowser .navigator-list .column-action .action-button.cms-btn-disabled:hover,.filebrowser .navigator-list .column-action .action-button.cms-btn-disabled:focus,.filebrowser .navigator-list .column-action .action-button.cms-btn-disabled.focus,.filebrowser .navigator-list .column-action .action-button.cms-btn-disabled:active,.filebrowser .navigator-list .column-action .action-button.cms-btn-disabled.cms-btn-active,.filebrowser .navigator-list .column-action .action-button[disabled],.filebrowser .navigator-list .column-action .action-button[disabled]:hover,.filebrowser .navigator-list .column-action .action-button[disabled]:focus,.filebrowser .navigator-list .column-action .action-button[disabled].focus,.filebrowser .navigator-list .column-action .action-button[disabled]:active,.filebrowser .navigator-list .column-action .action-button[disabled].cms-btn-active,.filebrowser .navigator-table .column-action .action-button.cms-btn-disabled,.filebrowser .navigator-table .column-action .action-button.cms-btn-disabled:hover,.filebrowser .navigator-table .column-action .action-button.cms-btn-disabled:focus,.filebrowser .navigator-table .column-action .action-button.cms-btn-disabled.focus,.filebrowser .navigator-table .column-action .action-button.cms-btn-disabled:active,.filebrowser .navigator-table .column-action .action-button.cms-btn-disabled.cms-btn-active,.filebrowser .navigator-table .column-action .action-button[disabled],.filebrowser .navigator-table .column-action .action-button[disabled]:hover,.filebrowser .navigator-table .column-action .action-button[disabled]:focus,.filebrowser .navigator-table .column-action .action-button[disabled].focus,.filebrowser .navigator-table .column-action .action-button[disabled]:active,.filebrowser .navigator-table .column-action .action-button[disabled].cms-btn-active{background-color:var(--dca-white, var(--button-bg, #fff)) !important;border-color:var(--dca-gray-lighter, transparent) !important;color:var(--dca-gray-light, var(--button-fg, #999)) true;filter:brightness(0.6) opacity(1);cursor:not-allowed;box-shadow:none !important}.filebrowser .navigator-list .column-action .action-button.cms-btn-disabled:before,.filebrowser .navigator-list .column-action .action-button.cms-btn-disabled:hover:before,.filebrowser .navigator-list .column-action .action-button.cms-btn-disabled:focus:before,.filebrowser .navigator-list .column-action .action-button.cms-btn-disabled.focus:before,.filebrowser .navigator-list .column-action .action-button.cms-btn-disabled:active:before,.filebrowser .navigator-list .column-action .action-button.cms-btn-disabled.cms-btn-active:before,.filebrowser .navigator-list .column-action .action-button[disabled]:before,.filebrowser .navigator-list .column-action .action-button[disabled]:hover:before,.filebrowser .navigator-list .column-action .action-button[disabled]:focus:before,.filebrowser .navigator-list .column-action .action-button[disabled].focus:before,.filebrowser .navigator-list .column-action .action-button[disabled]:active:before,.filebrowser .navigator-list .column-action .action-button[disabled].cms-btn-active:before,.filebrowser .navigator-table .column-action .action-button.cms-btn-disabled:before,.filebrowser .navigator-table .column-action .action-button.cms-btn-disabled:hover:before,.filebrowser .navigator-table .column-action .action-button.cms-btn-disabled:focus:before,.filebrowser .navigator-table .column-action .action-button.cms-btn-disabled.focus:before,.filebrowser .navigator-table .column-action .action-button.cms-btn-disabled:active:before,.filebrowser .navigator-table .column-action .action-button.cms-btn-disabled.cms-btn-active:before,.filebrowser .navigator-table .column-action .action-button[disabled]:before,.filebrowser .navigator-table .column-action .action-button[disabled]:hover:before,.filebrowser .navigator-table .column-action .action-button[disabled]:focus:before,.filebrowser .navigator-table .column-action .action-button[disabled].focus:before,.filebrowser .navigator-table .column-action .action-button[disabled]:active:before,.filebrowser .navigator-table .column-action .action-button[disabled].cms-btn-active:before{color:var(--dca-gray-light, var(--button-fg, #999)) true;filter:brightness(0.6) opacity(1)}.filebrowser .navigator-list .column-action .action-button,.filebrowser .navigator-table .column-action .action-button{margin:3px;padding:2px 6px 8px !important}.filebrowser .navigator-list .column-action .action-button span,.filebrowser .navigator-table .column-action .action-button span{font-size:17px;line-height:33px;vertical-align:middle}.filebrowser .navigator-list .no-files,.filebrowser .navigator-table .no-files{color:var(--dca-gray, var(--body-quiet-color, #666));font-size:14px;text-align:center;padding:40px 0 !important;background-color:var(--dca-gray-lightest, var(--darkened-bg, #f2f2f2)) !important}.filebrowser .navigator-list .no-files span,.filebrowser .navigator-table .no-files span{font-size:20px;margin-right:10px}.filebrowser .navigator-list .no-files span:before,.filebrowser .navigator-table .no-files span:before{vertical-align:sub}.filebrowser .navigator-list .dz-drag-hover td,.filebrowser .navigator-table .dz-drag-hover td{position:relative;background:var(--dca-gray-lightest, var(--darkened-bg, #f2f2f2)) !important;box-sizing:border-box !important}.filebrowser .navigator-list .dz-drag-hover td a.icon,.filebrowser .navigator-table .dz-drag-hover td a.icon{color:var(--dca-gray-darkest, var(--body-fg, #333)) !important;background-color:var(--dca-white, var(--body-bg, #fff)) !important}.filebrowser .navigator-list .dz-drag-hover td a,.filebrowser .navigator-table .dz-drag-hover td a{color:var(--dca-primary, var(--primary, #0bf)) !important}.filebrowser .navigator-list.dz-drag-hover,.filebrowser .navigator-table.dz-drag-hover{position:relative}.filebrowser .navigator-list.dz-drag-hover .drag-hover-border,.filebrowser .navigator-table.dz-drag-hover .drag-hover-border{display:none !important}.filebrowser .navigator-list.dz-drag-hover td,.filebrowser .navigator-table.dz-drag-hover td{background:var(--dca-gray-lightest, var(--darkened-bg, #f2f2f2)) !important;box-sizing:border-box !important}.filebrowser .navigator-list .reset-hover td,.filebrowser .navigator-list.reset-hover td,.filebrowser .navigator-table .reset-hover td,.filebrowser .navigator-table.reset-hover td{background-color:var(--dca-white, var(--body-bg, #fff)) !important}.filebrowser .navigator-list .reset-hover .dz-drag-hover td,.filebrowser .navigator-list.reset-hover .dz-drag-hover td,.filebrowser .navigator-table .reset-hover .dz-drag-hover td,.filebrowser .navigator-table.reset-hover .dz-drag-hover td{background:var(--dca-gray-lightest, var(--darkened-bg, #f2f2f2)) !important}.navigator-top-nav{position:relative;clear:both;min-height:35px;padding:15px 20px;background:var(--dca-gray-super-lightest, var(--darkened-bg, #f7f7f7));border-bottom:var(--dca-gray-lighter, var(--border-color, #ddd)) solid 1px}.navigator-top-nav .breadcrumbs-container-wrapper{display:table;width:100%}@media screen and (max-width: 720px){.navigator-top-nav .breadcrumbs-container-wrapper{display:block}}.navigator-top-nav .breadcrumbs-container-inner{display:table;table-layout:fixed;width:100%}.navigator-top-nav .breadcrumbs-container-inner .filer-dropdown-container{display:table-cell;width:30px;height:35px;vertical-align:middle}.navigator-top-nav .breadcrumbs-container-inner .filer-dropdown-container span{line-height:35px;height:35px;vertical-align:middle}.navigator-top-nav .breadcrumbs-container{display:table-cell;vertical-align:middle}@media screen and (max-width: 720px){.navigator-top-nav .breadcrumbs-container{position:static;margin-right:20px}}.navigator-top-nav .tools-container:before,.navigator-top-nav .tools-container:after{content:" ";display:table}.navigator-top-nav .tools-container:after{clear:both}.navigator-top-nav .tools-container{display:table-cell;vertical-align:middle;text-align:right;margin-top:2px}@media screen and (max-width: 720px){.navigator-top-nav .tools-container{display:inline;text-align:left}}.navigator-top-nav .nav-button{display:inline-block;color:var(--dca-gray, var(--body-quiet-color, #666));font-size:20px;line-height:34px;vertical-align:top;margin:0 10px}.navigator-top-nav .nav-button span{vertical-align:middle}.navigator-top-nav .nav-button-filter{position:relative;top:-1px}.navigator-top-nav .nav-button-dots{margin:0;padding:0 15px}.navigator-top-nav .separator{display:inline-block;position:relative;vertical-align:top;width:1px;height:34px;margin:0 5px}.navigator-top-nav .separator:before{content:"";display:block;position:absolute;top:-14px;bottom:-11px;overflow:hidden;width:1px;background-color:var(--dca-gray-lighter, var(--border-color, #ddd))}.breadcrumb-min-width .filer-navigator-breadcrumbs-dropdown-container,.breadcrumb-min-width .navigator-breadcrumbs-name-dropdown-wrapper,.breadcrumb-min-width .navigator-breadcrumbs-folder-name-wrapper,.breadcrumb-min-width .breadcrumbs-container-wrapper,.breadcrumb-min-width .breadcrumbs-container,.breadcrumb-min-width .tools-container,.breadcrumb-min-width .filter-files-container,.breadcrumb-min-width .navigator-breadcrumbs,.breadcrumb-min-width .navigator-button-wrapper{display:inline-block;text-align:left}.breadcrumb-min-width .filer-navigator-breadcrumbs-dropdown-container .actions-wrapper,.breadcrumb-min-width .navigator-breadcrumbs-name-dropdown-wrapper .actions-wrapper,.breadcrumb-min-width .navigator-breadcrumbs-folder-name-wrapper .actions-wrapper,.breadcrumb-min-width .breadcrumbs-container-wrapper .actions-wrapper,.breadcrumb-min-width .breadcrumbs-container .actions-wrapper,.breadcrumb-min-width .tools-container .actions-wrapper,.breadcrumb-min-width .filter-files-container .actions-wrapper,.breadcrumb-min-width .navigator-breadcrumbs .actions-wrapper,.breadcrumb-min-width .navigator-button-wrapper .actions-wrapper{white-space:nowrap;margin-left:0;margin-top:10px}.breadcrumb-min-width .filer-navigator-breadcrumbs-dropdown-container .actions-wrapper li:first-child,.breadcrumb-min-width .navigator-breadcrumbs-name-dropdown-wrapper .actions-wrapper li:first-child,.breadcrumb-min-width .navigator-breadcrumbs-folder-name-wrapper .actions-wrapper li:first-child,.breadcrumb-min-width .breadcrumbs-container-wrapper .actions-wrapper li:first-child,.breadcrumb-min-width .breadcrumbs-container .actions-wrapper li:first-child,.breadcrumb-min-width .tools-container .actions-wrapper li:first-child,.breadcrumb-min-width .filter-files-container .actions-wrapper li:first-child,.breadcrumb-min-width .navigator-breadcrumbs .actions-wrapper li:first-child,.breadcrumb-min-width .navigator-button-wrapper .actions-wrapper li:first-child{padding-left:0}.breadcrumb-min-width .navigator-button-wrapper{margin-top:10px}.breadcrumb-min-width .navigator-breadcrumbs-name-dropdown-wrapper{min-height:inherit}.breadcrumb-min-width .navigator-breadcrumbs-name-dropdown-wrapper .filer-dropdown-container .fa-caret-down{vertical-align:text-top}.breadcrumb-min-width .breadcrumbs-container-inner .filer-dropdown-container{display:inline-block !important}.breadcrumb-min-width .navigator-tools{white-space:normal}.breadcrumb-min-width .filter-files-container{width:100%;margin-top:10px;z-index:auto}.breadcrumb-min-width .breadcrumbs-container{margin-right:0}.breadcrumb-min-width .navigator-breadcrumbs .icon{vertical-align:middle}.breadcrumb-min-width .navigator-breadcrumbs-folder-name-wrapper{float:left;width:calc(100% - 30px)}.navigator-tools:before,.navigator-tools:after{content:" ";display:table}.navigator-tools:after{clear:both}.navigator-tools{white-space:nowrap}@media screen and (max-width: 720px){.navigator-tools{display:inline}}.navigator-tools .actions-wrapper{display:inline-block;margin-bottom:0;margin-left:10px}.navigator-tools .actions-wrapper a,.navigator-tools .actions-wrapper a:hover{color:var(--dca-gray-light, var(--body-quiet-color, #999)) !important;cursor:not-allowed}@media screen and (max-width: 720px){.navigator-tools .actions-wrapper:before,.navigator-tools .actions-wrapper:after{content:" ";display:table}.navigator-tools .actions-wrapper:after{clear:both}.navigator-tools .actions-wrapper{float:none;margin-left:0}}.navigator-tools .actions-wrapper.action-selected a{color:var(--dca-gray, var(--body-quiet-color, #666)) !important;cursor:pointer}.navigator-tools .actions-wrapper.action-selected .actions-separated-list{display:inline-block}.navigator-tools .actions-wrapper+.filer-list-type-switcher-wrapper{border-left:solid 1px var(--dca-gray-lighter, var(--border-color, #ddd));margin-left:0}.navigator-tools .actions{display:none;float:right}@media screen and (max-width: 720px){.navigator-tools .actions:before,.navigator-tools .actions:after{content:" ";display:table}.navigator-tools .actions:after{clear:both}.navigator-tools .actions{float:none;margin-bottom:10px}}.navigator-tools .actions .all,.navigator-tools .actions .question,.navigator-tools .actions .clear,.navigator-tools .actions .action-counter{font-size:12px;line-height:34px;vertical-align:text-top}.navigator-tools .actions .action-counter,.navigator-tools .actions .all{color:var(--dca-gray-light, var(--body-quiet-color, #999))}.navigator-tools .actions .question,.navigator-tools .actions .clear{margin-left:10px;padding-left:10px;border-left:solid 1px var(--dca-gray-lighter, var(--border-color, #ddd))}.navigator-tools .filer-list-type-switcher-wrapper{display:inline-block;margin-left:10px}@media screen and (max-width: 720px){.navigator-top-nav .breadcrumbs-container{float:none}.navigator-top-nav .navigator-tools{float:none}.navigator-top-nav .navigator-tools .separator:before{top:0;bottom:0}}.navigator-button-wrapper{display:inline-block;vertical-align:top;text-align:right;margin-bottom:0;margin-left:10px}@media screen and (max-width: 720px){.navigator-button-wrapper{display:block;float:none;text-align:left;margin-top:0;margin-left:0}}.navigator-button{margin-right:10px}.navigator-button,.navigator-button:visited,.navigator-button:link:visited,.navigator-button:link{background-image:none !important;margin-bottom:0;border-radius:var(--button-radius, 3px) !important;color:var(--default-button-fg, var(--button-fg, #fff)) !important;background-color:var(--default-button-bg, var(--dca-primary, var(--primary, #0bf))) !important;border:1px solid var(--dca-black, var(--body-fg, #000)) !important;background-clip:padding-box;-webkit-appearance:none}.navigator-button:focus,.navigator-button.focus,.navigator-button:hover,.navigator-button:visited:focus,.navigator-button:visited.focus,.navigator-button:visited:hover,.navigator-button:link:visited:focus,.navigator-button:link:visited.focus,.navigator-button:link:visited:hover,.navigator-button:link:focus,.navigator-button:link.focus,.navigator-button:link:hover{color:var(--default-button-fg, var(--button-fg, #fff)) !important;background-color:var(--default-button-bg, var(--dca-primary, var(--primary, #0bf))) !important;border-color:var(--dca-black, var(--body-fg, #000)) !important;filter:invert(0.05) !important;text-decoration:none !important}.navigator-button:active,.navigator-button.cms-btn-active,.navigator-button:visited:active,.navigator-button:visited.cms-btn-active,.navigator-button:link:visited:active,.navigator-button:link:visited.cms-btn-active,.navigator-button:link:active,.navigator-button:link.cms-btn-active{color:var(--default-button-fg, var(--button-fg, #fff)) !important;background-color:var(--default-button-bg, var(--dca-primary, var(--primary, #0bf))) !important;border-color:var(--dca-black, var(--body-fg, #000)) !important;filter:brightness(var(--active-brightness)) opacity(1) !important;box-shadow:inset 0 3px 5px rgba(var(--dca-black, var(--body-fg, #000)), 0.125) !important}.navigator-button:active:hover,.navigator-button:active:focus,.navigator-button:active.focus,.navigator-button.cms-btn-active:hover,.navigator-button.cms-btn-active:focus,.navigator-button.cms-btn-active.focus,.navigator-button:visited:active:hover,.navigator-button:visited:active:focus,.navigator-button:visited:active.focus,.navigator-button:visited.cms-btn-active:hover,.navigator-button:visited.cms-btn-active:focus,.navigator-button:visited.cms-btn-active.focus,.navigator-button:link:visited:active:hover,.navigator-button:link:visited:active:focus,.navigator-button:link:visited:active.focus,.navigator-button:link:visited.cms-btn-active:hover,.navigator-button:link:visited.cms-btn-active:focus,.navigator-button:link:visited.cms-btn-active.focus,.navigator-button:link:active:hover,.navigator-button:link:active:focus,.navigator-button:link:active.focus,.navigator-button:link.cms-btn-active:hover,.navigator-button:link.cms-btn-active:focus,.navigator-button:link.cms-btn-active.focus{color:var(--default-button-fg, var(--button-fg, #fff)) !important;background-color:var(--default-button-bg, var(--dca-primary, var(--primary, #0bf))) !important;border-color:var(--dca-black, var(--body-fg, #000)) !important;filter:brightness(calc(var(--focus-brightness) * var(--active-brightness))) opacity(1) !important}.navigator-button:active,.navigator-button.cms-btn-active,.navigator-button:visited:active,.navigator-button:visited.cms-btn-active,.navigator-button:link:visited:active,.navigator-button:link:visited.cms-btn-active,.navigator-button:link:active,.navigator-button:link.cms-btn-active{background-image:none !important}.navigator-button.cms-btn-disabled,.navigator-button.cms-btn-disabled:hover,.navigator-button.cms-btn-disabled:focus,.navigator-button.cms-btn-disabled.focus,.navigator-button.cms-btn-disabled:active,.navigator-button.cms-btn-disabled.cms-btn-active,.navigator-button[disabled],.navigator-button[disabled]:hover,.navigator-button[disabled]:focus,.navigator-button[disabled].focus,.navigator-button[disabled]:active,.navigator-button[disabled].cms-btn-active,.navigator-button:visited.cms-btn-disabled,.navigator-button:visited.cms-btn-disabled:hover,.navigator-button:visited.cms-btn-disabled:focus,.navigator-button:visited.cms-btn-disabled.focus,.navigator-button:visited.cms-btn-disabled:active,.navigator-button:visited.cms-btn-disabled.cms-btn-active,.navigator-button:visited[disabled],.navigator-button:visited[disabled]:hover,.navigator-button:visited[disabled]:focus,.navigator-button:visited[disabled].focus,.navigator-button:visited[disabled]:active,.navigator-button:visited[disabled].cms-btn-active,.navigator-button:link:visited.cms-btn-disabled,.navigator-button:link:visited.cms-btn-disabled:hover,.navigator-button:link:visited.cms-btn-disabled:focus,.navigator-button:link:visited.cms-btn-disabled.focus,.navigator-button:link:visited.cms-btn-disabled:active,.navigator-button:link:visited.cms-btn-disabled.cms-btn-active,.navigator-button:link:visited[disabled],.navigator-button:link:visited[disabled]:hover,.navigator-button:link:visited[disabled]:focus,.navigator-button:link:visited[disabled].focus,.navigator-button:link:visited[disabled]:active,.navigator-button:link:visited[disabled].cms-btn-active,.navigator-button:link.cms-btn-disabled,.navigator-button:link.cms-btn-disabled:hover,.navigator-button:link.cms-btn-disabled:focus,.navigator-button:link.cms-btn-disabled.focus,.navigator-button:link.cms-btn-disabled:active,.navigator-button:link.cms-btn-disabled.cms-btn-active,.navigator-button:link[disabled],.navigator-button:link[disabled]:hover,.navigator-button:link[disabled]:focus,.navigator-button:link[disabled].focus,.navigator-button:link[disabled]:active,.navigator-button:link[disabled].cms-btn-active{background-color:var(--default-button-bg, var(--dca-primary, var(--primary, #0bf))) !important;border-color:var(--dca-black, var(--body-fg, #000)) !important;color:var(--default-button-fg, var(--button-fg, #fff)) true;filter:brightness(0.6) opacity(1);cursor:not-allowed;box-shadow:none !important}.navigator-button.cms-btn-disabled:before,.navigator-button.cms-btn-disabled:hover:before,.navigator-button.cms-btn-disabled:focus:before,.navigator-button.cms-btn-disabled.focus:before,.navigator-button.cms-btn-disabled:active:before,.navigator-button.cms-btn-disabled.cms-btn-active:before,.navigator-button[disabled]:before,.navigator-button[disabled]:hover:before,.navigator-button[disabled]:focus:before,.navigator-button[disabled].focus:before,.navigator-button[disabled]:active:before,.navigator-button[disabled].cms-btn-active:before,.navigator-button:visited.cms-btn-disabled:before,.navigator-button:visited.cms-btn-disabled:hover:before,.navigator-button:visited.cms-btn-disabled:focus:before,.navigator-button:visited.cms-btn-disabled.focus:before,.navigator-button:visited.cms-btn-disabled:active:before,.navigator-button:visited.cms-btn-disabled.cms-btn-active:before,.navigator-button:visited[disabled]:before,.navigator-button:visited[disabled]:hover:before,.navigator-button:visited[disabled]:focus:before,.navigator-button:visited[disabled].focus:before,.navigator-button:visited[disabled]:active:before,.navigator-button:visited[disabled].cms-btn-active:before,.navigator-button:link:visited.cms-btn-disabled:before,.navigator-button:link:visited.cms-btn-disabled:hover:before,.navigator-button:link:visited.cms-btn-disabled:focus:before,.navigator-button:link:visited.cms-btn-disabled.focus:before,.navigator-button:link:visited.cms-btn-disabled:active:before,.navigator-button:link:visited.cms-btn-disabled.cms-btn-active:before,.navigator-button:link:visited[disabled]:before,.navigator-button:link:visited[disabled]:hover:before,.navigator-button:link:visited[disabled]:focus:before,.navigator-button:link:visited[disabled].focus:before,.navigator-button:link:visited[disabled]:active:before,.navigator-button:link:visited[disabled].cms-btn-active:before,.navigator-button:link.cms-btn-disabled:before,.navigator-button:link.cms-btn-disabled:hover:before,.navigator-button:link.cms-btn-disabled:focus:before,.navigator-button:link.cms-btn-disabled.focus:before,.navigator-button:link.cms-btn-disabled:active:before,.navigator-button:link.cms-btn-disabled.cms-btn-active:before,.navigator-button:link[disabled]:before,.navigator-button:link[disabled]:hover:before,.navigator-button:link[disabled]:focus:before,.navigator-button:link[disabled].focus:before,.navigator-button:link[disabled]:active:before,.navigator-button:link[disabled].cms-btn-active:before{color:var(--default-button-fg, var(--button-fg, #fff)) true;filter:brightness(0.6) opacity(1)}.navigator-button,.navigator-button:visited,.navigator-button:link:visited,.navigator-button:link{display:inline-block;vertical-align:top;padding:10px 20px !important}.navigator-button .icon{position:relative;margin-right:3px}.navigator-button .fa-folder{top:0}.navigator-button.navigator-button-upload{margin-right:0}.upload-button-disabled{display:inline-block}.navigator-button+.filer-dropdown-menu{margin-top:-2px}.navigator{position:relative;overflow-x:auto;width:100%}.navigator form{margin:0;padding:0;box-shadow:none}.filer-dropdown-container{display:inline-block;position:relative;vertical-align:top}.filer-dropdown-container .fa-caret-down,.filer-dropdown-container .cms-icon-caret-down{font-size:14px}.filer-dropdown-container .filer-dropdown-menu,.filer-dropdown-container+.filer-dropdown-menu{display:none;right:0;left:auto;border:0;box-shadow:0 1px 10px rgba(0,0,0,.25)}.filer-dropdown-container .filer-dropdown-menu>li>a,.filer-dropdown-container+.filer-dropdown-menu>li>a{display:block;color:var(--dca-primary, var(--primary, #0bf));font-weight:normal;white-space:normal;padding:12px 20px !important}@media screen and (min-width: 720px){.filer-dropdown-container .filer-dropdown-menu>li>a,.filer-dropdown-container+.filer-dropdown-menu>li>a{white-space:nowrap}}.filer-dropdown-container .filer-dropdown-menu label,.filer-dropdown-container+.filer-dropdown-menu label{display:block;line-height:20px !important;text-transform:none;width:auto;margin:5px 0 !important;padding:0 10px !important}.filer-dropdown-container .filer-dropdown-menu input,.filer-dropdown-container+.filer-dropdown-menu input{position:relative;top:4px;vertical-align:top;margin-right:5px}.filer-dropdown-container .filer-dropdown-menu.filer-dropdown-menu-checkboxes,.filer-dropdown-container+.filer-dropdown-menu.filer-dropdown-menu-checkboxes{width:0;min-height:50px;padding:15px;border:0;box-shadow:0 1px 10px rgba(0,0,0,.25)}.filer-dropdown-container .filer-dropdown-menu.filer-dropdown-menu-checkboxes:before,.filer-dropdown-container+.filer-dropdown-menu.filer-dropdown-menu-checkboxes:before{display:none}.filer-dropdown-container .filer-dropdown-menu.filer-dropdown-menu-checkboxes .fa-close,.filer-dropdown-container+.filer-dropdown-menu.filer-dropdown-menu-checkboxes .fa-close{position:absolute;top:10px;right:10px;color:var(--dca-gray, var(--body-quiet-color, #666));cursor:pointer}.filer-dropdown-container .filer-dropdown-menu.filer-dropdown-menu-checkboxes .fa-close:hover,.filer-dropdown-container+.filer-dropdown-menu.filer-dropdown-menu-checkboxes .fa-close:hover{color:var(--dca-primary, var(--primary, #0bf))}.filer-dropdown-container .filer-dropdown-menu.filer-dropdown-menu-checkboxes p,.filer-dropdown-container+.filer-dropdown-menu.filer-dropdown-menu-checkboxes p{color:var(--dca-gray-light, var(--body-quiet-color, #999)) !important;font-weight:normal;text-transform:uppercase;margin-bottom:5px}.filer-dropdown-container .filer-dropdown-menu.filer-dropdown-menu-checkboxes label,.filer-dropdown-container+.filer-dropdown-menu.filer-dropdown-menu-checkboxes label{color:var(--dca-gray, var(--body-quiet-color, #666)) !important;font-weight:normal;padding:0 !important;margin-top:0 !important}.filer-dropdown-container .filer-dropdown-menu.filer-dropdown-menu-checkboxes label input,.filer-dropdown-container+.filer-dropdown-menu.filer-dropdown-menu-checkboxes label input{margin-left:0}.filer-dropdown-container .filer-dropdown-menu a:hover,.filer-dropdown-container+.filer-dropdown-menu a:hover{color:var(--dca-white, var(--body-bg, #fff)) !important;background:var(--dca-primary, var(--primary, #0bf)) !important}.filer-dropdown-container.open .filer-dropdown-menu{display:block}.filer-dropdown-container.open .filer-dropdown-menu li{margin:0;padding:0;list-style-type:none}.filer-dropdown-container+.separator{margin-right:10px}.filer-dropdown-container-down>a,.filer-dropdown-container-down>a:link,.filer-dropdown-container-down>a:visited,.filer-dropdown-container-down>a:link:visited{color:var(--dca-gray, var(--body-quiet-color, #666));font-size:20px;line-height:35px;height:35px;padding:0 10px}.filer-dropdown-container-down .filer-dropdown-menu{right:auto;left:-14px;margin-right:10px}.filer-dropdown-menu{position:absolute;top:100%;z-index:1000;display:none;float:left;min-width:160px;margin:2px 0 0;margin-top:0 !important;padding:0;list-style:none;font-size:14px;text-align:left;background-color:var(--dca-white, var(--body-bg, #fff));border-radius:4px;background-clip:padding-box}.filer-dropdown-menu:before{position:absolute;top:-5px;left:35px;z-index:-1;content:"";width:10px;height:10px;margin-left:-5px;transform:rotate(45deg);background-color:var(--dca-white, var(--body-bg, #fff))}.filer-dropdown-menu.create-menu-dropdown:before{left:auto;right:17px}.navigator-breadcrumbs:before,.navigator-breadcrumbs:after{content:" ";display:table}.navigator-breadcrumbs:after{clear:both}.navigator-breadcrumbs{display:table-cell;vertical-align:middle;font-size:16px;white-space:nowrap;width:60px}.navigator-breadcrumbs>a{color:var(--dca-gray-darkest, var(--body-fg, #333)) !important}.navigator-breadcrumbs .icon{color:var(--dca-gray-light, var(--body-quiet-color, #999));line-height:35px;height:35px;margin:0 5px}.navigator-breadcrumbs .icon:before{vertical-align:middle}.navigator-breadcrumbs li{list-style-type:none}.navigator-breadcrumbs-folder-name-wrapper{display:table-cell;overflow:hidden;font-size:16px;font-weight:bold;vertical-align:middle;white-space:nowrap}.navigator-breadcrumbs-folder-name{display:block;overflow:hidden;white-space:normal;line-height:35px;width:100%;height:35px}.navigator-breadcrumbs-folder-name-inner{display:block;position:relative;overflow:hidden;line-height:35px;height:35px;width:100%;text-overflow:ellipsis}.filer-navigator-breadcrumbs-dropdown-container{position:relative;float:left;vertical-align:middle;margin:0 7px 0 0}.filer-navigator-breadcrumbs-dropdown-container>a img{padding:3px 0}.filer-navigator-breadcrumbs-dropdown-container .navigator-breadcrumbs-dropdown{left:-15px !important;min-width:200px;padding:0;margin-top:0;border:0;box-shadow:0 1px 10px rgba(0,0,0,.25)}.filer-navigator-breadcrumbs-dropdown-container .navigator-breadcrumbs-dropdown>li{padding:0}.filer-navigator-breadcrumbs-dropdown-container .navigator-breadcrumbs-dropdown>li>a{color:var(--dca-primary, var(--primary, #0bf));padding:12px 20px 3px !important;border-bottom:solid 1px var(--dca-gray-lightest, var(--darkened-bg, #f2f2f2))}.filer-navigator-breadcrumbs-dropdown-container .navigator-breadcrumbs-dropdown>li>a:hover{color:var(--dca-white, var(--body-bg, #fff)) !important;background:var(--dca-primary, var(--primary, #0bf)) !important}.filer-navigator-breadcrumbs-dropdown-container .navigator-breadcrumbs-dropdown>li:last-child>a{border-bottom:none}.filer-navigator-breadcrumbs-dropdown-container .navigator-breadcrumbs-dropdown img{position:relative;top:-5px;vertical-align:top;margin:0 10px 0 0}.navigator-dropdown-arrow-up{position:relative;left:20px;overflow:hidden;width:20px;height:20px;margin-top:-20px;z-index:1001}.navigator-dropdown-arrow-up:after{content:"";position:absolute;top:15px;left:5px;width:10px;height:10px;background:#fff;transform:rotate(45deg);box-shadow:0 1px 10px rgba(0,0,0,.25)}.navigator-breadcrumbs-name-dropdown-wrapper{display:table;min-height:35px}.navigator-breadcrumbs-name-dropdown-wrapper .filer-dropdown-menu{left:auto;right:-80px}.navigator-breadcrumbs-name-dropdown-wrapper .filer-dropdown-menu:before{right:80px;left:auto}.navigator-breadcrumbs-name-dropdown-wrapper a{display:inline-block}.empty-filer-header-cell{display:table-cell;vertical-align:middle}.filebrowser .navigator-thumbnail-list{overflow:hidden}.filebrowser .navigator-thumbnail-list .navigator-list{border-top:0 !important}.filebrowser .navigator-thumbnail-list .navigator-thumbnail-list-header>*{display:inline-block;text-transform:uppercase;margin:0;padding:0;padding-left:10px}.filebrowser .navigator-thumbnail-list .navigator-thumbnail-list-header .navigator-checkbox{float:right;padding-right:20px;text-transform:initial;color:var(--dca-primary, var(--primary, #0bf))}.filebrowser .navigator-thumbnail-list .navigator-thumbnail-list-header .navigator-checkbox input[type=checkbox]{margin-left:5px;vertical-align:middle}.filebrowser .navigator-thumbnail-list .navigator-body:before,.filebrowser .navigator-thumbnail-list .navigator-body:after{content:" ";display:table}.filebrowser .navigator-thumbnail-list .navigator-body:after{clear:both}.filebrowser .navigator-thumbnail-list .navigator-body{padding:0 !important}.filebrowser .navigator-thumbnail-list .thumbnail-item{float:left;display:inline-block;padding:10px;width:calc(var(--thumbnail-size, 120px) + 5px);height:calc(var(--thumbnail-size, 120px) + 5px);border:1px solid var(--dca-gray-lighter, var(--border-color, #ddd));margin:16px 12px;background-color:var(--dca-white, var(--body-bg, #fff));position:relative;overflow:hidden}.filebrowser .navigator-thumbnail-list .thumbnail-item .thumbnail-file-item-box{padding:10px;width:calc(var(--thumbnail-size, 120px) + 5px);height:calc(var(--thumbnail-size, 120px) + 5px);border:1px solid var(--dca-gray-lighter, var(--border-color, #ddd));margin:16px 12px;background-color:var(--dca-white, var(--body-bg, #fff))}.filebrowser .navigator-thumbnail-list .thumbnail-item .thumbnail-file-item-box:hover{background-color:#f1faff}.filebrowser .navigator-thumbnail-list .thumbnail-item .navigator-checkbox{position:absolute;top:5px;left:5px}.filebrowser .navigator-thumbnail-list .thumbnail-item .navigator-checkbox input{margin:0;vertical-align:top}.filebrowser .navigator-thumbnail-list .thumbnail-item .item-thumbnail,.filebrowser .navigator-thumbnail-list .thumbnail-item .item-icon{height:50%;width:50%;margin:10px auto;margin-bottom:18px}.filebrowser .navigator-thumbnail-list .thumbnail-item .item-thumbnail a,.filebrowser .navigator-thumbnail-list .thumbnail-item .item-icon a{display:block;height:100%;width:100%}.filebrowser .navigator-thumbnail-list .thumbnail-item .item-thumbnail img,.filebrowser .navigator-thumbnail-list .thumbnail-item .item-icon img{width:100%;height:100%}.filebrowser .navigator-thumbnail-list .thumbnail-item .item-name{background:rgba(0,0,0,0);text-align:center;word-break:break-word}.filebrowser .navigator-thumbnail-list .thumbnail-virtual-item{background-color:initial}.filebrowser .navigator-thumbnail-list .thumbnail-folder-item:hover{background-color:#f1faff}.filebrowser .navigator-thumbnail-list .thumbnail-file-item{float:none;width:calc(var(--thumbnail-size, 120px) + 27px);height:calc(var(--thumbnail-size, 120px) + 80px);border:0;padding:0;background-color:rgba(0,0,0,0)}.filebrowser .navigator-thumbnail-list .thumbnail-file-item .thumbnail-file-item-box{float:none;margin:0;margin-bottom:5px}.filebrowser .navigator-thumbnail-list .thumbnail-file-item .item-thumbnail{margin:0;height:100%;width:100%}.filebrowser .navigator-thumbnail-list .thumbnail-file-item .item-name{position:relative;word-break:break-word}.insertlinkButton:before{content:"" !important}.insertlinkButton span{font-size:17px}.popup.app-cmsplugin_filer_image .form-row.field-image .field-box,.popup.app-cmsplugin_filer_image .field-box.field-free_link,.popup.app-cmsplugin_filer_image .field-box.field-page_link,.popup.app-cmsplugin_filer_image .field-box.field-file_link{float:none !important;margin-right:0 !important;margin-top:20px !important}.popup.app-cmsplugin_filer_image .form-row.field-image .field-box:first-child,.popup.app-cmsplugin_filer_image .field-box.field-free_link:first-child,.popup.app-cmsplugin_filer_image .field-box.field-page_link:first-child,.popup.app-cmsplugin_filer_image .field-box.field-file_link:first-child{margin-top:0 !important}.popup.app-cmsplugin_filer_image .form-row.field-image .field-box input,.popup.app-cmsplugin_filer_image .field-box.field-free_link input,.popup.app-cmsplugin_filer_image .field-box.field-page_link input,.popup.app-cmsplugin_filer_image .field-box.field-file_link input{width:100% !important}.popup.app-cmsplugin_filer_image .form-row .field-box.field-crop,.popup.app-cmsplugin_filer_image .form-row .field-box.field-upscale{margin-top:30px}.popup.delete-confirmation .colM ul{margin-bottom:25px !important}.popup .image-info-detail{padding:0;padding-bottom:25px;margin-bottom:30px;box-shadow:none;border-bottom:solid 1px var(--dca-gray-lighter, var(--border-color, #ddd))}.popup.change-list.filebrowser #result_list tbody th,.popup.change-list.filebrowser #result_list tbody td{height:auto}.popup .filer-dropzone{padding:5px 20px}.popup form .form-row .filer-dropzone .filerFile{top:8px}.popup.filebrowser #container #content{margin:0 !important}.popup .navigator-button-wrapper{float:right}@media screen and (max-width: 720px){.popup .navigator-button-wrapper{float:none}}.popup .navigator-top-nav .tools-container{width:70%}.popup .navigator-top-nav .breadcrumbs-container{width:30%}@media screen and (max-width: 720px){.popup .navigator-top-nav .tools-container,.popup .navigator-top-nav .breadcrumbs-container{width:100%}}form .form-row[class*=file] .related-widget-wrapper-link,form .form-row[class*=folder] .related-widget-wrapper-link,form .form-row[class*=img] .related-widget-wrapper-link,form .form-row[class*=image] .related-widget-wrapper-link,form .form-row[class*=visual] .related-widget-wrapper-link{display:none}form .form-row .filer-widget+.related-widget-wrapper-link,form .form-row .filer-widget+*+.related-widget-wrapper-link{display:none}form .form-row .related-widget-wrapper:has(.filer-widget,.filer-dropzone){width:100%}form .form-row .filer-dropzone:before,form .form-row .filer-dropzone:after{content:" ";display:table}form .form-row .filer-dropzone:after{clear:both}form .form-row .filer-dropzone{position:relative;min-width:320px;border:solid 1px var(--dca-gray-lighter, var(--border-color, #ddd));border-radius:var(--dca-border-radius, 5px);background-color:var(--dca-gray-lightest, var(--darkened-bg, #f2f2f2));box-sizing:border-box !important}form .form-row .filer-dropzone .z-index-fix{position:absolute;top:0;right:0;bottom:0;left:0}form .form-row .filer-dropzone.dz-drag-hover{background-color:var(--dca-primary, var(--primary, #0bf));filter:brightness(1.5);border:solid 2px var(--dca-primary, var(--primary, #0bf)) !important}form .form-row .filer-dropzone.dz-drag-hover .z-index-fix{z-index:1}form .form-row .filer-dropzone.dz-drag-hover .dz-message{opacity:1;display:block !important;visibility:visible}form .form-row .filer-dropzone.dz-drag-hover .filerFile{display:none}form .form-row .filer-dropzone.dz-drag-hover .dz-message,form .form-row .filer-dropzone.dz-drag-hover .dz-message .icon{color:var(--dca-primary, var(--primary, #0bf)) !important}form .form-row .filer-dropzone.dz-started .fileUpload{display:none}form .form-row .filer-dropzone .dz-preview{width:100%;min-height:auto;margin-right:0;margin-bottom:0;margin-left:0;padding-bottom:10px;border-bottom:solid 1px var(--dca-gray-lighter, var(--border-color, #ddd))}form .form-row .filer-dropzone .dz-preview.dz-error{position:relative}form .form-row .filer-dropzone .dz-preview.dz-error .dz-error-message{display:none}form .form-row .filer-dropzone .dz-preview.dz-error:hover .dz-error-message{display:block}form .form-row .filer-dropzone .dz-preview .dz-details{min-width:calc(100% - 80px);max-width:calc(100% - 80px);margin-top:7px;margin-left:40px;padding:0;opacity:1}form .form-row .filer-dropzone .dz-preview .dz-details .dz-filename,form .form-row .filer-dropzone .dz-preview .dz-details .dz-filename:hover,form .form-row .filer-dropzone .dz-preview .dz-details .dz-size{float:left;text-align:left}form .form-row .filer-dropzone .dz-preview .dz-details .dz-filename span,form .form-row .filer-dropzone .dz-preview .dz-details .dz-filename:hover span,form .form-row .filer-dropzone .dz-preview .dz-details .dz-size span{color:var(--dca-gray, var(--body-quiet-color, #666));border:0 !important;background-color:rgba(0,0,0,0) !important}form .form-row .filer-dropzone .dz-preview .dz-remove{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='currentColor' class='bi bi-trash' viewBox='0 0 16 16'%3E%3Cpath d='M5.5 5.5A.5.5 0 0 1 6 6v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5Zm2.5 0a.5.5 0 0 1 .5.5v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5Zm3 .5a.5.5 0 0 0-1 0v6a.5.5 0 0 0 1 0V6Z'/%3E%3Cpath d='M14.5 3a1 1 0 0 1-1 1H13v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V4h-.5a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1H6a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1h3.5a1 1 0 0 1 1 1v1ZM4.118 4 4 4.059V13a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V4.059L11.882 4H4.118ZM2.5 3h11V2h-11v1Z'/%3E%3C/svg%3E%0A");background-size:contain;display:inline-block;position:absolute;top:7px;right:25px;font:0/0 a;width:18px;height:18px}form .form-row .filer-dropzone .dz-preview .dz-error-message{top:65px;left:0;width:100%}form .form-row .filer-dropzone .dz-preview .dz-success-mark,form .form-row .filer-dropzone .dz-preview .dz-error-mark{top:5px;right:0;left:auto;margin-top:0}form .form-row .filer-dropzone .dz-preview .dz-success-mark:before,form .form-row .filer-dropzone .dz-preview .dz-error-mark:before{color:var(--dca-gray, var(--body-quiet-color, #666))}form .form-row .filer-dropzone .dz-preview .dz-success-mark svg,form .form-row .filer-dropzone .dz-preview .dz-error-mark svg{display:none}form .form-row .filer-dropzone .dz-preview .dz-success-mark{width:16px;height:16px;background-image:url("data:image/svg+xml,%3Csvg width='13' height='13' viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%2370bf2b' d='M1412 734q0-28-18-46l-91-90q-19-19-45-19t-45 19l-408 407-226-226q-19-19-45-19t-45 19l-91 90q-18 18-18 46 0 27 18 45l362 362q19 19 45 19 27 0 46-19l543-543q18-18 18-45zm252 162q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z'/%3E%3C/svg%3E%0A");background-size:contain}form .form-row .filer-dropzone .dz-preview .dz-error-mark{background-image:url("data:image/svg+xml,%3Csvg width='13' height='13' viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%23dd4646' d='M1277 1122q0-26-19-45l-181-181 181-181q19-19 19-45 0-27-19-46l-90-90q-19-19-46-19-26 0-45 19l-181 181-181-181q-19-19-45-19-27 0-46 19l-90 90q-19 19-19 46 0 26 19 45l181 181-181 181q-19 19-19 45 0 27 19 46l90 90q19 19 46 19 26 0 45-19l181-181 181 181q19 19 45 19 27 0 46-19l90-90q19-19 19-46zm387-226q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z'/%3E%3C/svg%3E%0A");width:16px;height:16px;background-size:contain}form .form-row .filer-dropzone .dz-preview.dz-image-preview,form .form-row .filer-dropzone .dz-preview.dz-file-preview{background-color:rgba(0,0,0,0)}form .form-row .filer-dropzone .dz-preview.dz-image-preview .dz-image,form .form-row .filer-dropzone .dz-preview.dz-file-preview .dz-image{overflow:hidden;width:36px;height:36px;border:solid 1px var(--dca-gray-lighter, var(--border-color, #ddd));border-radius:0}form .form-row .filer-dropzone .dz-preview.dz-image-preview .dz-image img,form .form-row .filer-dropzone .dz-preview.dz-file-preview .dz-image img{width:100%;height:auto}form .form-row .filer-dropzone .dz-preview .dz-progress{top:18px;left:0;width:calc(100% - 40px);height:10px;margin-left:40px}form .form-row .filer-dropzone .dz-message{float:right;color:var(--dca-gray-lightest, var(--darkened-bg, #f2f2f2));width:100%;margin:15px 0 0}form .form-row .filer-dropzone .icon{position:relative;top:3px;color:var(--dca-gray-lightest, var(--darkened-bg, #f2f2f2));font-size:24px;margin-right:10px}form .form-row .filer-dropzone .filerFile .related-lookup{background-image:none !important;margin-bottom:0;border-radius:var(--button-radius, 3px) !important;color:var(--default-button-fg, var(--button-fg, #fff)) !important;background-color:var(--primary) !important;border:1px solid var(--dca-black, var(--body-fg, #000)) !important;background-clip:padding-box;-webkit-appearance:none}form .form-row .filer-dropzone .filerFile .related-lookup:focus,form .form-row .filer-dropzone .filerFile .related-lookup.focus,form .form-row .filer-dropzone .filerFile .related-lookup:hover{color:var(--default-button-fg, var(--button-fg, #fff)) !important;background-color:var(--primary) !important;border-color:var(--dca-black, var(--body-fg, #000)) !important;filter:invert(0.05) !important;text-decoration:none !important}form .form-row .filer-dropzone .filerFile .related-lookup:active,form .form-row .filer-dropzone .filerFile .related-lookup.cms-btn-active{color:var(--default-button-fg, var(--button-fg, #fff)) !important;background-color:var(--primary) !important;border-color:var(--dca-black, var(--body-fg, #000)) !important;filter:brightness(var(--active-brightness)) opacity(1) !important;box-shadow:inset 0 3px 5px rgba(var(--dca-black, var(--body-fg, #000)), 0.125) !important}form .form-row .filer-dropzone .filerFile .related-lookup:active:hover,form .form-row .filer-dropzone .filerFile .related-lookup:active:focus,form .form-row .filer-dropzone .filerFile .related-lookup:active.focus,form .form-row .filer-dropzone .filerFile .related-lookup.cms-btn-active:hover,form .form-row .filer-dropzone .filerFile .related-lookup.cms-btn-active:focus,form .form-row .filer-dropzone .filerFile .related-lookup.cms-btn-active.focus{color:var(--default-button-fg, var(--button-fg, #fff)) !important;background-color:var(--primary) !important;border-color:var(--dca-black, var(--body-fg, #000)) !important;filter:brightness(calc(var(--focus-brightness) * var(--active-brightness))) opacity(1) !important}form .form-row .filer-dropzone .filerFile .related-lookup:active,form .form-row .filer-dropzone .filerFile .related-lookup.cms-btn-active{background-image:none !important}form .form-row .filer-dropzone .filerFile .related-lookup.cms-btn-disabled,form .form-row .filer-dropzone .filerFile .related-lookup.cms-btn-disabled:hover,form .form-row .filer-dropzone .filerFile .related-lookup.cms-btn-disabled:focus,form .form-row .filer-dropzone .filerFile .related-lookup.cms-btn-disabled.focus,form .form-row .filer-dropzone .filerFile .related-lookup.cms-btn-disabled:active,form .form-row .filer-dropzone .filerFile .related-lookup.cms-btn-disabled.cms-btn-active,form .form-row .filer-dropzone .filerFile .related-lookup[disabled],form .form-row .filer-dropzone .filerFile .related-lookup[disabled]:hover,form .form-row .filer-dropzone .filerFile .related-lookup[disabled]:focus,form .form-row .filer-dropzone .filerFile .related-lookup[disabled].focus,form .form-row .filer-dropzone .filerFile .related-lookup[disabled]:active,form .form-row .filer-dropzone .filerFile .related-lookup[disabled].cms-btn-active{background-color:var(--primary) !important;border-color:var(--dca-black, var(--body-fg, #000)) !important;color:var(--default-button-fg, var(--button-fg, #fff)) true;filter:brightness(0.6) opacity(1);cursor:not-allowed;box-shadow:none !important}form .form-row .filer-dropzone .filerFile .related-lookup.cms-btn-disabled:before,form .form-row .filer-dropzone .filerFile .related-lookup.cms-btn-disabled:hover:before,form .form-row .filer-dropzone .filerFile .related-lookup.cms-btn-disabled:focus:before,form .form-row .filer-dropzone .filerFile .related-lookup.cms-btn-disabled.focus:before,form .form-row .filer-dropzone .filerFile .related-lookup.cms-btn-disabled:active:before,form .form-row .filer-dropzone .filerFile .related-lookup.cms-btn-disabled.cms-btn-active:before,form .form-row .filer-dropzone .filerFile .related-lookup[disabled]:before,form .form-row .filer-dropzone .filerFile .related-lookup[disabled]:hover:before,form .form-row .filer-dropzone .filerFile .related-lookup[disabled]:focus:before,form .form-row .filer-dropzone .filerFile .related-lookup[disabled].focus:before,form .form-row .filer-dropzone .filerFile .related-lookup[disabled]:active:before,form .form-row .filer-dropzone .filerFile .related-lookup[disabled].cms-btn-active:before{color:var(--default-button-fg, var(--button-fg, #fff)) true;filter:brightness(0.6) opacity(1)}form .form-row .filer-dropzone .filerFile .related-lookup{float:left !important;overflow:hidden;line-height:14px;width:auto !important;height:auto !important;padding:10px 20px !important;margin-top:24px;margin-left:10px;text-align:center !important;cursor:pointer}form .form-row .filer-dropzone .filerFile .related-lookup .cms-icon{color:var(--dca-white, var(--body-bg, #fff));font-size:17px;margin:0 10px 0 0;vertical-align:middle}form .form-row .filer-dropzone .filerFile .related-lookup:before{display:none}form .form-row .filer-dropzone .filerFile .related-lookup .choose-file,form .form-row .filer-dropzone .filerFile .related-lookup .replace-file,form .form-row .filer-dropzone .filerFile .related-lookup .edit-file{color:var(--dca-white, var(--body-bg, #fff));margin:0}form .form-row .filer-dropzone .filerFile .related-lookup .replace-file{display:none}form .form-row .filer-dropzone .filerFile .related-lookup.edit{display:none}form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change{background-image:none !important;margin-bottom:0;border-radius:var(--button-radius, 3px) !important;color:var(--dca-gray-light, var(--button-fg, #999)) !important;background-color:var(--dca-white, var(--button-bg, #fff)) !important;border:1px solid var(--dca-gray-lighter, transparent) !important;background-clip:padding-box;-webkit-appearance:none}form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change:focus,form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change.focus,form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change:hover{color:var(--dca-gray-light, var(--button-fg, #999)) !important;background-color:var(--dca-gray-lightest, var(--darkened-bg, #f2f2f2)) !important;border-color:var(--dca-gray-lighter, transparent) !important;text-decoration:none !important}form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change:active,form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change.cms-btn-active{color:var(--dca-gray-light, var(--button-fg, #999)) !important;background-color:var(--dca-white, var(--button-bg, #fff)) !important;border-color:var(--dca-gray-lighter, transparent) !important;filter:brightness(var(--active-brightness)) opacity(1) !important;box-shadow:inset 0 3px 5px rgba(var(--dca-black, var(--body-fg, #000)), 0.125) !important}form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change:active:hover,form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change:active:focus,form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change:active.focus,form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change.cms-btn-active:hover,form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change.cms-btn-active:focus,form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change.cms-btn-active.focus{color:var(--dca-gray-light, var(--button-fg, #999)) !important;background-color:var(--dca-white, var(--button-bg, #fff)) !important;border-color:var(--dca-gray-lighter, transparent) !important;filter:brightness(calc(var(--focus-brightness) * var(--active-brightness))) opacity(1) !important}form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change:active,form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change.cms-btn-active{background-image:none !important}form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change.cms-btn-disabled,form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change.cms-btn-disabled:hover,form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change.cms-btn-disabled:focus,form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change.cms-btn-disabled.focus,form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change.cms-btn-disabled:active,form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change.cms-btn-disabled.cms-btn-active,form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change[disabled],form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change[disabled]:hover,form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change[disabled]:focus,form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change[disabled].focus,form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change[disabled]:active,form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change[disabled].cms-btn-active{background-color:var(--dca-white, var(--button-bg, #fff)) !important;border-color:var(--dca-gray-lighter, transparent) !important;color:var(--dca-gray-light, var(--button-fg, #999)) true;filter:brightness(0.6) opacity(1);cursor:not-allowed;box-shadow:none !important}form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change.cms-btn-disabled:before,form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change.cms-btn-disabled:hover:before,form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change.cms-btn-disabled:focus:before,form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change.cms-btn-disabled.focus:before,form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change.cms-btn-disabled:active:before,form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change.cms-btn-disabled.cms-btn-active:before,form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change[disabled]:before,form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change[disabled]:hover:before,form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change[disabled]:focus:before,form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change[disabled].focus:before,form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change[disabled]:active:before,form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change[disabled].cms-btn-active:before{color:var(--dca-gray-light, var(--button-fg, #999)) true;filter:brightness(0.6) opacity(1)}form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change{float:right !important;padding:5px 0 !important;width:36px !important;height:36px !important}form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change:focus{background-color:var(--dca-white, var(--body-bg, #fff)) !important}form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change span{text-align:center;line-height:24px}form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change .cms-icon{color:var(--dca-gray-light, var(--button-fg, #999));margin-right:0 !important}form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change .choose-file{display:none}form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change .replace-file{display:block}form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change.lookup{display:block !important}form .form-row .filer-dropzone .filerFile .related-lookup.related-lookup-change.edit{display:block}form .form-row .filer-dropzone .filerClearer{width:36px !important;height:36px !important;color:red}form .form-row .filer-dropzone .filerFile{position:absolute;top:9px;left:20px;width:calc(100% - 40px)}form .form-row .filer-dropzone .filerFile img[src*=nofile]{background-color:var(--dca-white, var(--body-bg, #fff))}form .form-row .filer-dropzone .filerFile span:not(:empty):not(.choose-file):not(.replace-file):not(.edit-file){overflow:hidden;white-space:nowrap;text-overflow:ellipsis;width:calc(100% - 260px);height:80px;line-height:80px}form .form-row .filer-dropzone .filerFile img{width:80px;height:80px;margin-right:10px;border:solid 1px var(--dca-gray-lighter, var(--border-color, #ddd));border-radius:0;vertical-align:top}form .form-row .filer-dropzone .filerFile img[src*=nofile]{box-sizing:border-box;margin-right:0;border:solid 1px var(--dca-gray-lighter, var(--border-color, #ddd));border-radius:0}form .form-row .filer-dropzone .filerFile a{box-sizing:border-box;padding-top:10px !important}form .form-row .filer-dropzone .filerFile span{display:inline-block;color:var(--dca-gray, var(--body-quiet-color, #666));font-weight:normal;margin-bottom:6px;text-align:left}form .form-row .filer-dropzone .filerFile span:empty+.related-lookup{float:none !important;margin-left:0 !important}form .form-row .filer-dropzone .filerFile a.filerClearer{background-image:none !important;margin-bottom:0;border-radius:var(--button-radius, 3px) !important;color:var(--dca-gray-light, var(--button-fg, #999)) !important;background-color:var(--dca-white, var(--button-bg, #fff)) !important;border:1px solid var(--dca-gray-lighter, transparent) !important;background-clip:padding-box;-webkit-appearance:none}form .form-row .filer-dropzone .filerFile a.filerClearer:focus,form .form-row .filer-dropzone .filerFile a.filerClearer.focus,form .form-row .filer-dropzone .filerFile a.filerClearer:hover{color:var(--dca-gray-light, var(--button-fg, #999)) !important;background-color:var(--dca-gray-lightest, var(--darkened-bg, #f2f2f2)) !important;border-color:var(--dca-gray-lighter, transparent) !important;text-decoration:none !important}form .form-row .filer-dropzone .filerFile a.filerClearer:active,form .form-row .filer-dropzone .filerFile a.filerClearer.cms-btn-active{color:var(--dca-gray-light, var(--button-fg, #999)) !important;background-color:var(--dca-white, var(--button-bg, #fff)) !important;border-color:var(--dca-gray-lighter, transparent) !important;filter:brightness(var(--active-brightness)) opacity(1) !important;box-shadow:inset 0 3px 5px rgba(var(--dca-black, var(--body-fg, #000)), 0.125) !important}form .form-row .filer-dropzone .filerFile a.filerClearer:active:hover,form .form-row .filer-dropzone .filerFile a.filerClearer:active:focus,form .form-row .filer-dropzone .filerFile a.filerClearer:active.focus,form .form-row .filer-dropzone .filerFile a.filerClearer.cms-btn-active:hover,form .form-row .filer-dropzone .filerFile a.filerClearer.cms-btn-active:focus,form .form-row .filer-dropzone .filerFile a.filerClearer.cms-btn-active.focus{color:var(--dca-gray-light, var(--button-fg, #999)) !important;background-color:var(--dca-white, var(--button-bg, #fff)) !important;border-color:var(--dca-gray-lighter, transparent) !important;filter:brightness(calc(var(--focus-brightness) * var(--active-brightness))) opacity(1) !important}form .form-row .filer-dropzone .filerFile a.filerClearer:active,form .form-row .filer-dropzone .filerFile a.filerClearer.cms-btn-active{background-image:none !important}form .form-row .filer-dropzone .filerFile a.filerClearer.cms-btn-disabled,form .form-row .filer-dropzone .filerFile a.filerClearer.cms-btn-disabled:hover,form .form-row .filer-dropzone .filerFile a.filerClearer.cms-btn-disabled:focus,form .form-row .filer-dropzone .filerFile a.filerClearer.cms-btn-disabled.focus,form .form-row .filer-dropzone .filerFile a.filerClearer.cms-btn-disabled:active,form .form-row .filer-dropzone .filerFile a.filerClearer.cms-btn-disabled.cms-btn-active,form .form-row .filer-dropzone .filerFile a.filerClearer[disabled],form .form-row .filer-dropzone .filerFile a.filerClearer[disabled]:hover,form .form-row .filer-dropzone .filerFile a.filerClearer[disabled]:focus,form .form-row .filer-dropzone .filerFile a.filerClearer[disabled].focus,form .form-row .filer-dropzone .filerFile a.filerClearer[disabled]:active,form .form-row .filer-dropzone .filerFile a.filerClearer[disabled].cms-btn-active{background-color:var(--dca-white, var(--button-bg, #fff)) !important;border-color:var(--dca-gray-lighter, transparent) !important;color:var(--dca-gray-light, var(--button-fg, #999)) true;filter:brightness(0.6) opacity(1);cursor:not-allowed;box-shadow:none !important}form .form-row .filer-dropzone .filerFile a.filerClearer.cms-btn-disabled:before,form .form-row .filer-dropzone .filerFile a.filerClearer.cms-btn-disabled:hover:before,form .form-row .filer-dropzone .filerFile a.filerClearer.cms-btn-disabled:focus:before,form .form-row .filer-dropzone .filerFile a.filerClearer.cms-btn-disabled.focus:before,form .form-row .filer-dropzone .filerFile a.filerClearer.cms-btn-disabled:active:before,form .form-row .filer-dropzone .filerFile a.filerClearer.cms-btn-disabled.cms-btn-active:before,form .form-row .filer-dropzone .filerFile a.filerClearer[disabled]:before,form .form-row .filer-dropzone .filerFile a.filerClearer[disabled]:hover:before,form .form-row .filer-dropzone .filerFile a.filerClearer[disabled]:focus:before,form .form-row .filer-dropzone .filerFile a.filerClearer[disabled].focus:before,form .form-row .filer-dropzone .filerFile a.filerClearer[disabled]:active:before,form .form-row .filer-dropzone .filerFile a.filerClearer[disabled].cms-btn-active:before{color:var(--dca-gray-light, var(--button-fg, #999)) true;filter:brightness(0.6) opacity(1)}form .form-row .filer-dropzone .filerFile a.filerClearer{float:right;padding:5px 0 !important;margin:24px 0 0 10px;width:36px;height:36px;text-align:center;cursor:pointer}form .form-row .filer-dropzone .filerFile a.filerClearer span:before{color:red !important}form .form-row .filer-dropzone .filerFile a.filerClearer span{text-align:center;line-height:24px}form .form-row .filer-dropzone.filer-dropzone-mobile .filerFile{text-align:center}form .form-row .filer-dropzone.filer-dropzone-mobile .dz-message{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;margin-top:75px}form .form-row .filer-dropzone.filer-dropzone-mobile.js-object-attached .filerFile{text-align:center}@media screen and (max-width: 810px){form .form-row .filer-dropzone.filer-dropzone-mobile.js-object-attached .filerFile.js-file-selector .description_text{text-overflow:ellipsis;width:calc(100% - 250px);overflow:hidden}}form .form-row .filer-dropzone.filer-dropzone-mobile.js-object-attached .filerFile.js-file-selector>span:not(.choose-file):not(.replace-file):not(.edit-file),form .form-row .filer-dropzone.filer-dropzone-mobile.js-object-attached .filerFile.js-file-selector .dz-name{width:calc(100% - 250px)}form .form-row .filer-dropzone.filer-dropzone-folder .filerFile{top:8px}form .form-row .filer-dropzone.filer-dropzone-folder .filerFile #id_folder_description_txt{float:left}@media(max-width: 767px){form .form-row .filer-dropzone{flex-grow:1}}.filer-dropzone{min-height:100px !important}.filer-dropzone .dz-upload{height:5px;background-color:var(--dca-primary, var(--primary, #0bf))}.filer-dropzone .dz-name{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;max-width:calc(100% - 145px)}.filer-dropzone .dz-thumbnail{display:inline-block;overflow:hidden;vertical-align:top;width:80px;height:80px;margin-right:10px;border:solid 1px var(--dca-gray-lighter, var(--border-color, #ddd));border-radius:3px;background:var(--dca-white, var(--body-bg, #fff)) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath fill='%232980b9' d='M5 2c-1.105 0-2 .9-2 2v18c0 1.1.895 2 2 2h14c1.105 0 2-.9 2-2V8l-6-6z'/%3E%3Cpath fill='%233498db' d='M5 1c-1.105 0-2 .9-2 2v18c0 1.1.895 2 2 2h14c1.105 0 2-.9 2-2V7l-6-6z'/%3E%3Cpath fill='%232980b9' d='m21 7-6-6v4c0 1.1.895 2 2 2z'/%3E%3C/svg%3E");background-size:contain}.filer-dropzone .dz-thumbnail img{background:var(--dca-white, var(--body-bg, #fff))}.filer-dropzone .dz-thumbnail img[src=""],.filer-dropzone .dz-thumbnail img:not([src]){width:104%;height:104%;margin:-2%}.filer-dropzone-info-message{position:fixed;bottom:35px;left:50%;z-index:2;text-align:center;width:270px;max-height:300px;overflow-y:auto;margin:-50px 0 0 -150px;padding:15px 15px 0;border-radius:var(--dca-btn-radius, 3px);background:var(--dca-white, var(--body-bg, #fff));box-shadow:0 0 5px 0 rgba(0,0,0,.2)}.filer-dropzone-info-message .icon{font-size:35px;color:var(--dca-primary, var(--primary, #0bf))}.filer-dropzone-info-message .text{margin:5px 0 10px}.filer-dropzone-upload-info{margin-top:10px}.filer-dropzone-upload-info .filer-dropzone-file-name{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.filer-dropzone-upload-info:empty{margin-top:0}.filer-dropzone-progress{height:5px;margin-top:5px;background-color:var(--dca-primary, var(--primary, #0bf))}.filer-dropzone-upload-welcome .folder{color:var(--dca-primary, var(--primary, #0bf));padding:10px 0 0;margin:0 -15px;border-top:solid 1px var(--dca-gray-lighter, var(--border-color, #ddd))}.filer-dropzone-upload-welcome .folder img,.filer-dropzone-upload-welcome .folder span{vertical-align:middle}.filer-dropzone-upload-welcome .folder img{margin-right:5px}.filer-dropzone-upload-welcome .folder .folder-inner{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding:0 10px}.filer-dropzone-cancel{padding-top:10px;border-top:solid 1px var(--dca-gray-lighter, var(--border-color, #ddd));margin:15px -15px 10px}.filer-dropzone-cancel a{font-size:12px;color:var(--dca-gray, var(--body-quiet-color, #666)) !important}.filer-dropzone-upload-success,.filer-dropzone-upload-canceled{margin:0 -15px 10px}.filer-dropzone-upload-count{padding-bottom:10px;margin:10px -15px;border-bottom:solid 1px var(--dca-gray-lighter, var(--border-color, #ddd))}.filer-tooltip-wrapper{position:relative}.filer-tooltip{position:absolute;left:-30px;right:-30px;color:var(--dca-gray, var(--body-quiet-color, #666));text-align:center;font-size:12px !important;line-height:15px !important;white-space:normal;margin-top:5px;padding:10px;background-color:var(--dca-white, var(--body-bg, #fff));box-shadow:0 0 10px rgba(0,0,0,.25);border-radius:5px;z-index:10;cursor:default}.filer-tooltip:before{position:absolute;top:-3px;left:50%;z-index:-1;content:"";width:9px;height:9px;margin-left:-5px;transform:rotate(45deg);background-color:var(--dca-white, var(--body-bg, #fff))}.disabled-btn-tooltip{display:none;outline:none}@keyframes passing-through{0%{opacity:0;transform:translateY(40px)}30%,70%{opacity:1;transform:translateY(0)}100%{opacity:0;transform:translateY(-40px)}}@keyframes slide-in{0%{opacity:0;transform:translateY(40px)}30%{opacity:1;transform:translateY(0)}}@keyframes pulse{0%{transform:scale(1)}10%{transform:scale(1.1)}20%{transform:scale(1)}}.filer-dropzone,.filer-dropzone *{box-sizing:border-box}.filer-dropzone{min-height:150px;padding:20px 20px;border:2px solid rgba(0,0,0,.3);background:#fff}.filer-dropzone.dz-clickable{cursor:pointer}.filer-dropzone.dz-clickable *{cursor:default}.filer-dropzone.dz-clickable .dz-message,.filer-dropzone.dz-clickable .dz-message *{cursor:pointer}.filer-dropzone.dz-drag-hover{border-style:solid}.filer-dropzone.dz-drag-hover .dz-message{opacity:.5}.filer-dropzone .dz-message{text-align:center;margin:2em 0}.filer-dropzone .dz-preview{display:inline-block;position:relative;vertical-align:top;min-height:100px;margin:16px}.filer-dropzone .dz-preview:hover{z-index:1000}.filer-dropzone .dz-preview:hover .dz-details{opacity:1}.filer-dropzone .dz-preview.dz-file-preview .dz-image{border-radius:20px;background:var(--dca-gray-light, var(--body-quiet-color, #999));background:linear-gradient(to bottom, var(--dca-gray-lightest, var(--darkened-bg, #f2f2f2)), var(--dca-gray-lighter, var(--border-color, #ddd)))}.filer-dropzone .dz-preview.dz-file-preview .dz-details{opacity:1}.filer-dropzone .dz-preview.dz-image-preview{background:#fff}.filer-dropzone .dz-preview.dz-image-preview .dz-details{transition:opacity .2s linear}.filer-dropzone .dz-preview .dz-remove{display:block;font-size:14px;text-align:center;border:none;cursor:pointer}.filer-dropzone .dz-preview .dz-remove:hover{text-decoration:underline}.filer-dropzone .dz-preview:hover .dz-details{opacity:1}.filer-dropzone .dz-preview .dz-details{position:absolute;top:0;left:0;z-index:20;color:rgba(0,0,0,.9);font-size:13px;line-height:150%;text-align:center;min-width:100%;max-width:100%;padding:2em 1em;opacity:0}.filer-dropzone .dz-preview .dz-details .dz-size{font-size:16px;margin-bottom:1em}.filer-dropzone .dz-preview .dz-details .dz-filename{white-space:nowrap}.filer-dropzone .dz-preview .dz-details .dz-filename:hover span{border:1px solid rgba(200,200,200,.8);background-color:hsla(0,0%,100%,.8)}.filer-dropzone .dz-preview .dz-details .dz-filename:not(:hover){overflow:hidden;text-overflow:ellipsis}.filer-dropzone .dz-preview .dz-details .dz-filename:not(:hover) span{border:1px solid rgba(0,0,0,0)}.filer-dropzone .dz-preview .dz-details .dz-filename span,.filer-dropzone .dz-preview .dz-details .dz-size span{padding:0 .4em;border-radius:3px;background-color:hsla(0,0%,100%,.4)}.filer-dropzone .dz-preview:hover .dz-image img{transform:scale(1.05, 1.05);filter:blur(8px)}.filer-dropzone .dz-preview .dz-image{display:block;position:relative;overflow:hidden;z-index:10;width:120px;height:120px;border-radius:20px}.filer-dropzone .dz-preview .dz-image img{display:block}.filer-dropzone .dz-preview.dz-success .dz-success-mark{animation:passing-through 3s cubic-bezier(0.77, 0, 0.175, 1)}.filer-dropzone .dz-preview.dz-error .dz-error-mark{opacity:1;animation:slide-in 3s cubic-bezier(0.77, 0, 0.175, 1)}.filer-dropzone .dz-preview .dz-success-mark,.filer-dropzone .dz-preview .dz-error-mark{display:block;position:absolute;top:50%;left:50%;z-index:500;margin-top:-27px;margin-left:-27px;pointer-events:none;opacity:0}.filer-dropzone .dz-preview .dz-success-mark svg,.filer-dropzone .dz-preview .dz-error-mark svg{display:block;width:54px;height:54px}.filer-dropzone .dz-preview.dz-processing .dz-progress{opacity:1;transition:all .2s linear}.filer-dropzone .dz-preview.dz-complete .dz-progress{opacity:0;transition:opacity .4s ease-in}.filer-dropzone .dz-preview:not(.dz-processing) .dz-progress{animation:pulse 6s ease infinite}.filer-dropzone .dz-preview .dz-progress{position:absolute;top:50%;left:50%;overflow:hidden;z-index:1000;width:80px;height:16px;margin-top:-8px;margin-left:-40px;border-radius:8px;pointer-events:none;opacity:1;background:hsla(0,0%,100%,.9)}.filer-dropzone .dz-preview .dz-progress .dz-upload{position:absolute;top:0;bottom:0;left:0;width:0;background:var(--dca-gray-darkest, var(--body-fg, #333));background:linear-gradient(to bottom, var(--dca-gray, var(--body-quiet-color, #666)), var(--dca-gray-darkest, var(--body-fg, #333)));transition:width 300ms ease-in-out}.filer-dropzone .dz-preview.dz-error .dz-error-message{display:block}.filer-dropzone .dz-preview.dz-error:hover .dz-error-message{pointer-events:auto;opacity:1}.filer-dropzone .dz-preview .dz-error-message{display:block;display:none;position:absolute;top:130px;left:-10px;z-index:1000;color:var(--dca-white, var(--body-bg, #fff));font-size:13px;width:140px;padding:.5em 1.2em;border-radius:8px;pointer-events:none;opacity:0;background:#be2626;background:linear-gradient(to bottom, #be2626, #a92222);transition:opacity .3s ease}.filer-dropzone .dz-preview .dz-error-message:after{content:"";position:absolute;top:-6px;left:64px;width:0;height:0;border-right:6px solid rgba(0,0,0,0);border-bottom:6px solid #be2626;border-left:6px solid rgba(0,0,0,0)} \ No newline at end of file diff --git a/filer/static/filer/css/admin_filer.fa.icons.css b/filer/static/filer/css/admin_filer.fa.icons.css new file mode 100644 index 000000000..aac2a4727 --- /dev/null +++ b/filer/static/filer/css/admin_filer.fa.icons.css @@ -0,0 +1,15 @@ +/*! + * Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +/*! + * Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa,.fab,.fad,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-bacteria:before{content:"\e059"}.fa-bacterium:before{content:"\e05a"}.fa-bahai:before{content:"\f666"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-box-tissue:before{content:"\e05b"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudflare:before{content:"\e07d"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-alt:before{content:"\f422"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cotton-bureau:before{content:"\f89e"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dailymotion:before{content:"\e052"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-deezer:before{content:"\e077"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-disease:before{content:"\f7fa"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edge-legacy:before{content:"\e078"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-alt:before{content:"\f424"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-faucet:before{content:"\e005"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\e007"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-pay:before{content:"\e079"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guilded:before{content:"\e07e"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-holding-water:before{content:"\f4c1"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-sparkles:before{content:"\e05d"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-hands-wash:before{content:"\e05e"}.fa-handshake:before{content:"\f2b5"}.fa-handshake-alt-slash:before{content:"\e05f"}.fa-handshake-slash:before{content:"\e060"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-hdd:before{content:"\f0a0"}.fa-head-side-cough:before{content:"\e061"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-head-side-mask:before{content:"\e063"}.fa-head-side-virus:before{content:"\e064"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hive:before{content:"\e07f"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hospital-user:before{content:"\f80d"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-house-user:before{content:"\e065"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-ideal:before{content:"\e013"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-innosoft:before{content:"\e080"}.fa-instagram:before{content:"\f16d"}.fa-instagram-square:before{content:"\e055"}.fa-instalod:before{content:"\e081"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-house:before{content:"\e066"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lungs:before{content:"\f604"}.fa-lungs-virus:before{content:"\e067"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microblog:before{content:"\e01a"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\e056"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse:before{content:"\f8cc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-octopus-deploy:before{content:"\e082"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-arrows:before{content:"\e068"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-perbyte:before{content:"\e083"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-square:before{content:"\e01e"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-plane-slash:before{content:"\e069"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pump-medical:before{content:"\e06a"}.fa-pump-soap:before{content:"\e06b"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-rust:before{content:"\e07a"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-shield-virus:before{content:"\e06c"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopify:before{content:"\e057"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sink:before{content:"\e06d"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-soap:before{content:"\e06e"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-stopwatch-20:before{content:"\e06f"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-store-alt-slash:before{content:"\e070"}.fa-store-slash:before{content:"\e071"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swift:before{content:"\f8e1"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-tiktok:before{content:"\e07b"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\e041"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-uncharted:before{content:"\e084"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\e049"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-unsplash:before{content:"\e07c"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-users-slash:before{content:"\e073"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-vest:before{content:"\e085"}.fa-vest-patches:before{content:"\e086"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-virus:before{content:"\e074"}.fa-virus-slash:before{content:"\e075"}.fa-viruses:before{content:"\e076"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-watchman-monitoring:before{content:"\e087"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wodu:before{content:"\e088"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../fonts/fa-brands-400.eot);src:url(../fonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-brands-400.woff2) format("woff2"),url(../fonts/fa-brands-400.woff) format("woff"),url(../fonts/fa-brands-400.ttf) format("truetype"),url(../fonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:block;src:url(../fonts/fa-regular-400.eot);src:url(../fonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-regular-400.woff2) format("woff2"),url(../fonts/fa-regular-400.woff) format("woff"),url(../fonts/fa-regular-400.ttf) format("truetype"),url(../fonts/fa-regular-400.svg#fontawesome) format("svg")}.fab,.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:block;src:url(../fonts/fa-solid-900.eot);src:url(../fonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-solid-900.woff2) format("woff2"),url(../fonts/fa-solid-900.woff) format("woff"),url(../fonts/fa-solid-900.ttf) format("truetype"),url(../fonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900} +/* FA4 backward compatibility shims */ +/*! + * Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa.fa-glass:before{content:"\f000"}.fa.fa-meetup{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-star-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-o:before{content:"\f005"}.fa.fa-close:before,.fa.fa-remove:before{content:"\f00d"}.fa.fa-gear:before{content:"\f013"}.fa.fa-trash-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-trash-o:before{content:"\f2ed"}.fa.fa-file-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-o:before{content:"\f15b"}.fa.fa-clock-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-clock-o:before{content:"\f017"}.fa.fa-arrow-circle-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-down:before{content:"\f358"}.fa.fa-arrow-circle-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-up:before{content:"\f35b"}.fa.fa-play-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-play-circle-o:before{content:"\f144"}.fa.fa-repeat:before,.fa.fa-rotate-right:before{content:"\f01e"}.fa.fa-refresh:before{content:"\f021"}.fa.fa-list-alt{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-dedent:before{content:"\f03b"}.fa.fa-video-camera:before{content:"\f03d"}.fa.fa-picture-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-picture-o:before{content:"\f03e"}.fa.fa-photo{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-photo:before{content:"\f03e"}.fa.fa-image{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-image:before{content:"\f03e"}.fa.fa-pencil:before{content:"\f303"}.fa.fa-map-marker:before{content:"\f3c5"}.fa.fa-pencil-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-pencil-square-o:before{content:"\f044"}.fa.fa-share-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-share-square-o:before{content:"\f14d"}.fa.fa-check-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-check-square-o:before{content:"\f14a"}.fa.fa-arrows:before{content:"\f0b2"}.fa.fa-times-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-times-circle-o:before{content:"\f057"}.fa.fa-check-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-check-circle-o:before{content:"\f058"}.fa.fa-mail-forward:before{content:"\f064"}.fa.fa-expand:before{content:"\f424"}.fa.fa-compress:before{content:"\f422"}.fa.fa-eye,.fa.fa-eye-slash{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-warning:before{content:"\f071"}.fa.fa-calendar:before{content:"\f073"}.fa.fa-arrows-v:before{content:"\f338"}.fa.fa-arrows-h:before{content:"\f337"}.fa.fa-bar-chart{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bar-chart:before{content:"\f080"}.fa.fa-bar-chart-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bar-chart-o:before{content:"\f080"}.fa.fa-facebook-square,.fa.fa-twitter-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-gears:before{content:"\f085"}.fa.fa-thumbs-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-thumbs-o-up:before{content:"\f164"}.fa.fa-thumbs-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-thumbs-o-down:before{content:"\f165"}.fa.fa-heart-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-heart-o:before{content:"\f004"}.fa.fa-sign-out:before{content:"\f2f5"}.fa.fa-linkedin-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-linkedin-square:before{content:"\f08c"}.fa.fa-thumb-tack:before{content:"\f08d"}.fa.fa-external-link:before{content:"\f35d"}.fa.fa-sign-in:before{content:"\f2f6"}.fa.fa-github-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-lemon-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-lemon-o:before{content:"\f094"}.fa.fa-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-square-o:before{content:"\f0c8"}.fa.fa-bookmark-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bookmark-o:before{content:"\f02e"}.fa.fa-facebook,.fa.fa-twitter{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-facebook:before{content:"\f39e"}.fa.fa-facebook-f{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-facebook-f:before{content:"\f39e"}.fa.fa-github{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-credit-card{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-feed:before{content:"\f09e"}.fa.fa-hdd-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hdd-o:before{content:"\f0a0"}.fa.fa-hand-o-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-right:before{content:"\f0a4"}.fa.fa-hand-o-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-left:before{content:"\f0a5"}.fa.fa-hand-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-up:before{content:"\f0a6"}.fa.fa-hand-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-down:before{content:"\f0a7"}.fa.fa-arrows-alt:before{content:"\f31e"}.fa.fa-group:before{content:"\f0c0"}.fa.fa-chain:before{content:"\f0c1"}.fa.fa-scissors:before{content:"\f0c4"}.fa.fa-files-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-files-o:before{content:"\f0c5"}.fa.fa-floppy-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-floppy-o:before{content:"\f0c7"}.fa.fa-navicon:before,.fa.fa-reorder:before{content:"\f0c9"}.fa.fa-google-plus,.fa.fa-google-plus-square,.fa.fa-pinterest,.fa.fa-pinterest-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-google-plus:before{content:"\f0d5"}.fa.fa-money{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-money:before{content:"\f3d1"}.fa.fa-unsorted:before{content:"\f0dc"}.fa.fa-sort-desc:before{content:"\f0dd"}.fa.fa-sort-asc:before{content:"\f0de"}.fa.fa-linkedin{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-linkedin:before{content:"\f0e1"}.fa.fa-rotate-left:before{content:"\f0e2"}.fa.fa-legal:before{content:"\f0e3"}.fa.fa-dashboard:before,.fa.fa-tachometer:before{content:"\f3fd"}.fa.fa-comment-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-comment-o:before{content:"\f075"}.fa.fa-comments-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-comments-o:before{content:"\f086"}.fa.fa-flash:before{content:"\f0e7"}.fa.fa-clipboard,.fa.fa-paste{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-paste:before{content:"\f328"}.fa.fa-lightbulb-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-lightbulb-o:before{content:"\f0eb"}.fa.fa-exchange:before{content:"\f362"}.fa.fa-cloud-download:before{content:"\f381"}.fa.fa-cloud-upload:before{content:"\f382"}.fa.fa-bell-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bell-o:before{content:"\f0f3"}.fa.fa-cutlery:before{content:"\f2e7"}.fa.fa-file-text-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-text-o:before{content:"\f15c"}.fa.fa-building-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-building-o:before{content:"\f1ad"}.fa.fa-hospital-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hospital-o:before{content:"\f0f8"}.fa.fa-tablet:before{content:"\f3fa"}.fa.fa-mobile-phone:before,.fa.fa-mobile:before{content:"\f3cd"}.fa.fa-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-circle-o:before{content:"\f111"}.fa.fa-mail-reply:before{content:"\f3e5"}.fa.fa-github-alt{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-folder-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-folder-o:before{content:"\f07b"}.fa.fa-folder-open-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-folder-open-o:before{content:"\f07c"}.fa.fa-smile-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-smile-o:before{content:"\f118"}.fa.fa-frown-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-frown-o:before{content:"\f119"}.fa.fa-meh-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-meh-o:before{content:"\f11a"}.fa.fa-keyboard-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-keyboard-o:before{content:"\f11c"}.fa.fa-flag-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-flag-o:before{content:"\f024"}.fa.fa-mail-reply-all:before{content:"\f122"}.fa.fa-star-half-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-half-o:before{content:"\f089"}.fa.fa-star-half-empty{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-half-empty:before{content:"\f089"}.fa.fa-star-half-full{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-half-full:before{content:"\f089"}.fa.fa-code-fork:before{content:"\f126"}.fa.fa-chain-broken:before{content:"\f127"}.fa.fa-shield:before{content:"\f3ed"}.fa.fa-calendar-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-o:before{content:"\f133"}.fa.fa-css3,.fa.fa-html5,.fa.fa-maxcdn{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-ticket:before{content:"\f3ff"}.fa.fa-minus-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-minus-square-o:before{content:"\f146"}.fa.fa-level-up:before{content:"\f3bf"}.fa.fa-level-down:before{content:"\f3be"}.fa.fa-pencil-square:before{content:"\f14b"}.fa.fa-external-link-square:before{content:"\f360"}.fa.fa-compass{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-down:before{content:"\f150"}.fa.fa-toggle-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-down:before{content:"\f150"}.fa.fa-caret-square-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-up:before{content:"\f151"}.fa.fa-toggle-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-up:before{content:"\f151"}.fa.fa-caret-square-o-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-right:before{content:"\f152"}.fa.fa-toggle-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-right:before{content:"\f152"}.fa.fa-eur:before,.fa.fa-euro:before{content:"\f153"}.fa.fa-gbp:before{content:"\f154"}.fa.fa-dollar:before,.fa.fa-usd:before{content:"\f155"}.fa.fa-inr:before,.fa.fa-rupee:before{content:"\f156"}.fa.fa-cny:before,.fa.fa-jpy:before,.fa.fa-rmb:before,.fa.fa-yen:before{content:"\f157"}.fa.fa-rouble:before,.fa.fa-rub:before,.fa.fa-ruble:before{content:"\f158"}.fa.fa-krw:before,.fa.fa-won:before{content:"\f159"}.fa.fa-bitcoin,.fa.fa-btc{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bitcoin:before{content:"\f15a"}.fa.fa-file-text:before{content:"\f15c"}.fa.fa-sort-alpha-asc:before{content:"\f15d"}.fa.fa-sort-alpha-desc:before{content:"\f881"}.fa.fa-sort-amount-asc:before{content:"\f160"}.fa.fa-sort-amount-desc:before{content:"\f884"}.fa.fa-sort-numeric-asc:before{content:"\f162"}.fa.fa-sort-numeric-desc:before{content:"\f886"}.fa.fa-xing,.fa.fa-xing-square,.fa.fa-youtube,.fa.fa-youtube-play,.fa.fa-youtube-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-youtube-play:before{content:"\f167"}.fa.fa-adn,.fa.fa-bitbucket,.fa.fa-bitbucket-square,.fa.fa-dropbox,.fa.fa-flickr,.fa.fa-instagram,.fa.fa-stack-overflow{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bitbucket-square:before{content:"\f171"}.fa.fa-tumblr,.fa.fa-tumblr-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-long-arrow-down:before{content:"\f309"}.fa.fa-long-arrow-up:before{content:"\f30c"}.fa.fa-long-arrow-left:before{content:"\f30a"}.fa.fa-long-arrow-right:before{content:"\f30b"}.fa.fa-android,.fa.fa-apple,.fa.fa-dribbble,.fa.fa-foursquare,.fa.fa-gittip,.fa.fa-gratipay,.fa.fa-linux,.fa.fa-skype,.fa.fa-trello,.fa.fa-windows{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-gittip:before{content:"\f184"}.fa.fa-sun-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-sun-o:before{content:"\f185"}.fa.fa-moon-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-moon-o:before{content:"\f186"}.fa.fa-pagelines,.fa.fa-renren,.fa.fa-stack-exchange,.fa.fa-vk,.fa.fa-weibo{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-arrow-circle-o-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-right:before{content:"\f35a"}.fa.fa-arrow-circle-o-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-left:before{content:"\f359"}.fa.fa-caret-square-o-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-left:before{content:"\f191"}.fa.fa-toggle-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-left:before{content:"\f191"}.fa.fa-dot-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-dot-circle-o:before{content:"\f192"}.fa.fa-vimeo-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-try:before,.fa.fa-turkish-lira:before{content:"\f195"}.fa.fa-plus-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-plus-square-o:before{content:"\f0fe"}.fa.fa-openid,.fa.fa-slack,.fa.fa-wordpress{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bank:before,.fa.fa-institution:before{content:"\f19c"}.fa.fa-mortar-board:before{content:"\f19d"}.fa.fa-delicious,.fa.fa-digg,.fa.fa-drupal,.fa.fa-google,.fa.fa-joomla,.fa.fa-pied-piper-alt,.fa.fa-pied-piper-pp,.fa.fa-reddit,.fa.fa-reddit-square,.fa.fa-stumbleupon,.fa.fa-stumbleupon-circle,.fa.fa-yahoo{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-spoon:before{content:"\f2e5"}.fa.fa-behance,.fa.fa-behance-square,.fa.fa-steam,.fa.fa-steam-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-automobile:before{content:"\f1b9"}.fa.fa-envelope-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-envelope-o:before{content:"\f0e0"}.fa.fa-deviantart,.fa.fa-soundcloud,.fa.fa-spotify{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-file-pdf-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-pdf-o:before{content:"\f1c1"}.fa.fa-file-word-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-word-o:before{content:"\f1c2"}.fa.fa-file-excel-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-excel-o:before{content:"\f1c3"}.fa.fa-file-powerpoint-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-powerpoint-o:before{content:"\f1c4"}.fa.fa-file-image-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-image-o:before{content:"\f1c5"}.fa.fa-file-photo-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-photo-o:before{content:"\f1c5"}.fa.fa-file-picture-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-picture-o:before{content:"\f1c5"}.fa.fa-file-archive-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-archive-o:before{content:"\f1c6"}.fa.fa-file-zip-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-zip-o:before{content:"\f1c6"}.fa.fa-file-audio-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-audio-o:before{content:"\f1c7"}.fa.fa-file-sound-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-sound-o:before{content:"\f1c7"}.fa.fa-file-video-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-video-o:before{content:"\f1c8"}.fa.fa-file-movie-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-movie-o:before{content:"\f1c8"}.fa.fa-file-code-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-code-o:before{content:"\f1c9"}.fa.fa-codepen,.fa.fa-jsfiddle,.fa.fa-vine{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-life-bouy,.fa.fa-life-ring{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-life-bouy:before{content:"\f1cd"}.fa.fa-life-buoy{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-life-buoy:before{content:"\f1cd"}.fa.fa-life-saver{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-life-saver:before{content:"\f1cd"}.fa.fa-support{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-support:before{content:"\f1cd"}.fa.fa-circle-o-notch:before{content:"\f1ce"}.fa.fa-ra,.fa.fa-rebel{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-ra:before{content:"\f1d0"}.fa.fa-resistance{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-resistance:before{content:"\f1d0"}.fa.fa-empire,.fa.fa-ge{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-ge:before{content:"\f1d1"}.fa.fa-git,.fa.fa-git-square,.fa.fa-hacker-news,.fa.fa-y-combinator-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-y-combinator-square:before{content:"\f1d4"}.fa.fa-yc-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-yc-square:before{content:"\f1d4"}.fa.fa-qq,.fa.fa-tencent-weibo,.fa.fa-wechat,.fa.fa-weixin{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-wechat:before{content:"\f1d7"}.fa.fa-send:before{content:"\f1d8"}.fa.fa-paper-plane-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-paper-plane-o:before{content:"\f1d8"}.fa.fa-send-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-send-o:before{content:"\f1d8"}.fa.fa-circle-thin{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-circle-thin:before{content:"\f111"}.fa.fa-header:before{content:"\f1dc"}.fa.fa-sliders:before{content:"\f1de"}.fa.fa-futbol-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-futbol-o:before{content:"\f1e3"}.fa.fa-soccer-ball-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-soccer-ball-o:before{content:"\f1e3"}.fa.fa-slideshare,.fa.fa-twitch,.fa.fa-yelp{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-newspaper-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-newspaper-o:before{content:"\f1ea"}.fa.fa-cc-amex,.fa.fa-cc-discover,.fa.fa-cc-mastercard,.fa.fa-cc-paypal,.fa.fa-cc-stripe,.fa.fa-cc-visa,.fa.fa-google-wallet,.fa.fa-paypal{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bell-slash-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bell-slash-o:before{content:"\f1f6"}.fa.fa-trash:before{content:"\f2ed"}.fa.fa-copyright{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-eyedropper:before{content:"\f1fb"}.fa.fa-area-chart:before{content:"\f1fe"}.fa.fa-pie-chart:before{content:"\f200"}.fa.fa-line-chart:before{content:"\f201"}.fa.fa-angellist,.fa.fa-ioxhost,.fa.fa-lastfm,.fa.fa-lastfm-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-cc{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-cc:before{content:"\f20a"}.fa.fa-ils:before,.fa.fa-shekel:before,.fa.fa-sheqel:before{content:"\f20b"}.fa.fa-meanpath{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-meanpath:before{content:"\f2b4"}.fa.fa-buysellads,.fa.fa-connectdevelop,.fa.fa-dashcube,.fa.fa-forumbee,.fa.fa-leanpub,.fa.fa-sellsy,.fa.fa-shirtsinbulk,.fa.fa-simplybuilt,.fa.fa-skyatlas{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-diamond{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-diamond:before{content:"\f3a5"}.fa.fa-intersex:before{content:"\f224"}.fa.fa-facebook-official{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-facebook-official:before{content:"\f09a"}.fa.fa-pinterest-p,.fa.fa-whatsapp{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-hotel:before{content:"\f236"}.fa.fa-medium,.fa.fa-viacoin,.fa.fa-y-combinator,.fa.fa-yc{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-yc:before{content:"\f23b"}.fa.fa-expeditedssl,.fa.fa-opencart,.fa.fa-optin-monster{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-battery-4:before,.fa.fa-battery:before{content:"\f240"}.fa.fa-battery-3:before{content:"\f241"}.fa.fa-battery-2:before{content:"\f242"}.fa.fa-battery-1:before{content:"\f243"}.fa.fa-battery-0:before{content:"\f244"}.fa.fa-object-group,.fa.fa-object-ungroup,.fa.fa-sticky-note-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-sticky-note-o:before{content:"\f249"}.fa.fa-cc-diners-club,.fa.fa-cc-jcb{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-clone,.fa.fa-hourglass-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hourglass-o:before{content:"\f254"}.fa.fa-hourglass-1:before{content:"\f251"}.fa.fa-hourglass-2:before{content:"\f252"}.fa.fa-hourglass-3:before{content:"\f253"}.fa.fa-hand-rock-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-rock-o:before{content:"\f255"}.fa.fa-hand-grab-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-grab-o:before{content:"\f255"}.fa.fa-hand-paper-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-paper-o:before{content:"\f256"}.fa.fa-hand-stop-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-stop-o:before{content:"\f256"}.fa.fa-hand-scissors-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-scissors-o:before{content:"\f257"}.fa.fa-hand-lizard-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-lizard-o:before{content:"\f258"}.fa.fa-hand-spock-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-spock-o:before{content:"\f259"}.fa.fa-hand-pointer-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-pointer-o:before{content:"\f25a"}.fa.fa-hand-peace-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-peace-o:before{content:"\f25b"}.fa.fa-registered{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-chrome,.fa.fa-creative-commons,.fa.fa-firefox,.fa.fa-get-pocket,.fa.fa-gg,.fa.fa-gg-circle,.fa.fa-internet-explorer,.fa.fa-odnoklassniki,.fa.fa-odnoklassniki-square,.fa.fa-opera,.fa.fa-safari,.fa.fa-tripadvisor,.fa.fa-wikipedia-w{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-television:before{content:"\f26c"}.fa.fa-500px,.fa.fa-amazon,.fa.fa-contao{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-calendar-plus-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-plus-o:before{content:"\f271"}.fa.fa-calendar-minus-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-minus-o:before{content:"\f272"}.fa.fa-calendar-times-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-times-o:before{content:"\f273"}.fa.fa-calendar-check-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-check-o:before{content:"\f274"}.fa.fa-map-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-map-o:before{content:"\f279"}.fa.fa-commenting:before{content:"\f4ad"}.fa.fa-commenting-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-commenting-o:before{content:"\f4ad"}.fa.fa-houzz,.fa.fa-vimeo{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-vimeo:before{content:"\f27d"}.fa.fa-black-tie,.fa.fa-edge,.fa.fa-fonticons,.fa.fa-reddit-alien{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-credit-card-alt:before{content:"\f09d"}.fa.fa-codiepie,.fa.fa-fort-awesome,.fa.fa-mixcloud,.fa.fa-modx,.fa.fa-product-hunt,.fa.fa-scribd,.fa.fa-usb{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-pause-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-pause-circle-o:before{content:"\f28b"}.fa.fa-stop-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-stop-circle-o:before{content:"\f28d"}.fa.fa-bluetooth,.fa.fa-bluetooth-b,.fa.fa-envira,.fa.fa-gitlab,.fa.fa-wheelchair-alt,.fa.fa-wpbeginner,.fa.fa-wpforms{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-wheelchair-alt:before{content:"\f368"}.fa.fa-question-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-question-circle-o:before{content:"\f059"}.fa.fa-volume-control-phone:before{content:"\f2a0"}.fa.fa-asl-interpreting:before{content:"\f2a3"}.fa.fa-deafness:before,.fa.fa-hard-of-hearing:before{content:"\f2a4"}.fa.fa-glide,.fa.fa-glide-g{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-signing:before{content:"\f2a7"}.fa.fa-first-order,.fa.fa-google-plus-official,.fa.fa-pied-piper,.fa.fa-snapchat,.fa.fa-snapchat-ghost,.fa.fa-snapchat-square,.fa.fa-themeisle,.fa.fa-viadeo,.fa.fa-viadeo-square,.fa.fa-yoast{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-google-plus-official:before{content:"\f2b3"}.fa.fa-google-plus-circle{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-google-plus-circle:before{content:"\f2b3"}.fa.fa-fa,.fa.fa-font-awesome{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-fa:before{content:"\f2b4"}.fa.fa-handshake-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-handshake-o:before{content:"\f2b5"}.fa.fa-envelope-open-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-envelope-open-o:before{content:"\f2b6"}.fa.fa-linode{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-address-book-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-address-book-o:before{content:"\f2b9"}.fa.fa-vcard:before{content:"\f2bb"}.fa.fa-address-card-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-address-card-o:before{content:"\f2bb"}.fa.fa-vcard-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-vcard-o:before{content:"\f2bb"}.fa.fa-user-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-user-circle-o:before{content:"\f2bd"}.fa.fa-user-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-user-o:before{content:"\f007"}.fa.fa-id-badge{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-drivers-license:before{content:"\f2c2"}.fa.fa-id-card-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-id-card-o:before{content:"\f2c2"}.fa.fa-drivers-license-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-drivers-license-o:before{content:"\f2c2"}.fa.fa-free-code-camp,.fa.fa-quora,.fa.fa-telegram{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-thermometer-4:before,.fa.fa-thermometer:before{content:"\f2c7"}.fa.fa-thermometer-3:before{content:"\f2c8"}.fa.fa-thermometer-2:before{content:"\f2c9"}.fa.fa-thermometer-1:before{content:"\f2ca"}.fa.fa-thermometer-0:before{content:"\f2cb"}.fa.fa-bathtub:before,.fa.fa-s15:before{content:"\f2cd"}.fa.fa-window-maximize,.fa.fa-window-restore{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-times-rectangle:before{content:"\f410"}.fa.fa-window-close-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-window-close-o:before{content:"\f410"}.fa.fa-times-rectangle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-times-rectangle-o:before{content:"\f410"}.fa.fa-bandcamp,.fa.fa-eercast,.fa.fa-etsy,.fa.fa-grav,.fa.fa-imdb,.fa.fa-ravelry{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-eercast:before{content:"\f2da"}.fa.fa-snowflake-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-snowflake-o:before{content:"\f2dc"}.fa.fa-superpowers,.fa.fa-wpexplorer{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-cab:before{content:"\f1ba"} \ No newline at end of file diff --git a/filer/static/filer/css/admin_folderpermissions.css b/filer/static/filer/css/admin_folderpermissions.css new file mode 100644 index 000000000..7741fdc6f --- /dev/null +++ b/filer/static/filer/css/admin_folderpermissions.css @@ -0,0 +1,6 @@ +#id_folder { + width: calc(100% - 25px); +} +.field-folder .select2 { + min-width: 240px; +} diff --git a/filer/static/filer/css/maps/admin_filer.cms.icons.css.map b/filer/static/filer/css/maps/admin_filer.cms.icons.css.map new file mode 100644 index 000000000..ed4f8531f --- /dev/null +++ b/filer/static/filer/css/maps/admin_filer.cms.icons.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["components/_iconography.scss"],"names":[],"mappings":"AAIA,WACI,mCAAA,CACA,qDAAA,CACA,0WAAA,CAKA,kBAAA,CACA,iBAAA,CAGJ,YACI,oBAAA,CACA,iCAAA,CACA,iBAAA,CACA,mBAAA,CACA,aAAA,CACA,yBAAA,CACA,kCAAA,CACA,iCAAA,CAqDA,8BACI,eAAA,CADJ,8BACI,eAAA,CADJ,iCACI,eAAA,CADJ,4BACI,eAAA,CADJ,0BACI,eAAA,CADJ,wBACI,eAAA,CADJ,kCACI,eAAA,CADJ,2BACI,eAAA,CADJ,oCACI,eAAA,CADJ,0BACI,eAAA,CADJ,4BACI,eAAA,CADJ,2BACI,eAAA,CADJ,0BACI,eAAA","file":"../admin_filer.cms.icons.css","sourcesContent":["//######################################################################################################################\n// #ICONOGRAPHY#\n\n// default font file generated by gulp\n@font-face {\n font-family: \"django-filer-iconfont\";\n src: url(\"../fonts/django-filer-iconfont.eot?v=3.2.0\");\n src: url(\"../fonts/django-filer-iconfont.eot?v=3.2.0#iefix\") format(\"eot\"),\n url(\"../fonts/django-filer-iconfont.woff2?v=3.2.0\") format(\"woff2\"),\n url(\"../fonts/django-filer-iconfont.woff?v=3.2.0\") format(\"woff\"),\n url(\"../fonts/django-filer-iconfont.ttf?v=3.2.0\") format(\"truetype\"),\n url(\"../fonts/django-filer-iconfont.svg?v=3.2.0#django-filer-iconfont\") format(\"svg\");\n font-weight: normal;\n font-style: normal;\n}\n\n%icon {\n display: inline-block;\n font-family: django-filer-iconfont;\n font-size: inherit;\n text-rendering: auto;\n line-height: 1;\n transform: translate(0, 0);\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n@function icon-char($filename) {\n $char: \"\";\n\n @if $filename == arrow-down {\n $char: \"E001\";\n }\n @if $filename == caret-down {\n $char: \"E002\";\n }\n @if $filename == chevron-right {\n $char: \"E003\";\n }\n @if $filename == download {\n $char: \"E004\";\n }\n @if $filename == expand {\n $char: \"E005\";\n }\n @if $filename == link {\n $char: \"E006\";\n }\n @if $filename == move-to-folder {\n $char: \"E007\";\n }\n @if $filename == picture {\n $char: \"E008\";\n }\n @if $filename == remove-selection {\n $char: \"E009\";\n }\n @if $filename == select {\n $char: \"E00A\";\n }\n @if $filename == th-large {\n $char: \"E00B\";\n }\n @if $filename == th-list {\n $char: \"E00C\";\n }\n @if $filename == upload {\n $char: \"E00D\";\n }\n\n @return $char;\n}\n\n.filer-icon {\n @extend %icon;\n}\n@mixin icon($filename, $insert: before) {\n &:#{$insert} {\n content: #{\"\\\"\\\\\"}#{icon-char($filename) + \"\\\"\"};\n }\n}\n\n// #####################################################################################################################\n// #ICONS:start#\n// use unicode characters for accessibility reasons and use aria-hidden=\"true\" for decorative icons\n// DOCS: http://filamentgroup.com/lab/bulletproof_icon_fonts.html\n\n.filer-icon-arrow-down {\n @include icon(arrow-down);\n}\n\n.filer-icon-caret-down {\n @include icon(caret-down);\n}\n\n.filer-icon-chevron-right {\n @include icon(chevron-right);\n}\n\n.filer-icon-download {\n @include icon(download);\n}\n\n.filer-icon-expand {\n @include icon(expand);\n}\n\n.filer-icon-link {\n @include icon(link);\n}\n\n.filer-icon-move-to-folder {\n @include icon(move-to-folder);\n}\n\n.filer-icon-picture {\n @include icon(picture);\n}\n\n.filer-icon-remove-selection {\n @include icon(remove-selection);\n}\n\n.filer-icon-select {\n @include icon(select);\n}\n\n.filer-icon-th-large {\n @include icon(th-large);\n}\n\n.filer-icon-th-list {\n @include icon(th-list);\n}\n\n.filer-icon-upload {\n @include icon(upload);\n}\n"]} \ No newline at end of file diff --git a/filer/static/filer/css/maps/admin_filer.css.map b/filer/static/filer/css/maps/admin_filer.css.map new file mode 100644 index 000000000..39887dc9b --- /dev/null +++ b/filer/static/filer/css/maps/admin_filer.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["admin_filer.scss","components/_base.scss","settings/_custom.scss","components/_image-info.scss","mixins/_custom.scss","components/_action-list.scss","components/_filter-files.scss","components/_navigator.scss","components/_modal.scss","components/_drag-and-drop.scss","components/_tooltip.scss","libs/_dropzone.scss"],"names":[],"mappings":"AAAA;;EAAA,CCGA,UAEI,eAAA,CACA,sBAAA,CAGJ,WACI,eAAA,CAEJ,YACI,gBAAA,CAEJ,gBACI,UAAA,CACA,aAAA,CACA,UAAA,CAEJ,wBACI,qBAAA,CAEJ,uBACI,uBAAA,CAIJ,MACI,yBAAA,CACA,qEAAA,CAGJ,WACI,iBAAA,CAEA,cCLc,CDMd,qEAAA,CACA,iBAAA,CACA,kBAAA,CACA,gBAAA,CACA,mBAAA,CACA,qBAAA,CACA,iDCrCI,CDsCJ,gBAEI,cCfU,CDgBV,qEAAA,CAEJ,oBACI,WAAA,CAIR,yBACI,YAAA,CAEJ,uBACI,YAAA,CAKQ,iJAEI,wBAAA,CACA,yBAAA,CAEJ,yDACI,iBAAA,CACA,4BAAA,CAIZ,wBACI,cAAA,CACA,iCACI,SAAA,CACA,mCAAA,CAEJ,yGAEI,yBAAA,CAGR,8BACI,iBAAA,CACA,OAAA,CAGJ,gBACI,YAAA,CAEJ,2BACI,uDCxFA,CD4FR,cACI,UAAA,CAGJ,wBAEI,oBAAA,CACA,oBAAA,CAGJ,kBACI,YAAA,CACA,YAAA,CAEJ,aACI,WAAA,CACA,YAAA,CAGJ,iBACI,UAAA,CACA,gBAAA,CAGJ,kBACI,sBAAA,CACA,8BAAA,CACA,iBAAA,CAGJ,SACI,iBAAA,CACA,SAAA,CACA,UAAA,CACA,WAAA,CACA,SAAA,CACA,eAAA,CACA,qBAAA,CACA,QAAA,CAGJ,QACI,uBAAA,CAGJ,gBACI,eAAA,CACA,yBAAA,CACA,iBAAA,CACA,uCAAA,CACA,uDC9II,CDiJR,8FAGI,cAAA,CACA,aAAA,CACA,YAAA,CAGJ,yBACI,uBAAA,CE7JJ,YACI,iBAAA,CACA,WAAA,CACA,qBAAA,CACA,SAAA,CACA,YAAA,CACA,QAAA,CACA,iBAAA,CACA,iDDLI,CCMJ,mCAAA,CACA,qDAEI,QAAA,CACA,SAAA,CACA,iFACI,aAAA,CACA,cAAA,CAEJ,2DACI,oBAAA,CAEJ,yDACI,cAAA,CAGR,8BAEI,eAAA,CACA,UAAA,CACA,UAAA,CACA,kBAAA,CACA,YAAA,CACA,eAAA,CC9BJ,yEAEI,WAAA,CACA,aAAA,CAEJ,oCACI,UAAA,CD0BA,0DACI,eAAA,CACA,iBAAA,CACA,8BAAA,CACA,iEACI,YAAA,CAGR,kDACI,UAAA,CAEJ,mDACI,UAAA,CACA,gBAAA,CAEJ,yFAEI,YAAA,CACA,mBAAA,CACA,qHACI,eAAA,CACA,kBAAA,CACA,SAAA,CAEJ,+FACI,UAAA,CACA,0DD3CE,CC4CF,cAAA,CAEA,2BAAA,CACA,kBAAA,CAEA,YAAA,CAEJ,+FACI,oDDvDE,CCwDF,cAAA,CAEA,2BAAA,CACA,iBAAA,CAEA,iBAAA,CAEJ,qGACI,cAAA,CACA,iBAAA,CACA,mHACI,cAAA,CAGR,+FACI,oDDvEE,CCwEF,yBAAA,CACA,6BAAA,CACA,wBAAA,CACA,mBAAA,CAEJ,6FACI,SAAA,CAGR,gDACI,eAAA,CACA,oDDnFM,CCoFN,kBAAA,CACA,sBAAA,CACA,eAAA,CACA,sDACI,UAAA,CACA,gBAAA,CAGR,uDACI,eAAA,CACA,eAAA,CACA,SAAA,CACA,2DACI,kBAAA,CAIJ,kDACI,cAAA,CACA,6DACI,UAAA,CAKhB,qCA3HJ,YA4HQ,UAAA,CACA,UAAA,CAEI,qGAEI,UAAA,CACA,aAAA,CAAA,CAMhB,kBACI,iBAAA,CACA,SAAA,CACA,UAAA,CACA,cAAA,CACA,cAAA,CAGJ,kBACI,gBAAA,CACA,0EAAA,CACA,oBACI,eAAA,CAIR,yBACI,iBAAA,CACA,aAAA,CACA,cAAA,CACA,wCACI,oBAAA,CACA,iBAAA,CACA,kBAAA,CACA,uEAAA,CACA,8HAAA,CACA,4CACI,aAAA,CAGR,8CACI,iBAAA,CACA,KAAA,CACA,OAAA,CACA,QAAA,CACA,MAAA,CACA,eAAA,CAEJ,+CACI,iBAAA,CACA,SAAA,CACA,UAAA,CACA,WAAA,CACA,oBAAA,CACA,YAAA,CACA,kBAAA,CACA,WAAA,CACA,6BAAA,CAEJ,8DACI,kBAAA,CACA,0EACI,YAAA,CAKZ,sBACI,iBAAA,CACA,iBAAA,CElMA,yBACI,aAAA,CACA,gBAAA,CAEJ,mCACI,oBAAA,CAEJ,oCACI,YAAA,CAEJ,oCACI,0EAAA,CACA,gDACI,YAAA,CAEJ,iDACI,oBAAA,CAIZ,cACI,uEAAA,CACA,yBACI,eAAA,CACA,2BACI,kBAAA,CAGR,gBACI,aAAA,CACA,cAAA,CACA,gBAAA,CACA,0EAAA,CAGA,gCACI,UAAA,CAEJ,+BACI,WAAA,CACA,cAAA,CAIZ,wBACI,oBAAA,CACA,QAAA,CACA,cAAA,CACA,qCAJJ,wBAKQ,UAAA,CACA,aAAA,CAAA,CAEJ,2BACI,oBAAA,CACA,gBAAA,CACA,qBAAA,CACA,cAAA,CACA,eAAA,CACA,qCACI,uCACI,cAAA,CAAA,CAGR,gCACI,qBAAA,CAEJ,6BACI,oDHtDM,CGyDd,oCACI,cAAA,CCvEJ,2CACI,eAAA,CAEJ,kDACI,iBAAA,CACA,KAAA,CACA,MAAA,CACA,OAAA,CACA,qCALJ,kDAMQ,eAAA,CAAA,CAGR,0CACI,iBAAA,CAEJ,uEACI,eAAA,CAIR,wBAEI,kBAAA,CACA,qBAAA,CACA,iBAAA,CACA,WAAA,CACA,QAAA,CACA,SAAA,CACA,eAAA,CACA,eAAA,CACA,YAAA,CF7BA,6DAEI,WAAA,CACA,aAAA,CAEJ,8BACI,UAAA,CEwBJ,qCAXJ,wBAYQ,aAAA,CACA,UAAA,CACA,cAAA,CACA,eAAA,CACA,6CACI,UAAA,CAAA,CAGR,kDACI,iBAAA,CACA,KAAA,CACA,OAAA,CAEI,0OAII,oBAAA,CACA,gBAAA,CACA,iBAAA,CACA,UAAA,CACA,WAAA,CACA,SAAA,CAGR,uFACI,aAAA,CACA,uBAAA,CACA,0FACI,QAAA,CACA,SAAA,CACA,oBAAA,CAIZ,+CACI,iBAAA,CACA,UAAA,CACA,gBAAA,CACA,uBAAA,CACA,gBAAA,CACA,qCANJ,+CAOQ,UAAA,CAAA,CAEJ,8EACI,2BAAA,CACA,sBAAA,CAGR,6CACI,WAAA,CACA,iBAAA,CACA,kBAAA,CACA,WAAA,CACA,QAAA,CACA,sBAAA,CACA,mDACI,iBAAA,CACA,QAAA,CACA,yBAAA,CACA,kBAAA,CAGR,4CACI,mDJ9EU,CI+EV,yBAAA,CACA,gBAAA,CACA,kBAAA,CACA,qBAAA,CACA,0BAAA,CACA,WAAA,CAEA,QAAA,CACA,gCAAA,CACA,YAAA,CACA,uBAAA,CAAA,oBAAA,CAAA,eAAA,CACA,0BAAA,CAEA,uDACI,YAAA,CAGR,6CACI,uBAAA,CACA,4BAAA,CAGR,qBACI,eAAA,CCvHI,sCACI,uBAAA,CAEJ,mGAEI,iFAAA,CAGR,oBACI,kEAAA,CAGR,mBACI,cAAA,CACA,6DAAA,CACA,gEAAA,CACA,mBAAA,CACA,WAAA,CACA,YAAA,CAEJ,6BACI,yDAAA,CAEJ,2DAGI,UAAA,CACA,QAAA,CACA,kFAAA,CACA,mCAAA,CACA,yPAGI,eAAA,CACA,kBAAA,CACA,qBAAA,CACA,sBAAA,CACA,wBAAA,CACA,0EAAA,CACA,kCAAA,CACA,0BAAA,CAGA,uIACI,8DAAA,CAGR,8KAEI,2BAAA,CACA,uFAAA,CACA,oYAEI,+DAAA,CAGR,6FACI,iBAAA,CACA,UAAA,CACA,4BAAA,CACA,yGAEI,qBAAA,CACA,QAAA,CAGR,yFACI,8CL9DQ,CKgEZ,qFACI,UAAA,CAEA,wBAAA,CACA,2BAAA,CAEJ,yFACI,iBAAA,CACA,UAAA,CACA,kBAAA,CACA,6BAAA,CACA,6FACI,yBAAA,CACA,QAAA,CAEJ,uHHNJ,gCAAA,CACA,eAAA,CACA,kDAAA,CACA,8DAAA,CACA,oEAAA,CACA,gEAAA,CACA,2BAAA,CACA,uBAAA,CGCQ,UAAA,CACA,8BAAA,CHDR,yYAGI,8DAAA,CAEI,iFAAA,CACA,4DAAA,CAMJ,+BAAA,CAEJ,0RAEI,8DAAA,CACA,oEAAA,CACA,4DAAA,CACA,iEAAA,CAEA,yFAAA,CAEA,s5BAGI,8DAAA,CACA,oEAAA,CACA,4DAAA,CACA,iGAAA,CAGR,0RAEI,gCAAA,CAIA,w3DAMI,oEAAA,CACA,4DAAA,CAII,wDAAA,CACA,iCAAA,CAEJ,kBAAA,CACA,0BAAA,CACA,giEAIQ,wDAAA,CACA,iCAAA,CGzDR,iIACI,cAAA,CACA,gBAAA,CACA,qBAAA,CAIZ,+EACI,oDLpFU,CKqFV,cLtEW,CKuEX,iBAAA,CACA,yBAAA,CACA,iFAAA,CACA,yFACI,cAAA,CACA,iBAAA,CACA,uGACI,kBAAA,CAKR,+FACI,iBAAA,CACA,2EAAA,CACA,gCAAA,CACA,mGAKI,yDAAA,CAJA,6GACI,8DAAA,CACA,kEAAA,CAMhB,uFACI,iBAAA,CACA,6HACI,uBAAA,CAEJ,6FACI,2EAAA,CACA,gCAAA,CAKJ,oLACI,kEAAA,CAGA,gPACI,2EAAA,CAKhB,mBACI,iBAAA,CACA,UAAA,CACA,eAAA,CACA,iBAAA,CACA,sELnIe,CKoIf,0EAAA,CACA,kDACI,aAAA,CACA,UAAA,CACA,qCAHJ,kDAIQ,aAAA,CAAA,CAGR,gDACI,aAAA,CACA,kBAAA,CACA,UAAA,CACA,0EACI,kBAAA,CACA,UAAA,CACA,WAAA,CACA,qBAAA,CACA,+EACI,gBAAA,CACA,WAAA,CACA,qBAAA,CAIZ,0CACI,kBAAA,CACA,qBAAA,CACA,qCAHJ,0CAIQ,eAAA,CACA,iBAAA,CAAA,CAGR,oCAEI,kBAAA,CACA,qBAAA,CACA,gBAAA,CACA,cAAA,CH5LJ,qFAEI,WAAA,CACA,aAAA,CAEJ,0CACI,UAAA,CGuLA,qCANJ,oCAOQ,cAAA,CACA,eAAA,CAAA,CAGR,+BACI,oBAAA,CACA,oDLxLU,CKyLV,cAAA,CACA,gBAAA,CACA,kBAAA,CACA,aAAA,CACA,oCACI,qBAAA,CAGR,sCACI,iBAAA,CACA,QAAA,CAEJ,oCACI,QAAA,CACA,cAAA,CAEJ,8BACI,oBAAA,CACA,iBAAA,CACA,kBAAA,CACA,SAAA,CACA,WAAA,CACA,YAAA,CACA,qCACI,UAAA,CACA,aAAA,CACA,iBAAA,CACA,SAAA,CACA,YAAA,CACA,eAAA,CACA,SAAA,CACA,mELtNM,CK2Nd,8dASI,oBAAA,CACA,eAAA,CACA,unBACI,kBAAA,CACA,aAAA,CACA,eAAA,CACA,8vBACI,cAAA,CAIZ,gDACI,eAAA,CAEJ,mEACI,kBAAA,CACA,4GACI,uBAAA,CAGR,6EACG,+BAAA,CAEH,uCACI,kBAAA,CAEJ,8CACI,UAAA,CACA,eAAA,CACA,YAAA,CAEJ,6CACI,cAAA,CAEJ,mDACI,qBAAA,CAEJ,iEACI,UAAA,CACA,uBAAA,CAIR,iBAEI,kBAAA,CH/RA,+CAEI,WAAA,CACA,aAAA,CAEJ,uBACI,UAAA,CG0RJ,qCAHJ,iBAIQ,cAAA,CAAA,CAEJ,kCACI,oBAAA,CACA,eAAA,CACA,gBAAA,CACA,8EACI,qEAAA,CACA,kBAAA,CAEJ,qCARJ,kCAUQ,UAAA,CACA,aAAA,CH9SR,iFAEI,WAAA,CACA,aAAA,CAEJ,wCACI,UAAA,CAAA,CG2SI,oDACI,+DAAA,CACA,cAAA,CAEJ,0EACI,oBAAA,CAGR,oEACI,wEAAA,CACA,aAAA,CAGR,0BACI,YAAA,CACA,WAAA,CACA,qCAHJ,0BAKQ,UAAA,CACA,kBAAA,CHpUR,iEAEI,WAAA,CACA,aAAA,CAEJ,gCACI,UAAA,CAAA,CGgUA,8IAII,cLhTM,CKiTN,gBAAA,CACA,uBAAA,CAEJ,yEAEI,0DLjUM,CKmUV,qEAEI,gBAAA,CACA,iBAAA,CACA,wEAAA,CAGR,mDACI,oBAAA,CACA,gBAAA,CAIR,qCAEQ,0CACI,UAAA,CAEJ,oCACI,UAAA,CACA,sDACI,KAAA,CACA,QAAA,CAAA,CAMhB,0BACI,oBAAA,CACA,kBAAA,CACA,gBAAA,CACA,eAAA,CACA,gBAAA,CACA,qCANJ,0BAOQ,aAAA,CACA,UAAA,CACA,eAAA,CACA,YAAA,CACA,aAAA,CAAA,CAGR,kBACI,iBAAA,CACA,kGHhTA,gCAAA,CACA,eAAA,CACA,kDAAA,CACA,yDAAA,CACA,oEAAA,CACA,oEAAA,CACA,2BAAA,CACA,uBAAA,CG8SI,oBAAA,CACA,kBAAA,CACA,4BAAA,CH/SJ,8WAGI,yDAAA,CAKI,oEAAA,CACA,gEAAA,CACA,8BAAA,CAEJ,+BAAA,CAEJ,4RAEI,yDAAA,CACA,oEAAA,CACA,gEAAA,CACA,iEAAA,CAEA,yFAAA,CAEA,o+BAGI,yDAAA,CACA,oEAAA,CACA,gEAAA,CACA,iGAAA,CAGR,4RAEI,gCAAA,CAIA,gmEAMI,oEAAA,CACA,gEAAA,CAII,mDAAA,CACA,iCAAA,CAEJ,kBAAA,CACA,0BAAA,CACA,g7EAIQ,mDAAA,CACA,iCAAA,CGsPhB,wBACI,iBAAA,CACA,gBAAA,CAEJ,6BACI,KAAA,CAEJ,0CACI,cAAA,CAIR,wBACI,oBAAA,CAEJ,uCACI,eAAA,CAGJ,WACI,iBAAA,CACA,eAAA,CACA,UAAA,CACA,gBACI,QAAA,CACA,SAAA,CACA,eAAA,CAIR,0BACI,oBAAA,CACA,iBAAA,CACA,kBAAA,CACA,wFACI,cAAA,CAEJ,8FAEI,YAAA,CACA,OAAA,CACA,SAAA,CACA,QAAA,CACA,qCLjXU,CKkXV,wGACI,aAAA,CACA,8CLhbI,CKibJ,kBAAA,CACA,kBAAA,CACA,4BAAA,CACA,qCANJ,wGAOQ,kBAAA,CAAA,CAGR,0GACI,aAAA,CACA,2BAAA,CACA,mBAAA,CACA,UAAA,CACA,uBAAA,CACA,yBAAA,CAEJ,0GACI,iBAAA,CACA,OAAA,CACA,kBAAA,CACA,gBAAA,CAEJ,4JACI,OAAA,CACA,eAAA,CACA,YAAA,CACA,QAAA,CACA,qCL/YM,CKgZN,0KACI,YAAA,CAEJ,gLACI,iBAAA,CACA,QAAA,CACA,UAAA,CACA,oDL5cE,CK6cF,cAAA,CACA,4LACI,8CLtdJ,CKydJ,gKACI,qEAAA,CACA,kBAAA,CACA,wBAAA,CACA,iBAAA,CAEJ,wKACI,+DAAA,CACA,kBAAA,CACA,oBAAA,CACA,uBAAA,CACA,oLACI,aAAA,CAIZ,8GACI,uDAAA,CACA,8DAAA,CAGR,oDACI,aAAA,CACA,uDACI,QAAA,CACA,SAAA,CACA,oBAAA,CAGR,qCACI,iBAAA,CAKA,8JAII,oDLzfM,CK0fN,cAAA,CACA,gBAAA,CACA,WAAA,CACA,cAAA,CAGR,oDACI,UAAA,CACA,UAAA,CACA,iBAAA,CAIR,qBACI,iBAAA,CACA,QAAA,CACA,YAAA,CACA,YAAA,CACA,UAAA,CACA,eAAA,CACA,cAAA,CACA,uBAAA,CACA,SAAA,CACA,eAAA,CACA,cAAA,CACA,eAAA,CACA,uDL/hBI,CKgiBJ,iBAAA,CACA,2BAAA,CACA,4BACI,iBAAA,CACA,QAAA,CACA,SAAA,CACA,UAAA,CACA,UAAA,CACA,UAAA,CACA,WAAA,CACA,gBAAA,CACA,uBAAA,CACA,uDL5iBA,CK8iBJ,iDACI,SAAA,CACA,UAAA,CAIR,uBAEI,kBAAA,CACA,qBAAA,CACA,cAAA,CACA,kBAAA,CACA,UAAA,CH3jBA,2DAEI,WAAA,CACA,aAAA,CAEJ,6BACI,UAAA,CGsjBJ,yBACI,8DAAA,CAEJ,6BACI,0DLjjBU,CKkjBV,gBAAA,CACA,WAAA,CACA,YAAA,CACA,oCACI,qBAAA,CAGR,0BACI,oBAAA,CAGR,2CACI,kBAAA,CACA,eAAA,CACA,cAAA,CACA,gBAAA,CACA,qBAAA,CACA,kBAAA,CAEJ,mCACI,aAAA,CACA,eAAA,CACA,kBAAA,CACA,gBAAA,CACA,UAAA,CACA,WAAA,CAEJ,yCACI,aAAA,CACA,iBAAA,CACA,eAAA,CACA,gBAAA,CACA,WAAA,CACA,UAAA,CACA,sBAAA,CAEJ,gDACI,iBAAA,CACA,UAAA,CACA,qBAAA,CACA,gBAAA,CACA,sDACI,aAAA,CAEJ,gFACI,qBAAA,CACA,eAAA,CACA,SAAA,CACA,YAAA,CACA,QAAA,CACA,qCLljBU,CKmjBV,mFACI,SAAA,CACA,qFACI,8CLlnBA,CKmnBA,gCAAA,CACA,6EAAA,CACA,2FACI,uDAAA,CACA,8DAAA,CAGR,gGACI,kBAAA,CAGR,oFACI,iBAAA,CACA,QAAA,CACA,kBAAA,CACA,iBAAA,CAKZ,6BACI,iBAAA,CACA,SAAA,CACA,eAAA,CACA,UAAA,CACA,WAAA,CACA,gBAAA,CACA,YAAA,CACA,mCACI,UAAA,CACA,iBAAA,CACA,QAAA,CACA,QAAA,CACA,UAAA,CACA,WAAA,CACA,eAAA,CACA,uBAAA,CACA,qCL5lBU,CKgmBlB,6CACI,aAAA,CACA,eAAA,CACA,kEACI,SAAA,CACA,WAAA,CACA,yEACI,UAAA,CACA,SAAA,CAGR,+CACI,oBAAA,CAIR,yBACI,kBAAA,CACA,qBAAA,CAGJ,uCACI,eAAA,CACA,uDACI,uBAAA,CAGA,0EACI,oBAAA,CACA,wBAAA,CACA,QAAA,CACA,SAAA,CACA,iBAAA,CAEJ,4FACI,WAAA,CACA,kBAAA,CACA,sBAAA,CACA,8CLlsBI,CKmsBJ,iHACE,eAAA,CACA,qBAAA,CAIV,uDAEI,oBAAA,CHhtBJ,2HAEI,WAAA,CACA,aAAA,CAEJ,6DACI,UAAA,CG4sBJ,uDACI,UAAA,CACA,oBAAA,CACA,YAAA,CACA,8CAAA,CACA,+CAAA,CACA,mEAAA,CACA,gBAAA,CACA,uDLztBA,CK0tBA,iBAAA,CACA,eAAA,CACA,gFACI,YAAA,CACA,8CAAA,CACA,+CAAA,CACA,mEAAA,CACA,gBAAA,CACA,uDLluBJ,CKmuBI,sFACI,wBAAA,CAGR,2EACI,iBAAA,CACA,OAAA,CACA,QAAA,CACA,iFACG,QAAA,CACA,kBAAA,CAGP,yIAEI,UAAA,CACA,SAAA,CACA,gBAAA,CACA,kBAAA,CACA,6IACI,aAAA,CACA,WAAA,CACA,UAAA,CAEJ,iJACI,UAAA,CACA,WAAA,CAGR,kEACI,wBAAA,CACA,iBAAA,CACA,qBAAA,CAGR,+DACI,wBAAA,CAGA,oEACI,wBAAA,CAGR,4DACI,UAAA,CACA,+CAAA,CACA,gDAAA,CACA,QAAA,CACA,SAAA,CACA,8BAAA,CACA,qFACI,UAAA,CACA,QAAA,CACA,iBAAA,CAEJ,4EACI,QAAA,CACA,WAAA,CACA,UAAA,CAEJ,uEACI,iBAAA,CACA,qBAAA,CAMR,yBACI,qBAAA,CAEJ,uBACI,cAAA,CC5yBA,sPAII,qBAAA,CACA,yBAAA,CACA,0BAAA,CACA,sSACI,uBAAA,CAEJ,8QACI,qBAAA,CAIJ,qIAEI,eAAA,CAIZ,oCAEI,6BAAA,CAEJ,0BACI,SAAA,CACA,mBAAA,CACA,kBAAA,CACA,eAAA,CACA,0EAAA,CAGA,0GAGI,WAAA,CAGR,uBACI,gBAAA,CAEJ,iDACI,OAAA,CAEJ,uCACI,mBAAA,CAEJ,iCACI,WAAA,CACA,qCAFJ,iCAGQ,UAAA,CAAA,CAIJ,2CACI,SAAA,CAEJ,iDACI,SAAA,CAIA,qCAFJ,4FAGQ,UAAA,CAAA,CC5DR,iSACI,YAAA,CAGR,sHAEI,YAAA,CAEJ,0EACI,UAAA,CAEJ,+BAEI,iBAAA,CACA,eAAA,CACA,mEAAA,CACA,wCPca,CObb,sEPRU,COSV,gCAAA,CLtBJ,2EAEI,WAAA,CACA,aAAA,CAEJ,qCACI,UAAA,CKiBA,4CACI,iBAAA,CACA,KAAA,CACA,OAAA,CACA,QAAA,CACA,MAAA,CAEJ,6CACI,yDP1BI,CO2BJ,sBAAA,CACA,oEAAA,CACA,0DACI,SAAA,CAEJ,yDACI,SAAA,CACA,wBAAA,CACA,kBAAA,CAEJ,wDACI,YAAA,CAEJ,wHACI,yDAAA,CAGR,sDACI,YAAA,CAEJ,2CACI,UAAA,CACA,eAAA,CACA,cAAA,CACA,eAAA,CACA,aAAA,CACA,mBAAA,CACA,0EAAA,CACA,oDACI,iBAAA,CACA,sEACI,YAAA,CAEJ,4EACI,aAAA,CAGR,uDACI,2BAAA,CACA,2BAAA,CACA,cAAA,CACA,gBAAA,CACA,SAAA,CACA,SAAA,CACA,8MAGI,UAAA,CACA,eAAA,CACA,6NACI,oDPtEN,COuEM,mBAAA,CACA,yCAAA,CAIZ,sDACI,gmBAAA,CACA,uBAAA,CACA,oBAAA,CACA,iBAAA,CACA,OAAA,CACA,UAAA,CACA,UAAA,CACA,UAAA,CACA,WAAA,CAEJ,6DACI,QAAA,CACA,MAAA,CACA,UAAA,CAEJ,sHAEI,OAAA,CACA,OAAA,CACA,SAAA,CACA,YAAA,CACA,oIACI,oDPnGF,COqGF,8HACI,YAAA,CAGR,4DAEI,UAAA,CACA,WAAA,CACA,2eAAA,CACA,uBAAA,CAEJ,0DAEI,umBAAA,CACA,UAAA,CACA,WAAA,CACA,uBAAA,CAEJ,uHAEI,8BAAA,CACA,2IACI,eAAA,CACA,UAAA,CACA,WAAA,CACA,mEAAA,CACA,eAAA,CACA,mJACI,UAAA,CACA,WAAA,CAIZ,wDACI,QAAA,CACA,MAAA,CACA,uBAAA,CACA,WAAA,CACA,gBAAA,CAGR,2CACI,WAAA,CACA,2DP/IM,COgJN,UAAA,CACA,eAAA,CAEJ,qCACI,iBAAA,CACA,OAAA,CACA,2DPtJM,COuJN,cAAA,CACA,iBAAA,CAEJ,0DLzFJ,gCAAA,CACA,eAAA,CACA,kDAAA,CACA,yDAAA,CACA,oEAAA,CACA,oEAAA,CACA,2BAAA,CACA,uBAAA,CKoFQ,qBAAA,CACA,eAAA,CAEA,gBPjJO,COkJP,qBAAA,CACA,sBAAA,CACA,4BAAA,CACA,eAAA,CACA,gBAAA,CACA,4BAAA,CACA,cAAA,CL7FR,gMAGI,yDAAA,CAKI,oEAAA,CACA,gEAAA,CACA,8BAAA,CAEJ,+BAAA,CAEJ,0IAEI,yDAAA,CACA,oEAAA,CACA,gEAAA,CACA,iEAAA,CAEA,yFAAA,CAEA,kcAGI,yDAAA,CACA,oEAAA,CACA,gEAAA,CACA,iGAAA,CAGR,0IAEI,gCAAA,CAIA,06BAMI,oEAAA,CACA,gEAAA,CAII,mDAAA,CACA,iCAAA,CAEJ,kBAAA,CACA,0BAAA,CACA,8/BAIQ,mDAAA,CACA,iCAAA,CKmCR,oEACI,4CPpLR,COqLQ,cAAA,CACA,iBAAA,CACA,qBAAA,CAEJ,iEACI,YAAA,CAEJ,oNAGI,4CP/LR,COgMQ,QAAA,CAEJ,wEACI,YAAA,CAEJ,+DACI,YAAA,CAEJ,gFL3HR,gCAAA,CACA,eAAA,CACA,kDAAA,CACA,8DAAA,CACA,oEAAA,CACA,gEAAA,CACA,2BAAA,CACA,uBAAA,CKsHY,sBAAA,CACA,wBAAA,CACA,qBAAA,CACA,sBAAA,CLxHZ,kQAGI,8DAAA,CAEI,iFAAA,CACA,4DAAA,CAMJ,+BAAA,CAEJ,sLAEI,8DAAA,CACA,oEAAA,CACA,4DAAA,CACA,iEAAA,CAEA,yFAAA,CAEA,skBAGI,8DAAA,CACA,oEAAA,CACA,4DAAA,CACA,iGAAA,CAGR,sLAEI,gCAAA,CAIA,krCAMI,oEAAA,CACA,4DAAA,CAII,wDAAA,CACA,iCAAA,CAEJ,kBAAA,CACA,0BAAA,CACA,swCAIQ,wDAAA,CACA,iCAAA,CK8DJ,sFACI,kEAAA,CAEJ,qFACI,iBAAA,CACA,gBAAA,CAEJ,0FACI,mDPlKA,COmKA,yBAAA,CAEJ,6FACI,YAAA,CAEJ,8FACI,aAAA,CAEJ,uFACI,wBAAA,CAEJ,qFACI,aAAA,CAKZ,6CACI,qBAAA,CACA,sBAAA,CACA,SPpOG,COsOP,0CACI,iBAAA,CACA,OAAA,CAEA,SAAA,CACA,uBAAA,CACA,2DACI,uDPpPR,COuPI,gHACI,eAAA,CACA,kBAAA,CACA,sBAAA,CACA,wBAAA,CACA,WAAA,CACA,gBAAA,CAGJ,8CACI,UAAA,CACA,WAAA,CACA,iBAAA,CACA,mEAAA,CACA,wCPpOK,COqOL,kBAAA,CACA,2DACI,qBAAA,CACA,cAAA,CACA,mEAAA,CACA,wCP1OC,CO8OT,4CACI,qBAAA,CACA,2BAAA,CAGJ,+CACI,oBAAA,CACA,oDP3QE,CO4QF,kBAAA,CACA,iBAAA,CACA,eAAA,CACA,qEACI,qBAAA,CACA,wBAAA,CAIR,yDLnNR,gCAAA,CACA,eAAA,CACA,kDAAA,CACA,8DAAA,CACA,oEAAA,CACA,gEAAA,CACA,2BAAA,CACA,uBAAA,CK8MY,WAAA,CACA,wBAAA,CACA,oBAAA,CACA,UAAA,CACA,WAAA,CACA,iBAAA,CACA,cAAA,CLnNZ,6LAGI,8DAAA,CAEI,iFAAA,CACA,4DAAA,CAMJ,+BAAA,CAEJ,wIAEI,8DAAA,CACA,oEAAA,CACA,4DAAA,CACA,iEAAA,CAEA,yFAAA,CAEA,4bAGI,8DAAA,CACA,oEAAA,CACA,4DAAA,CACA,iGAAA,CAGR,wIAEI,gCAAA,CAIA,85BAMI,oEAAA,CACA,4DAAA,CAII,wDAAA,CACA,iCAAA,CAEJ,kBAAA,CACA,0BAAA,CACA,k/BAIQ,wDAAA,CACA,iCAAA,CKyJJ,qEACI,oBAAA,CAEJ,8DACI,iBAAA,CACA,gBAAA,CAMR,gEACI,iBAAA,CAEJ,iEACI,eAAA,CACA,kBAAA,CACA,sBAAA,CAEA,eAAA,CAEJ,mFACI,iBAAA,CAEI,qCACI,sHACI,sBAAA,CACA,wBAAA,CACA,eAAA,CAAA,CAGR,2QACI,wBAAA,CAMhB,gEACI,OAAA,CACA,2FACI,UAAA,CAIR,yBAxUJ,+BAyUQ,WAAA,CAAA,CAMZ,gBACI,2BAAA,CACA,2BACI,UAAA,CACA,yDP7VQ,CO+VZ,yBACI,eAAA,CACA,kBAAA,CACA,sBAAA,CACA,4BAAA,CAEJ,8BACI,oBAAA,CACA,eAAA,CACA,kBAAA,CACA,UAAA,CACA,WAAA,CACA,iBAAA,CACA,mEAAA,CACA,iBAAA,CACA,kaAAA,CACA,uBAAA,CACA,kCACI,iDPrXJ,COsXI,uFAEI,UAAA,CACA,WAAA,CACA,UAAA,CAMhB,6BACI,cAAA,CACA,WAAA,CACA,QAAA,CACA,SAAA,CACA,iBAAA,CACA,WAAA,CACA,gBAAA,CACA,eAAA,CACA,uBAAA,CACA,mBAAA,CACA,wCP1WiB,CO2WjB,iDP5YI,CO6YJ,mCP9Uc,CO+Ud,mCACI,cAAA,CACA,8CP5YQ,CO8YZ,mCACI,iBAAA,CAGR,4BACI,eAAA,CAEA,sDACI,eAAA,CACA,kBAAA,CACA,sBAAA,CAEJ,kCACI,YAAA,CAGR,yBACI,UAAA,CACA,cAAA,CACA,yDPjaY,COoahB,uCACI,8CPraY,COsaZ,gBAAA,CACA,cAAA,CACA,uEAAA,CACA,uFAEI,qBAAA,CAEJ,2CACI,gBAAA,CAEJ,qDACI,eAAA,CACA,kBAAA,CACA,sBAAA,CACA,cAAA,CAIR,uBACI,gBAAA,CACA,uEAAA,CACA,sBAAA,CACA,yBACI,cPxaU,COyaV,+DAAA,CAGR,+DAEI,mBAAA,CAGJ,6BACI,mBAAA,CACA,iBAAA,CACA,0EAAA,CCndJ,uBACI,iBAAA,CAGJ,eACI,iBAAA,CACA,UAAA,CACA,WAAA,CACA,oDRSc,CQRd,iBAAA,CACA,yBAAA,CACA,2BAAA,CACA,kBAAA,CACA,cAAA,CACA,YAAA,CACA,uDRTI,CQUJ,mCAAA,CACA,iBAAA,CACA,UAAA,CACA,cAAA,CACA,sBACI,iBAAA,CACA,QAAA,CACA,QAAA,CACA,UAAA,CACA,UAAA,CACA,SAAA,CACA,UAAA,CACA,gBAAA,CACA,uBAAA,CACA,uDRxBA,CQ4BR,sBACI,YAAA,CACA,YAAA,CChCJ,2BACI,GACI,SAAA,CACA,0BAAA,CAEJ,QAEI,SAAA,CACA,uBAAA,CAEJ,KACI,SAAA,CACA,2BAAA,CAAA,CAGR,oBACI,GACI,SAAA,CACA,0BAAA,CAEJ,IACI,SAAA,CACA,uBAAA,CAAA,CAGR,iBACI,GACI,kBAAA,CAEJ,IACI,oBAAA,CAEJ,IACI,kBAAA,CAAA,CAGR,kCAEI,qBAAA,CAGJ,gBACI,gBAAA,CACA,iBAAA,CACA,+BAAA,CACA,eAAA,CAEJ,6BACI,cAAA,CAEJ,+BACI,cAAA,CAEJ,oFAEI,cAAA,CAEJ,8BACI,kBAAA,CAEJ,0CACI,UAAA,CAEJ,4BACI,iBAAA,CACA,YAAA,CAEJ,4BACI,oBAAA,CACA,iBAAA,CACA,kBAAA,CACA,gBAAA,CACA,WAAA,CAEJ,kCACI,YAAA,CAEJ,8CACI,SAAA,CAEJ,sDACI,kBAAA,CACA,+DTlEc,CSmEd,gJAAA,CAEJ,wDACI,SAAA,CAEJ,6CACI,eAAA,CAEJ,yDACI,6BAAA,CAEJ,uCACI,aAAA,CACA,cAAA,CACA,iBAAA,CACA,WAAA,CACA,cAAA,CAEJ,6CACI,yBAAA,CAEJ,8CACI,SAAA,CAEJ,wCACI,iBAAA,CACA,KAAA,CACA,MAAA,CACA,UAAA,CACA,oBAAA,CACA,cAAA,CACA,gBAAA,CACA,iBAAA,CACA,cAAA,CACA,cAAA,CACA,eAAA,CACA,SAAA,CAEJ,iDACI,cAAA,CACA,iBAAA,CAEJ,qDACI,kBAAA,CAEJ,gEACI,qCAAA,CACA,mCAAA,CAEJ,iEACI,eAAA,CACA,sBAAA,CAEJ,sEACI,8BAAA,CAEJ,gHAEI,cAAA,CACA,iBAAA,CACA,mCAAA,CAEJ,gDACI,2BAAA,CAEA,gBAAA,CAEJ,sCACI,aAAA,CACA,iBAAA,CACA,eAAA,CACA,UAAA,CACA,WAAA,CACA,YAAA,CACA,kBAAA,CAEJ,0CACI,aAAA,CAEJ,wDACI,4DAAA,CAEJ,oDACI,SAAA,CACA,qDAAA,CAEJ,wFAEI,aAAA,CACA,iBAAA,CACA,OAAA,CACA,QAAA,CACA,WAAA,CACA,gBAAA,CACA,iBAAA,CACA,mBAAA,CACA,SAAA,CAEJ,gGAEI,aAAA,CACA,UAAA,CACA,WAAA,CAEJ,uDACI,SAAA,CACA,yBAAA,CAEJ,qDACI,SAAA,CACA,8BAAA,CAEJ,6DACI,gCAAA,CAEJ,yCACI,iBAAA,CACA,OAAA,CACA,QAAA,CACA,eAAA,CACA,YAAA,CACA,UAAA,CACA,WAAA,CACA,eAAA,CACA,iBAAA,CACA,iBAAA,CACA,mBAAA,CACA,SAAA,CACA,6BAAA,CAEJ,oDACI,iBAAA,CACA,KAAA,CACA,QAAA,CACA,MAAA,CACA,OAAA,CACA,wDTzMc,CS0Md,oIAAA,CACA,kCAAA,CAEJ,uDACI,aAAA,CAEJ,6DACI,mBAAA,CACA,SAAA,CAEJ,8CACI,aAAA,CACA,YAAA,CACA,iBAAA,CACA,SAAA,CACA,UAAA,CACA,YAAA,CACA,4CT3OI,CS4OJ,cAAA,CACA,WAAA,CACA,kBAAA,CACA,iBAAA,CACA,mBAAA,CACA,SAAA,CACA,kBAAA,CACA,uDAAA,CACA,2BAAA,CAEJ,oDACI,UAAA,CACA,iBAAA,CACA,QAAA,CACA,SAAA,CACA,OAAA,CACA,QAAA,CACA,oCAAA,CACA,+BAAA,CACA,mCAAA","file":"../admin_filer.css","sourcesContent":["/*!\n * @copyright: https://github.com/divio/django-filer\n */\n\n//##############################################################################\n// IMPORT SETTINGS\n@import \"settings/all\";\n@import \"mixins/all\";\n\n//##############################################################################\n// IMPORT COMPONENTS\n@import \"components/base\";\n@import \"components/image-info\";\n@import \"components/action-list\";\n@import \"components/filter-files\";\n@import \"components/navigator\";\n@import \"components/modal\";\n@import \"components/drag-and-drop\";\n@import \"components/tooltip\";\n\n//##############################################################################\n// IMPORT LIBS\n@import \"libs/dropzone\";\n","//##############################################################################\n// BASE\n\nhtml,\nbody {\n min-width: 320px;\n height: 100% !important;\n}\n\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.clearfix:after {\n content: \"\";\n display: table;\n clear: both;\n}\n.related-widget-wrapper {\n float: none !important;\n}\n.related-lookup.hidden {\n display: none !important;\n}\n\n// make sure that tiny styles like on size info has correct font size and color #666\n.tiny {\n font-size: $font-size-small !important;\n color: $gray-light !important;\n}\n\n.nav-pages {\n position: relative;\n // make sure that paginator has correct font size and color #666\n font-size: $font-size-small;\n color: $gray-light !important;\n padding-left: 10px;\n padding-right: 20px;\n padding-top: 15px;\n padding-bottom: 15px;\n box-sizing: border-box;\n background: $white;\n span {\n // make sure that paginator has correct font size and color #666\n font-size: $font-size-small;\n color: $gray-light !important;\n }\n .actions {\n float: right;\n }\n}\n\n#id_upload_button:before {\n display: none;\n}\n#content #content-main {\n margin-top: 0;\n}\n.filebrowser {\n &.cms-admin-sideframe {\n #container {\n .breadcrumbs + #content,\n .breadcrumbs + .messagelist + #content {\n margin-left: 0 !important;\n margin-right: 0 !important;\n }\n .breadcrumbs {\n left: 0 !important;\n padding-left: 20px !important;\n }\n }\n }\n #container {\n min-width: auto;\n #content {\n padding: 0;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.2);\n }\n .breadcrumbs + #content,\n .breadcrumbs + .messagelist + #content {\n margin-left: 3% !important;\n }\n }\n h1.folder_header {\n position: relative;\n top: 6px;\n }\n // required for django CMS <= 3.1 #673\n h2 {\n display: none;\n }\n #content-main {\n background-color: $white;\n }\n}\n\n.filer-widget {\n width: 100%;\n}\n\n.field-file,\n.field-sha1 {\n word-wrap: break-word;\n word-break: break-all;\n}\n\n.well.img-preview {\n display: none;\n margin-top: 0;\n}\n.img-wrapper {\n width: 180px;\n height: 180px;\n}\n\n.file-duplicates {\n clear: both;\n padding: 20px 0 0;\n}\n\nform .cancel-link {\n height: auto !important;\n line-height: inherit !important;\n padding: 10px 15px;\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n\n.hidden {\n display: none !important;\n}\n\n.filer-info-bar {\n min-height: 15px;\n margin: 0 0 2px !important;\n padding: 15px 20px;\n box-shadow: 0 0 10px -2px rgba(black, 0.2);\n background-color: $white;\n}\n\n.navigator .actions span.all,\n.navigator .actions span.clear,\n.navigator .actions span.question {\n font-size: 13px;\n margin: 0 0.5em;\n display: none;\n}\n\n#all-items-action-toggle {\n display: none !important;\n}\n","// #############################################################################\n// SETTINGS\n\n$speed-base: 200ms;\n\n// COLORS\n$white: var(--dca-white, var(--body-bg, #fff));\n$black: var(--dca-black, var(--body-fg, #000));\n$shadow-black: #000;\n\n$color-primary: var(--dca-primary, var(--primary, #0bf));\n// $color-primary-light: #f1faff;\n$color-success: #693;\n$color-danger: #f00;\n$color-warning: #c93;\n\n// COLORS gray\n$gray: var(--dca-gray, var(--body-quiet-color, #666)); // #666;\n$gray-lightest: var(--dca-gray-lightest, var(--darkened-bg, #f2f2f2)); // #f2f2f2\n$gray-lighter: var(--dca-gray-lighter, var(--border-color, #ddd)); // #ddd\n$gray-light: var(--dca-gray-light, var(--body-quiet-color, #999)); // #999\n$gray-darker: var(--dca-gray-darker, #454545); // #454545\n$gray-darkest: var(--dca-gray-darkest, var(--body-fg, #333)); // #333\n\n$gray-super-light: var(--dca-gray-super-lightest, var(--darkened-bg, #f7f7f7));\n$gray-dropzone: $gray-lightest;\n\n$hover-bg: $gray-lightest;\n\n//##############################################################################\n// BASE Variables\n$font-size-small: 12px;\n$font-size-normal: 14px;\n$font-size-large: 16px;\n\n$icon-size: 16px;\n\n$line-height-normal: 20px;\n\n$border-radius-base: var(--dca-btn-radius, 3px);\n$border-radius-normal: var(--dca-border-radius, 5px);\n\n$padding-base: 3px;\n$padding-normal: 10px;\n$padding-large: 20px;\n\n$screen-mobile: 320px;\n$screen-tablet: 720px;\n$screen-desktop: 975px;\n\n$screen-tablet-filer: 810px;\n\n//##############################################################################\n// BUTTONS\n\n$btn-border-radius-base: var(--button-radius, 3px);\n$btn-active-shadow: inset 0 3px 5px rgba($black, 0.125);\n\n$btn-default-color: var(--dca-gray-light, var(--button-fg, #999));\n$btn-default-bgcolor: var(--dca-white, var(--button-bg, #fff));\n$btn-default-border: var(--dca-gray-lighter, transparent);\n\n$btn-action-color: var(--dca-white, var(--button-fg, #fff));\n$btn-action-bgcolor: $color-primary;\n$btn-action-border: $color-primary;\n\n//##############################################################################\n// #SHADOW\n\n$base-box-shadow: 0 0 5px 0 rgba($shadow-black, 0.2);\n$dropdown-shadow: 0 1px 10px rgba($shadow-black, 0.25);\n","//##############################################################################\n// IMAGE INFO\n\n.image-info {\n position: relative;\n float: right;\n box-sizing: border-box;\n width: 28%;\n margin-top: 0;\n border: 0;\n border-radius: 3px;\n background: $white;\n box-shadow: 0 0 5px 0 rgba(black,0.2);\n .image-details,\n .actions-list {\n margin: 0;\n padding: 0;\n &.image-details {\n margin: 10px 0;\n padding: 0 10px;\n }\n li {\n list-style-type: none;\n }\n a {\n cursor: pointer;\n }\n }\n &.image-info-detail {\n @include clearfix();\n position: static;\n float: none;\n width: 100%;\n margin-bottom: 20px;\n padding: 25px;\n border-radius: 0;\n // removes background color and shadow from object tools and fixes placement on image detail page\n + #content-main .object-tools {\n margin-top: 20px;\n margin-right: 20px;\n background-color: transparent;\n &:before {\n display: none;\n }\n }\n .image-details-left {\n float: left;\n }\n .image-details-right {\n float: left;\n margin-left: 50px;\n }\n .image-details,\n .actions-list {\n margin-top: 0;\n border: 0 !important;\n &.image-details {\n margin-top: 20px;\n margin-bottom: 15px;\n padding: 0;\n }\n dt {\n float: left;\n color: $gray-light;\n font-size: 13px;\n // required for django CMS without admin styles #673\n line-height: 1rem !important;\n font-weight: normal;\n // required for django CMS without admin styles #673\n margin-top: 0;\n }\n dd {\n color: $gray;\n font-size: 13px;\n // required for django CMS without admin styles #673\n line-height: $font-size-large !important;\n padding-left: 80px;\n // required for django CMS without admin styles #673\n margin-bottom: 5px;\n }\n .text {\n font-size: 13px;\n margin-right: 15px;\n strong {\n font-size: 13px;\n }\n }\n li {\n color: $gray;\n font-size: 13px !important;\n font-weight: normal !important;\n padding: 1px 0 !important;\n border: 0 !important;\n }\n a {\n padding: 0;\n }\n }\n .image-info-title {\n overflow: hidden;\n color: $gray;\n white-space: nowrap;\n text-overflow: ellipsis;\n padding: 0 0 5px;\n .icon {\n float: left;\n margin-right: 5px;\n }\n }\n .image-preview-container {\n text-align: left;\n margin: 20px 0 0;\n padding: 0;\n > img {\n margin-bottom: 15px;\n }\n }\n .actions-list {\n .icon {\n font-size: 16px;\n &:last-child {\n float: none;\n }\n }\n }\n }\n @media screen and (max-width: $screen-tablet) {\n float: none;\n width: 100%;\n &.image-info-detail {\n .image-details-left,\n .image-details-right {\n float: none;\n margin-left: 0;\n }\n }\n }\n}\n\n.image-info-close {\n position: absolute;\n top: -10px;\n right: -7px;\n font-size: 20px;\n cursor: pointer;\n}\n\n.image-info-title {\n padding: 5px 10px;\n border-bottom: solid 1px $gray-lighter;\n a {\n margin-left: 5px;\n }\n}\n\n.image-preview-container {\n text-align: center;\n margin: 10px 0;\n padding: 0 10px;\n .image-preview {\n display: inline-block;\n position: relative;\n margin-bottom: 15px;\n outline: 1px solid $gray-lightest;\n background-image: url(\"data:image/gif;base64,R0lGODlhCAAIAKECAOPj4/z8/P///////yH5BAEKAAIALAAAAAAIAAgAAAINhBEZh8q6DoTPSWvoKQA7\");\n img {\n display: block;\n }\n }\n .image-preview-field {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n overflow: hidden;\n }\n .image-preview-circle {\n position: relative;\n z-index: 1;\n width: 26px;\n height: 26px;\n border: solid 2px $color-danger;\n margin: -13px;\n border-radius: 30px;\n cursor: move;\n background: rgba(255, 255, 255, 0.5);\n }\n audio, video {\n margin-bottom: 15px;\n &:focus {\n outline: none;\n }\n }\n}\n\n.button-group .button {\n margin-right: 10px;\n padding: 10px 15px;\n}\n","// #############################################################################\n// OTHER\n\n// add clearfix which doesnt add overflow:hidden\n@mixin clearfix() {\n &:before,\n &:after {\n content: \" \";\n display: table;\n }\n &:after {\n clear: both;\n }\n}\n// taken from bootstrap with adaptations\n@function important($important) {\n @if($important == true) {\n @return !important;\n } @else {\n @return true;\n }\n}\n/* @mixin button-variant($color, $background, $border, $important: false) {\n background-image: none important($important);\n margin-bottom: 0; // For input.btn\n padding: 6px 20px important($important);\n border-radius: $btn-border-radius-base important($important);\n color: $color important($important);\n font-size: $font-size-small important($important);\n line-height: $font-size-small;\n font-weight: normal;\n text-transform: none important($important);\n letter-spacing: normal important($important);\n background-color: $background important($important);\n border: 1px solid $border important($important);\n background-clip: padding-box;\n appearance: none;\n &:focus {\n color: $color important($important);\n background-color: darken($background, 5%) important($important);\n border-color: darken($border, 5%) important($important);\n text-decoration: none important($important);\n }\n &:hover {\n color: $color important($important);\n background-color: darken($background, 5%) important($important);\n border-color: darken($border, 5%) important($important);\n text-decoration: none important($important);\n }\n &:active {\n color: $color important($important);\n background-color: darken($background, 10%) important($important);\n border-color: darken($border, 10%) important($important);\n box-shadow: $btn-active-shadow important($important);\n\n &:hover,\n &:focus {\n color: $color important($important);\n background-color: darken($background, 17%) important($important);\n border-color: darken($border, 25%) important($important);\n }\n }\n &:active {\n background-image: none important($important);\n }\n &[disabled] {\n &,\n &:hover,\n &:focus,\n &:active {\n background-color: rgba($background, 0.4) important($important);\n border-color: rgba($border, 0.4) important($important);\n color: rgba($color, 0.8) important(1);\n cursor: not-allowed;\n box-shadow: none important($important);\n &:before {\n color: rgba($color, 0.4) important(1);\n }\n }\n }\n}*/\n\n@mixin button-variant($color, $background, $border, $important: false) {\n background-image: none important($important);\n margin-bottom: 0; // For input.btn\n border-radius: $btn-border-radius-base important($important);\n color: $color important($important);\n background-color: $background important($important);\n border: 1px solid $border important($important);\n background-clip: padding-box;\n -webkit-appearance: none;\n &:focus,\n &.focus,\n &:hover {\n color: $color important($important);\n @if $background == $btn-default-bgcolor {\n background-color: $gray-lightest important($important);\n border-color: $border important($important);\n } @else {\n background-color: $background important($important);\n border-color: $border important($important);\n filter: invert(0.05) important($important);\n }\n text-decoration: none important($important);\n }\n &:active,\n &.cms-btn-active {\n color: $color important($important);\n background-color: $background important($important);\n border-color: $border important($important);\n filter: brightness(var(--active-brightness)) opacity(1) important($important);\n // Strange: removing opacity(1.) or correcting it makes item transparent\n box-shadow: $btn-active-shadow important($important);\n\n &:hover,\n &:focus,\n &.focus {\n color: $color important($important);\n background-color: $background important($important);\n border-color: $border important($important);\n filter: brightness(calc(var(--focus-brightness) * var(--active-brightness))) opacity(1) important($important);\n } // Strange: removing opacity(1.) or correcting it makes item transparent\n }\n &:active,\n &.cms-btn-active {\n background-image: none important($important);\n }\n &.cms-btn-disabled,\n &[disabled] {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.cms-btn-active { // TODO: FABR\n background-color: $background important($important);\n border-color: $border important($important);\n @if $color == $gray {\n color: $gray-lighter important(1);\n } @else {\n color: $color important(1);\n filter: brightness(0.6) opacity(1); // Strange: removing opacity(1.) or correcting it makes item transparent\n }\n cursor: not-allowed;\n box-shadow: none important($important);\n &:before {\n @if $color == $gray {\n color: $gray-lighter important(1);\n } @else {\n color: $color important(1);\n filter: brightness(0.6) opacity(1); // Strange: removing opacity(1.) or correcting it makes item transparent\n }\n }\n }\n }\n}\n","//##############################################################################\n// ACTION LIST\n\n.actions-list-dropdown {\n a {\n display: block;\n padding: 5px 10px;\n }\n .caret-down {\n display: inline-block;\n }\n .caret-right {\n display: none;\n }\n &.js-collapsed {\n border-bottom: solid 1px $gray-lighter;\n .caret-down {\n display: none;\n }\n .caret-right {\n display: inline-block;\n }\n }\n}\n.actions-list {\n border-top: solid 1px $gray-lighter;\n &:last-child {\n border-top: none;\n a {\n border-bottom: none;\n }\n }\n a {\n display: block;\n font-size: 20px;\n padding: 5px 10px;\n border-bottom: solid 1px $gray-lighter;\n }\n .icon {\n &:first-child {\n width: 20px;\n }\n &:last-child {\n float: right;\n margin-top: 3px;\n }\n }\n}\n.actions-separated-list {\n display: inline-block;\n margin: 0;\n padding-left: 0;\n @media screen and (max-width: $screen-tablet) {\n float: left;\n margin-left: 0;\n }\n li {\n display: inline-block;\n line-height: 34px;\n vertical-align: middle;\n padding: 0 10px;\n list-style: none;\n @media screen and (max-width: $screen-tablet) {\n &:first-child {\n padding-left: 0;\n }\n }\n span {\n vertical-align: middle;\n }\n a {\n color: $gray;\n }\n }\n span:before {\n font-size: 18px;\n }\n}\n","//##############################################################################\n// FILTER FILES\n\n.search-is-focused {\n .filter-files-container {\n position: static;\n }\n .filter-filers-container-inner {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n @media screen and (max-width: $screen-tablet) {\n position: static;\n }\n }\n .breadcrumbs-container {\n position: relative;\n }\n &.breadcrumb-min-width .filter-filers-container-inner {\n position: static;\n }\n}\n\n.filter-files-container {\n @include clearfix;\n display: table-cell;\n vertical-align: middle;\n position: relative;\n width: 245px;\n margin: 0;\n padding: 0;\n background: none;\n box-shadow: none;\n z-index: 1000;\n @media screen and (max-width: $screen-tablet) {\n display: block;\n width: auto;\n margin-right: 0;\n margin-top: 10px;\n .filter-files-button {\n float: none;\n }\n }\n .filer-dropdown-container {\n position: absolute;\n top: 0;\n right: 0;\n > a {\n &,\n &:visited,\n &:link:visited,\n &:link {\n display: inline-block;\n line-height: 34px;\n text-align: center;\n width: 34px;\n height: 34px;\n padding: 0;\n }\n }\n &.open + .filer-dropdown-menu-checkboxes {\n display: block;\n width: calc(100% - 30px);\n li {\n margin: 0;\n padding: 0;\n list-style-type: none;\n }\n }\n }\n .filter-search-wrapper {\n position: relative;\n float: left;\n text-align: right;\n width: calc(100% - 43px);\n margin-right: 5px;\n @media screen and (max-width: $screen-tablet) {\n float: left;\n }\n .filer-dropdown-container span {\n line-height: 34px !important;\n height: 34px !important;\n }\n }\n .filter-files-button {\n float: right;\n text-align: center;\n white-space: nowrap;\n height: 35px;\n margin: 0;\n padding: 8px !important;\n .icon {\n position: relative;\n left: 2px;\n font-size: 16px !important;\n vertical-align: top;\n }\n }\n .filter-files-field {\n color: $gray-darkest;\n font-size: 12px !important;\n line-height: 35px;\n font-weight: normal;\n box-sizing: border-box;\n min-width: 200px !important;\n height: 35px;\n // required for django CMS <= 3.1 #673\n margin: 0;\n padding: 0 35px 0 10px !important;\n outline: none;\n appearance: none;\n transition: max-width $speed-base;\n // disable clear X on IE #690\n &::-ms-clear {\n display: none;\n }\n }\n .filer-dropdown-menu {\n margin-top: 0 !important;\n margin-right: -1px !important;\n }\n}\n.filter-files-cancel {\n margin: 5px 20px;\n}\n","//##############################################################################\n// NAVIGATOR\n\nbody {\n &.dz-drag-hover {\n .drag-hover-border {\n display: none !important;\n }\n .navigator-table tbody td,\n .navigator-table tbody .unfiled td {\n background-color: $hover-bg !important;\n }\n }\n &.reset-hover td {\n background-color: $white !important;\n }\n}\n.drag-hover-border {\n position: fixed;\n border-top: solid 2px $color-primary;\n border-bottom: solid 2px $color-primary;\n pointer-events: none;\n z-index: 100;\n display: none;\n}\n.thumbnail-drag-hover-border {\n border: solid 2px $color-primary;\n}\n.filebrowser .navigator-list,\n.filebrowser .navigator-table {\n // required for django CMS <= 3.1 #673\n width: 100%;\n margin: 0;\n border-top: solid 1px $gray-lighter !important;\n border-collapse: collapse !important;\n .navigator-header,\n thead th,\n tbody td {\n text-align: left;\n font-weight: normal;\n vertical-align: middle;\n padding: 5px !important;\n border-left: 0 !important;\n border-bottom: 1px solid $gray-lighter;\n border-top: 1px solid transparent;\n background: none !important;\n }\n tbody tr.selected {\n .action-button span {\n color: $gray-darkest !important;\n }\n }\n .navigator-body,\n .unfiled td {\n padding: 12px 5px !important;\n background-color: $gray-super-light !important;\n a,\n a:hover {\n color: $gray !important;\n }\n }\n .column-checkbox {\n text-align: center;\n width: 20px;\n padding-left: 20px !important;\n input {\n // makes sure that checkbox is vertical aligned #664\n vertical-align: middle;\n margin: 0;\n }\n }\n .column-name a {\n color: $color-primary;\n }\n .column-icon {\n width: 50px;\n // removes padding to make sure that column has correct height #664\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .column-action {\n text-align: center;\n width: 90px;\n white-space: nowrap;\n padding-right: 20px !important;\n a {\n font-size: 16px !important;\n margin: 0;\n }\n .action-button {\n @include button-variant($btn-default-color, $btn-default-bgcolor, $btn-default-border, true);\n margin: 3px;\n padding: 2px 6px 8px !important;\n span {\n font-size: 17px;\n line-height: 33px;\n vertical-align: middle;\n }\n }\n }\n .no-files {\n color: $gray;\n font-size: $font-size-normal;\n text-align: center;\n padding: 40px 0 !important;\n background-color: $gray-lightest !important;\n span {\n font-size: 20px;\n margin-right: 10px;\n &:before {\n vertical-align: sub;\n }\n }\n }\n .dz-drag-hover {\n td {\n position: relative;\n background: $hover-bg !important;\n box-sizing: border-box !important;\n a {\n &.icon {\n color: $gray-darkest !important;\n background-color: $white !important;\n }\n color: $color-primary !important;\n }\n }\n }\n &.dz-drag-hover {\n position: relative;\n .drag-hover-border {\n display: none !important;\n }\n td {\n background: $hover-bg !important;\n box-sizing: border-box !important;\n }\n }\n .reset-hover,\n &.reset-hover {\n td {\n background-color: $white !important;\n }\n .dz-drag-hover {\n td {\n background: $hover-bg !important;\n }\n }\n }\n}\n.navigator-top-nav {\n position: relative;\n clear: both;\n min-height: 35px;\n padding: 15px 20px;\n background: $gray-super-light;\n border-bottom: $gray-lighter solid 1px;\n .breadcrumbs-container-wrapper {\n display: table;\n width: 100%;\n @media screen and (max-width: $screen-tablet) {\n display: block;\n }\n }\n .breadcrumbs-container-inner {\n display: table;\n table-layout: fixed;\n width: 100%;\n .filer-dropdown-container {\n display: table-cell;\n width: 30px;\n height: 35px;\n vertical-align: middle;\n span {\n line-height: 35px;\n height: 35px;\n vertical-align: middle;\n }\n }\n }\n .breadcrumbs-container {\n display: table-cell;\n vertical-align: middle;\n @media screen and (max-width: $screen-tablet) {\n position: static;\n margin-right: 20px;\n }\n }\n .tools-container {\n @include clearfix;\n display: table-cell;\n vertical-align: middle;\n text-align: right;\n margin-top: 2px;\n @media screen and (max-width: $screen-tablet) {\n display: inline;\n text-align: left;\n }\n }\n .nav-button {\n display: inline-block;\n color: $gray;\n font-size: 20px;\n line-height: 34px;\n vertical-align: top;\n margin: 0 10px;\n span {\n vertical-align: middle;\n }\n }\n .nav-button-filter {\n position: relative;\n top: -1px;\n }\n .nav-button-dots {\n margin: 0;\n padding: 0 15px;\n }\n .separator {\n display: inline-block;\n position: relative;\n vertical-align: top;\n width: 1px;\n height: 34px;\n margin: 0 5px;\n &:before {\n content: \"\";\n display: block;\n position: absolute;\n top: -14px;\n bottom: -11px;\n overflow: hidden;\n width: 1px;\n background-color: $gray-lighter;\n }\n }\n}\n.breadcrumb-min-width {\n .filer-navigator-breadcrumbs-dropdown-container,\n .navigator-breadcrumbs-name-dropdown-wrapper,\n .navigator-breadcrumbs-folder-name-wrapper,\n .breadcrumbs-container-wrapper,\n .breadcrumbs-container,\n .tools-container,\n .filter-files-container,\n .navigator-breadcrumbs,\n .navigator-button-wrapper {\n display: inline-block;\n text-align: left;\n .actions-wrapper {\n white-space: nowrap;\n margin-left: 0;\n margin-top: 10px;\n li:first-child {\n padding-left: 0;\n }\n }\n }\n .navigator-button-wrapper {\n margin-top: 10px;\n }\n .navigator-breadcrumbs-name-dropdown-wrapper {\n min-height: inherit;\n .filer-dropdown-container .fa-caret-down {\n vertical-align: text-top;\n }\n }\n .breadcrumbs-container-inner .filer-dropdown-container {\n display: inline-block !important;\n }\n .navigator-tools {\n white-space: normal;\n }\n .filter-files-container {\n width: 100%;\n margin-top: 10px;\n z-index: auto;\n }\n .breadcrumbs-container {\n margin-right: 0;\n }\n .navigator-breadcrumbs .icon {\n vertical-align: middle;\n }\n .navigator-breadcrumbs-folder-name-wrapper {\n float: left;\n width: calc(100% - 30px);\n }\n}\n\n.navigator-tools {\n @include clearfix;\n white-space: nowrap;\n @media screen and (max-width: $screen-tablet) {\n display: inline;\n }\n .actions-wrapper {\n display: inline-block;\n margin-bottom: 0;\n margin-left: 10px;\n a, a:hover {\n color: $gray-light !important;\n cursor: not-allowed;\n }\n @media screen and (max-width: $screen-tablet) {\n @include clearfix();\n float: none;\n margin-left: 0;\n }\n &.action-selected {\n a {\n color: $gray !important;\n cursor: pointer;\n }\n .actions-separated-list {\n display: inline-block;\n }\n }\n + .filer-list-type-switcher-wrapper {\n border-left: solid 1px $gray-lighter;\n margin-left: 0;\n }\n }\n .actions {\n display: none;\n float: right;\n @media screen and (max-width: $screen-tablet) {\n @include clearfix();\n float: none;\n margin-bottom: 10px;\n }\n .all,\n .question,\n .clear,\n .action-counter {\n font-size: $font-size-small;\n line-height: 34px;\n vertical-align: text-top;\n }\n .action-counter,\n .all {\n color: $gray-light;\n }\n .question,\n .clear {\n margin-left: 10px;\n padding-left: 10px;\n border-left: solid 1px $gray-lighter;\n }\n }\n .filer-list-type-switcher-wrapper {\n display: inline-block;\n margin-left: 10px;\n }\n\n}\n@media screen and (max-width: $screen-tablet) {\n .navigator-top-nav {\n .breadcrumbs-container {\n float: none;\n }\n .navigator-tools {\n float: none;\n .separator:before {\n top: 0;\n bottom: 0;\n }\n }\n }\n}\n// make sure that buttons break to new line on mobile view #677\n.navigator-button-wrapper {\n display: inline-block;\n vertical-align: top;\n text-align: right;\n margin-bottom: 0;\n margin-left: 10px;\n @media screen and (max-width: $screen-tablet) {\n display: block;\n float: none;\n text-align: left;\n margin-top: 0;\n margin-left: 0;\n }\n}\n.navigator-button {\n margin-right: 10px;\n &,\n &:visited,\n &:link:visited,\n &:link {\n @include button-variant($btn-action-color, $btn-action-bgcolor, $btn-action-border, true);\n display: inline-block;\n vertical-align: top;\n padding: 10px 20px !important;\n }\n .icon {\n position: relative;\n margin-right: 3px;\n }\n .fa-folder {\n top: 0;\n }\n &.navigator-button-upload {\n margin-right: 0;\n }\n}\n\n.upload-button-disabled {\n display: inline-block;\n}\n.navigator-button + .filer-dropdown-menu {\n margin-top: -2px;\n}\n\n.navigator {\n position: relative;\n overflow-x: auto;\n width: 100%;\n form {\n margin: 0;\n padding: 0;\n box-shadow: none;\n }\n}\n\n.filer-dropdown-container {\n display: inline-block;\n position: relative;\n vertical-align: top;\n .fa-caret-down, .cms-icon-caret-down {\n font-size: 14px;\n }\n .filer-dropdown-menu,\n + .filer-dropdown-menu {\n display: none;\n right: 0;\n left: auto;\n border: 0;\n box-shadow: $dropdown-shadow;\n > li > a {\n display: block;\n color: $color-primary;\n font-weight: normal;\n white-space: normal;\n padding: 12px 20px !important;\n @media screen and (min-width: $screen-tablet) {\n white-space: nowrap;\n }\n }\n label {\n display: block;\n line-height: 20px !important;\n text-transform: none;\n width: auto;\n margin: 5px 0 !important;\n padding: 0 10px !important;\n }\n input {\n position: relative;\n top: 4px;\n vertical-align: top;\n margin-right: 5px;\n }\n &.filer-dropdown-menu-checkboxes {\n width: 0;\n min-height: 50px;\n padding: 15px;\n border: 0;\n box-shadow: $dropdown-shadow;\n &:before {\n display: none;\n }\n .fa-close {\n position: absolute;\n top: 10px;\n right: 10px;\n color: $gray;\n cursor: pointer;\n &:hover {\n color: $color-primary;\n }\n }\n p {\n color: $gray-light !important;\n font-weight: normal;\n text-transform: uppercase;\n margin-bottom: 5px;\n }\n label {\n color: $gray !important;\n font-weight: normal;\n padding: 0 !important;\n margin-top: 0 !important;\n input {\n margin-left: 0;\n }\n }\n }\n a:hover {\n color: $white !important;\n background: $color-primary !important;\n }\n }\n &.open .filer-dropdown-menu {\n display: block;\n li {\n margin: 0;\n padding: 0;\n list-style-type: none;\n }\n }\n + .separator {\n margin-right: 10px;\n }\n}\n.filer-dropdown-container-down {\n > a {\n &,\n &:link,\n &:visited,\n &:link:visited {\n color: $gray;\n font-size: 20px;\n line-height: 35px;\n height: 35px;\n padding: 0 10px;\n }\n }\n .filer-dropdown-menu {\n right: auto;\n left: -14px;\n margin-right: 10px;\n }\n}\n\n.filer-dropdown-menu {\n position: absolute;\n top: 100%;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n margin: 2px 0 0;\n margin-top: 0 !important;\n padding: 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: $white;\n border-radius: 4px;\n background-clip: padding-box;\n &:before {\n position: absolute;\n top: -5px;\n left: 35px;\n z-index: -1;\n content: '';\n width: 10px;\n height: 10px;\n margin-left: -5px;\n transform: rotate(45deg);\n background-color: $white;\n }\n &.create-menu-dropdown:before {\n left: auto;\n right: 17px;\n }\n}\n\n.navigator-breadcrumbs {\n @include clearfix;\n display: table-cell;\n vertical-align: middle;\n font-size: 16px;\n white-space: nowrap;\n width: 60px;\n > a {\n color: $gray-darkest !important;\n }\n .icon {\n color: $gray-light;\n line-height: 35px;\n height: 35px;\n margin: 0 5px;\n &:before {\n vertical-align: middle;\n }\n }\n li {\n list-style-type: none;\n }\n}\n.navigator-breadcrumbs-folder-name-wrapper {\n display: table-cell;\n overflow: hidden;\n font-size: 16px;\n font-weight: bold;\n vertical-align: middle;\n white-space: nowrap;\n}\n.navigator-breadcrumbs-folder-name {\n display: block;\n overflow: hidden;\n white-space: normal;\n line-height: 35px;\n width: 100%;\n height: 35px;\n}\n.navigator-breadcrumbs-folder-name-inner {\n display: block;\n position: relative;\n overflow: hidden;\n line-height: 35px;\n height: 35px;\n width: 100%;\n text-overflow: ellipsis;\n}\n.filer-navigator-breadcrumbs-dropdown-container {\n position: relative;\n float: left;\n vertical-align: middle;\n margin: 0 7px 0 0;\n > a img {\n padding: 3px 0;\n }\n .navigator-breadcrumbs-dropdown {\n left: -15px !important;\n min-width: 200px;\n padding: 0;\n margin-top: 0;\n border: 0;\n box-shadow: $dropdown-shadow;\n > li {\n padding: 0;\n > a {\n color: $color-primary;\n padding: 12px 20px 3px !important;\n border-bottom: solid 1px $gray-lightest;\n &:hover {\n color: $white !important;\n background: $color-primary !important;\n }\n }\n &:last-child > a {\n border-bottom: none;\n }\n }\n img {\n position: relative;\n top: -5px;\n vertical-align: top;\n margin: 0 10px 0 0;\n }\n }\n}\n\n.navigator-dropdown-arrow-up {\n position: relative;\n left: 20px;\n overflow: hidden;\n width: 20px;\n height: 20px;\n margin-top: -20px;\n z-index: 1001;\n &:after {\n content: \"\";\n position: absolute;\n top: 15px;\n left: 5px;\n width: 10px;\n height: 10px;\n background: white;\n transform: rotate(45deg);\n box-shadow: $dropdown-shadow;\n }\n}\n\n.navigator-breadcrumbs-name-dropdown-wrapper {\n display: table;\n min-height: 35px;\n .filer-dropdown-menu {\n left: auto;\n right: -80px;\n &:before {\n right: 80px;\n left: auto;\n }\n }\n a {\n display: inline-block;\n }\n}\n\n.empty-filer-header-cell {\n display: table-cell;\n vertical-align: middle;\n}\n\n.filebrowser .navigator-thumbnail-list {\n overflow: hidden;\n .navigator-list {\n border-top: 0 !important;\n }\n .navigator-thumbnail-list-header {\n & > * {\n display: inline-block;\n text-transform: uppercase;\n margin: 0;\n padding: 0;\n padding-left: 10px;\n }\n .navigator-checkbox {\n float: right;\n padding-right: 20px;\n text-transform: initial;\n color: $color-primary;\n input[type=\"checkbox\"] {\n margin-left: 5px;\n vertical-align: middle;\n }\n }\n }\n .navigator-body {\n @include clearfix;\n padding: 0 !important;\n }\n .thumbnail-item {\n float: left;\n display: inline-block;\n padding: 10px;\n width: calc(var(--thumbnail-size, 120px) + 5px);\n height: calc(var(--thumbnail-size, 120px) + 5px);\n border: 1px solid $gray-lighter;\n margin: 16px 12px;\n background-color: $white;\n position: relative;\n overflow: hidden;\n .thumbnail-file-item-box {\n padding: 10px;\n width: calc(var(--thumbnail-size, 120px) + 5px);\n height: calc(var(--thumbnail-size, 120px) + 5px);\n border: 1px solid $gray-lighter;\n margin: 16px 12px;\n background-color: $white;\n &:hover {\n background-color: #f1faff;\n }\n }\n .navigator-checkbox {\n position: absolute;\n top: 5px;\n left: 5px;\n input {\n margin: 0;\n vertical-align: top;\n }\n }\n .item-thumbnail,\n .item-icon {\n height: 50%;\n width: 50%;\n margin: 10px auto;\n margin-bottom: 18px;\n a {\n display: block;\n height: 100%;\n width: 100%;\n }\n img {\n width: 100%;\n height: 100%;\n }\n }\n .item-name {\n background: transparent;\n text-align: center;\n word-break: break-word;\n }\n }\n .thumbnail-virtual-item {\n background-color: initial;\n }\n .thumbnail-folder-item {\n &:hover {\n background-color: #f1faff;\n }\n }\n .thumbnail-file-item {\n float: none;\n width: calc(var(--thumbnail-size, 120px) + 27px);\n height: calc(var(--thumbnail-size, 120px) + 80px);\n border: 0;\n padding: 0;\n background-color: transparent;\n .thumbnail-file-item-box {\n float: none;\n margin: 0;\n margin-bottom: 5px;\n }\n .item-thumbnail {\n margin: 0;\n height: 100%;\n width: 100%;\n }\n .item-name {\n position: relative;\n word-break: break-word;\n }\n }\n}\n\n.insertlinkButton {\n &:before {\n content:\"\" !important; // Necessary since djangocms-admin-style tries to add its own icon\n }\n span {\n font-size: 17px;\n }\n}\n","//##############################################################################\n// MODAL\n\n.popup {\n &.app-cmsplugin_filer_image {\n .form-row.field-image .field-box,\n .field-box.field-free_link,\n .field-box.field-page_link,\n .field-box.field-file_link {\n float: none !important;\n margin-right: 0 !important;\n margin-top: 20px !important;\n &:first-child {\n margin-top: 0 !important\n }\n input {\n width: 100% !important;\n }\n }\n .form-row .field-box {\n &.field-crop,\n &.field-upscale {\n margin-top: 30px;\n }\n }\n }\n &.delete-confirmation .colM ul {\n // makes sure that between list and button is a space #744\n margin-bottom: 25px !important;\n }\n .image-info-detail {\n padding: 0;\n padding-bottom: 25px;\n margin-bottom: 30px;\n box-shadow: none;\n border-bottom: solid 1px $gray-lighter;\n }\n &.change-list.filebrowser {\n #result_list tbody th,\n #result_list tbody td {\n // makes sure that changelist columns has correct height on modal window #665\n height: auto;\n }\n }\n .filer-dropzone {\n padding: 5px 20px;\n }\n form .form-row .filer-dropzone .filerFile {\n top: 8px;\n }\n &.filebrowser #container #content {\n margin: 0 !important;\n }\n .navigator-button-wrapper {\n float: right;\n @media screen and (max-width: $screen-tablet) {\n float: none;\n }\n }\n .navigator-top-nav {\n .tools-container {\n width: 70%;\n }\n .breadcrumbs-container {\n width: 30%;\n }\n .tools-container,\n .breadcrumbs-container {\n @media screen and (max-width: $screen-tablet) {\n width: 100%;\n }\n }\n }\n}\n","//##############################################################################\n// DRAG AND DROP\n\nform .form-row {\n &[class*=\"file\"],\n &[class*=\"folder\"],\n &[class*=\"img\"],\n &[class*=\"image\"],\n &[class*=\"visual\"] {\n .related-widget-wrapper-link {\n display: none;\n }\n }\n .filer-widget + .related-widget-wrapper-link,\n .filer-widget + * + .related-widget-wrapper-link {\n display: none;\n }\n .related-widget-wrapper:has(.filer-widget,.filer-dropzone) {\n width: 100%;\n }\n .filer-dropzone {\n @include clearfix;\n position: relative;\n min-width: 215px;\n border: solid 1px $gray-lighter;\n border-radius: $border-radius-base;\n background-color: $gray-lightest;\n box-sizing: border-box !important;\n .z-index-fix {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n }\n &.dz-drag-hover {\n background-color: $color-primary;\n filter: brightness(1.5);\n border: solid 2px $color-primary !important;\n .z-index-fix {\n z-index: 1;\n }\n .dz-message {\n opacity: 1;\n display: block !important;\n visibility: visible;\n }\n .filerFile {\n display: none;\n }\n .dz-message, .dz-message .icon {\n color: $color-primary !important;\n }\n }\n &.dz-started .fileUpload {\n display: none;\n }\n .dz-preview {\n width: 100%;\n min-height: auto;\n margin-right: 0;\n margin-bottom: 0;\n margin-left: 0;\n padding-bottom: 10px;\n border-bottom: solid 1px $gray-lighter;\n &.dz-error {\n position: relative;\n .dz-error-message {\n display: none;\n }\n &:hover .dz-error-message {\n display: block;\n }\n }\n .dz-details {\n min-width: calc(100% - 80px);\n max-width: calc(100% - 80px);\n margin-top: 7px;\n margin-left: 40px;\n padding: 0;\n opacity: 1;\n .dz-filename,\n .dz-filename:hover,\n .dz-size {\n float: left;\n text-align: left;\n span {\n color: $gray;\n border: 0 !important;\n background-color: transparent !important;\n }\n }\n }\n .dz-remove {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='currentColor' class='bi bi-trash' viewBox='0 0 16 16'%3E%3Cpath d='M5.5 5.5A.5.5 0 0 1 6 6v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5Zm2.5 0a.5.5 0 0 1 .5.5v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5Zm3 .5a.5.5 0 0 0-1 0v6a.5.5 0 0 0 1 0V6Z'/%3E%3Cpath d='M14.5 3a1 1 0 0 1-1 1H13v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V4h-.5a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1H6a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1h3.5a1 1 0 0 1 1 1v1ZM4.118 4 4 4.059V13a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V4.059L11.882 4H4.118ZM2.5 3h11V2h-11v1Z'/%3E%3C/svg%3E%0A\");\n background-size:contain;\n display: inline-block;\n position: absolute;\n top: 7px;\n right: 25px;\n font: 0/0 a;\n width: 18px;\n height: 18px;\n }\n .dz-error-message {\n top: 65px;\n left: 0;\n width: 100%;\n }\n .dz-success-mark,\n .dz-error-mark {\n top: 5px;\n right: 0;\n left: auto;\n margin-top: 0;\n &:before {\n color: $gray;\n }\n svg {\n display: none;\n }\n }\n .dz-success-mark {\n // Check icon\n width: 16px;\n height: 16px;\n background-image: url(\"data:image/svg+xml,%3Csvg width='13' height='13' viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%2370bf2b' d='M1412 734q0-28-18-46l-91-90q-19-19-45-19t-45 19l-408 407-226-226q-19-19-45-19t-45 19l-91 90q-18 18-18 46 0 27 18 45l362 362q19 19 45 19 27 0 46-19l543-543q18-18 18-45zm252 162q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z'/%3E%3C/svg%3E%0A\");\n background-size: contain;\n }\n .dz-error-mark {\n // Remove icon\n background-image: url(\"data:image/svg+xml,%3Csvg width='13' height='13' viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%23dd4646' d='M1277 1122q0-26-19-45l-181-181 181-181q19-19 19-45 0-27-19-46l-90-90q-19-19-46-19-26 0-45 19l-181 181-181-181q-19-19-45-19-27 0-46 19l-90 90q-19 19-19 46 0 26 19 45l181 181-181 181q-19 19-19 45 0 27 19 46l90 90q19 19 46 19 26 0 45-19l181-181 181 181q19 19 45 19 27 0 46-19l90-90q19-19 19-46zm387-226q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z'/%3E%3C/svg%3E%0A\");\n width: 16px;\n height: 16px;\n background-size: contain;\n }\n &.dz-image-preview,\n &.dz-file-preview {\n background-color: transparent;\n .dz-image {\n overflow: hidden;\n width: 36px;\n height: 36px;\n border: solid 1px $gray-lighter;\n border-radius: 0;\n img {\n width: 100%;\n height: auto;\n }\n }\n }\n .dz-progress {\n top: 18px;\n left: 0;\n width: calc(100% - 40px);\n height: 10px;\n margin-left: 40px;\n }\n }\n .dz-message {\n float: right;\n color: $gray-dropzone;\n width: 100%;\n margin: 15px 0 0;\n }\n .icon {\n position: relative;\n top: 3px;\n color: $gray-dropzone;\n font-size: 24px;\n margin-right: 10px;\n }\n .filerFile .related-lookup {\n @include button-variant($btn-action-color, $btn-action-bgcolor, $btn-action-border, true);\n float: left !important;\n overflow: hidden;\n // makes true that button has correct height #668\n line-height: $font-size-normal;\n width: auto !important;\n height: auto !important;\n padding: 10px 20px !important;\n margin-top: 24px;\n margin-left: 10px;\n text-align: center !important;\n cursor: pointer;\n .cms-icon {\n color: $white;\n font-size: 17px;\n margin: 0 10px 0 0;\n vertical-align: middle;\n }\n &:before {\n display: none;\n }\n .choose-file,\n .replace-file,\n .edit-file {\n color: $white;\n margin: 0;\n }\n .replace-file {\n display: none;\n }\n &.edit {\n display: none;\n }\n &.related-lookup-change {\n @include button-variant($btn-default-color, $btn-default-bgcolor, $btn-default-border, true);\n float: right !important;\n padding: 5px 0 !important;\n width: 36px !important;\n height: 36px !important;\n &:focus {\n background-color: $white !important;\n }\n span {\n text-align: center;\n line-height: 24px;\n }\n .cms-icon {\n color: $btn-default-color;\n margin-right: 0 !important;\n }\n .choose-file {\n display: none;\n }\n .replace-file {\n display: block;\n }\n &.lookup {\n display: block !important;\n }\n &.edit {\n display: block;\n }\n }\n }\n // makes sure that filer clear button has correct size #669\n .filerClearer {\n width: 36px !important;\n height: 36px !important;\n color: $color-danger;\n }\n .filerFile {\n position: absolute;\n top: 9px;\n // required for django CMS <= 3.1 #673\n left: 20px;\n width: calc(100% - 40px);\n img[src*=nofile] {\n background-color: $white;\n }\n // make sure that text crops if there is not enough space #670\n span:not(:empty):not(.choose-file):not(.replace-file):not(.edit-file) {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n width: calc(100% - 260px);\n height: 80px;\n line-height: 80px;\n }\n // required for django CMS <= 3.1 #673\n img {\n width: 80px;\n height: 80px;\n margin-right: 10px;\n border: solid 1px $gray-lighter;\n border-radius: $border-radius-base;\n vertical-align: top;\n &[src*=\"nofile\"] {\n box-sizing: border-box;\n margin-right: 0;\n border: solid 1px $gray-lighter;\n border-radius: $border-radius-base;\n }\n }\n // required for django CMS <= 3.1\n a {\n box-sizing: border-box;\n padding-top: 10px !important;\n }\n // required for django CMS <= 3.1 #673\n span {\n display: inline-block;\n color: $gray;\n font-weight: normal;\n margin-bottom: 6px;\n text-align: left;\n &:empty + .related-lookup {\n float: none !important;\n margin-left: 0 !important;\n }\n }\n // required for django CMS <= 3.1 #673\n a.filerClearer {\n @include button-variant($btn-default-color, $btn-default-bgcolor, $btn-default-border, true);\n float: right;\n padding: 5px 0 !important;\n margin: 24px 0 0 10px;\n width: 36px;\n height: 36px;\n text-align: center;\n cursor: pointer;\n span:before {\n color: $color-danger !important;\n }\n span {\n text-align: center;\n line-height: 24px;\n }\n }\n\n }\n &.filer-dropzone-mobile {\n .filerFile {\n text-align: center;\n }\n .dz-message {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n // make sure that drag and drop widget looks nice on mobile #670\n margin-top: 75px;\n }\n &.js-object-attached .filerFile {\n text-align: center;\n &.js-file-selector {\n @media screen and (max-width: $screen-tablet-filer) {\n .description_text {\n text-overflow: ellipsis;\n width: calc(100% - 250px);\n overflow: hidden;\n }\n }\n >span:not(.choose-file):not(.replace-file):not(.edit-file), .dz-name {\n width: calc(100% - 250px);\n }\n }\n }\n\n }\n &.filer-dropzone-folder .filerFile {\n top: 8px;\n #id_folder_description_txt {\n float: left;\n }\n }\n\n @media (max-width: 767px) {\n flex-grow: 1;\n }\n\n }\n}\n\n.filer-dropzone {\n min-height: 100px !important;\n .dz-upload {\n height: 5px;\n background-color: $color-primary;\n }\n .dz-name {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n max-width: calc(100% - 145px);\n }\n .dz-thumbnail {\n display: inline-block;\n overflow: hidden;\n vertical-align: top;\n width: 80px;\n height: 80px;\n margin-right: 10px;\n border: solid 1px $gray-lighter;\n border-radius: 3px;\n background: $white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath fill='%232980b9' d='M5 2c-1.105 0-2 .9-2 2v18c0 1.1.895 2 2 2h14c1.105 0 2-.9 2-2V8l-6-6z'/%3E%3Cpath fill='%233498db' d='M5 1c-1.105 0-2 .9-2 2v18c0 1.1.895 2 2 2h14c1.105 0 2-.9 2-2V7l-6-6z'/%3E%3Cpath fill='%232980b9' d='m21 7-6-6v4c0 1.1.895 2 2 2z'/%3E%3C/svg%3E\");\n background-size: contain;\n img {\n background: $white;\n &[src=\"\"],\n &:not([src]) {\n width: 104%;\n height: 104%;\n margin: -2%;\n }\n }\n }\n}\n\n.filer-dropzone-info-message {\n position: fixed;\n bottom: 35px;\n left: 50%;\n z-index: 2;\n text-align: center;\n width: 270px;\n max-height: 300px;\n overflow-y: auto;\n margin: -50px 0 0 -150px;\n padding: 15px 15px 0;\n border-radius: $border-radius-base;\n background: $white;\n box-shadow: $base-box-shadow;\n .icon {\n font-size: 35px;\n color: $color-primary;\n }\n .text {\n margin: 5px 0 10px;\n }\n}\n.filer-dropzone-upload-info {\n margin-top: 10px;\n // make sure that file name on upload progress is cut #675\n .filer-dropzone-file-name {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n &:empty {\n margin-top: 0;\n }\n}\n.filer-dropzone-progress {\n height: 5px;\n margin-top: 5px;\n background-color: $color-primary;\n}\n\n.filer-dropzone-upload-welcome .folder {\n color: $color-primary;\n padding: 10px 0 0;\n margin: 0 -15px;\n border-top: solid 1px $gray-lighter;\n img,\n span {\n vertical-align: middle;\n }\n img {\n margin-right: 5px;\n }\n .folder-inner {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n padding: 0 10px;\n }\n}\n\n.filer-dropzone-cancel {\n padding-top: 10px;\n border-top: solid 1px $gray-lighter;\n margin: 15px -15px 10px;\n a {\n font-size: $font-size-small;\n color: $gray !important;\n }\n}\n.filer-dropzone-upload-success,\n.filer-dropzone-upload-canceled {\n margin: 0 -15px 10px;\n}\n\n.filer-dropzone-upload-count {\n padding-bottom: 10px;\n margin: 10px -15px;\n border-bottom: solid 1px $gray-lighter;\n}\n",".filer-tooltip-wrapper {\n position: relative;\n}\n\n.filer-tooltip {\n position: absolute;\n left: -30px;\n right: -30px;\n color: $gray;\n text-align: center;\n font-size: $font-size-small !important;\n line-height: 15px !important;\n white-space: normal;\n margin-top: 5px;\n padding: 10px;\n background-color: $white;\n box-shadow: 0 0 10px rgba(black,.25);\n border-radius: 5px;\n z-index: 10;\n cursor: default;\n &:before {\n position: absolute;\n top: -3px;\n left: 50%;\n z-index: -1;\n content: '';\n width: 9px;\n height: 9px;\n margin-left: -5px;\n transform: rotate(45deg);\n background-color: $white;\n }\n}\n\n.disabled-btn-tooltip {\n display: none;\n outline: none;\n}\n","/*\n * The MIT License\n * Copyright (c) 2012 Matias Meno \n */\n@keyframes passing-through {\n 0% {\n opacity: 0;\n transform: translateY(40px);\n }\n 30%,\n 70% {\n opacity: 1;\n transform: translateY(0);\n }\n 100% {\n opacity: 0;\n transform: translateY(-40px);\n }\n}\n@keyframes slide-in {\n 0% {\n opacity: 0;\n transform: translateY(40px);\n }\n 30% {\n opacity: 1;\n transform: translateY(0);\n }\n}\n@keyframes pulse {\n 0% {\n transform: scale(1);\n }\n 10% {\n transform: scale(1.1);\n }\n 20% {\n transform: scale(1);\n }\n}\n.filer-dropzone,\n.filer-dropzone * {\n box-sizing: border-box;\n}\n\n.filer-dropzone {\n min-height: 150px;\n padding: 20px 20px;\n border: 2px solid rgba(0, 0, 0, 0.3);\n background: white;\n}\n.filer-dropzone.dz-clickable {\n cursor: pointer;\n}\n.filer-dropzone.dz-clickable * {\n cursor: default;\n}\n.filer-dropzone.dz-clickable .dz-message,\n.filer-dropzone.dz-clickable .dz-message * {\n cursor: pointer;\n}\n.filer-dropzone.dz-drag-hover {\n border-style: solid;\n}\n.filer-dropzone.dz-drag-hover .dz-message {\n opacity: 0.5;\n}\n.filer-dropzone .dz-message {\n text-align: center;\n margin: 2em 0;\n}\n.filer-dropzone .dz-preview {\n display: inline-block;\n position: relative;\n vertical-align: top;\n min-height: 100px;\n margin: 16px;\n}\n.filer-dropzone .dz-preview:hover {\n z-index: 1000;\n}\n.filer-dropzone .dz-preview:hover .dz-details {\n opacity: 1;\n}\n.filer-dropzone .dz-preview.dz-file-preview .dz-image {\n border-radius: 20px;\n background: $gray-light;\n background: linear-gradient(to bottom, $gray-lightest, $gray-lighter);\n}\n.filer-dropzone .dz-preview.dz-file-preview .dz-details {\n opacity: 1;\n}\n.filer-dropzone .dz-preview.dz-image-preview {\n background: white;\n}\n.filer-dropzone .dz-preview.dz-image-preview .dz-details {\n transition: opacity 0.2s linear;\n}\n.filer-dropzone .dz-preview .dz-remove {\n display: block;\n font-size: 14px;\n text-align: center;\n border: none;\n cursor: pointer;\n}\n.filer-dropzone .dz-preview .dz-remove:hover {\n text-decoration: underline;\n}\n.filer-dropzone .dz-preview:hover .dz-details {\n opacity: 1;\n}\n.filer-dropzone .dz-preview .dz-details {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 20;\n color: rgba(0, 0, 0, 0.9);\n font-size: 13px;\n line-height: 150%;\n text-align: center;\n min-width: 100%;\n max-width: 100%;\n padding: 2em 1em;\n opacity: 0;\n}\n.filer-dropzone .dz-preview .dz-details .dz-size {\n font-size: 16px;\n margin-bottom: 1em;\n}\n.filer-dropzone .dz-preview .dz-details .dz-filename {\n white-space: nowrap;\n}\n.filer-dropzone .dz-preview .dz-details .dz-filename:hover span {\n border: 1px solid rgba(200, 200, 200, 0.8);\n background-color: rgba(255, 255, 255, 0.8);\n}\n.filer-dropzone .dz-preview .dz-details .dz-filename:not(:hover) {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.filer-dropzone .dz-preview .dz-details .dz-filename:not(:hover) span {\n border: 1px solid transparent;\n}\n.filer-dropzone .dz-preview .dz-details .dz-filename span,\n.filer-dropzone .dz-preview .dz-details .dz-size span {\n padding: 0 0.4em;\n border-radius: 3px;\n background-color: rgba(255, 255, 255, 0.4);\n}\n.filer-dropzone .dz-preview:hover .dz-image img {\n transform: scale(1.05, 1.05);\n\n filter: blur(8px);\n}\n.filer-dropzone .dz-preview .dz-image {\n display: block;\n position: relative;\n overflow: hidden;\n z-index: 10;\n width: 120px;\n height: 120px;\n border-radius: 20px;\n}\n.filer-dropzone .dz-preview .dz-image img {\n display: block;\n}\n.filer-dropzone .dz-preview.dz-success .dz-success-mark {\n animation: passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);\n}\n.filer-dropzone .dz-preview.dz-error .dz-error-mark {\n opacity: 1;\n animation: slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);\n}\n.filer-dropzone .dz-preview .dz-success-mark,\n.filer-dropzone .dz-preview .dz-error-mark {\n display: block;\n position: absolute;\n top: 50%;\n left: 50%;\n z-index: 500;\n margin-top: -27px;\n margin-left: -27px;\n pointer-events: none;\n opacity: 0;\n}\n.filer-dropzone .dz-preview .dz-success-mark svg,\n.filer-dropzone .dz-preview .dz-error-mark svg {\n display: block;\n width: 54px;\n height: 54px;\n}\n.filer-dropzone .dz-preview.dz-processing .dz-progress {\n opacity: 1;\n transition: all 0.2s linear;\n}\n.filer-dropzone .dz-preview.dz-complete .dz-progress {\n opacity: 0;\n transition: opacity 0.4s ease-in;\n}\n.filer-dropzone .dz-preview:not(.dz-processing) .dz-progress {\n animation: pulse 6s ease infinite;\n}\n.filer-dropzone .dz-preview .dz-progress {\n position: absolute;\n top: 50%;\n left: 50%;\n overflow: hidden;\n z-index: 1000;\n width: 80px;\n height: 16px;\n margin-top: -8px;\n margin-left: -40px;\n border-radius: 8px;\n pointer-events: none;\n opacity: 1;\n background: rgba(255, 255, 255, 0.9);\n}\n.filer-dropzone .dz-preview .dz-progress .dz-upload {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 0;\n background: $gray-darkest;\n background: linear-gradient(to bottom, $gray, $gray-darkest);\n transition: width 300ms ease-in-out;\n}\n.filer-dropzone .dz-preview.dz-error .dz-error-message {\n display: block;\n}\n.filer-dropzone .dz-preview.dz-error:hover .dz-error-message {\n pointer-events: auto;\n opacity: 1;\n}\n.filer-dropzone .dz-preview .dz-error-message {\n display: block;\n display: none;\n position: absolute;\n top: 130px;\n left: -10px;\n z-index: 1000;\n color: $white;\n font-size: 13px;\n width: 140px;\n padding: 0.5em 1.2em;\n border-radius: 8px;\n pointer-events: none;\n opacity: 0;\n background: #be2626;\n background: linear-gradient(to bottom, #be2626, #a92222);\n transition: opacity 0.3s ease;\n}\n.filer-dropzone .dz-preview .dz-error-message:after {\n content: \"\";\n position: absolute;\n top: -6px;\n left: 64px;\n width: 0;\n height: 0;\n border-right: 6px solid transparent;\n border-bottom: 6px solid #be2626;\n border-left: 6px solid transparent;\n}\n"]} \ No newline at end of file diff --git a/filer/static/filer/fonts/django-filer-iconfont.eot b/filer/static/filer/fonts/django-filer-iconfont.eot new file mode 100644 index 000000000..2b047ba3b Binary files /dev/null and b/filer/static/filer/fonts/django-filer-iconfont.eot differ diff --git a/filer/static/filer/fonts/django-filer-iconfont.svg b/filer/static/filer/fonts/django-filer-iconfont.svg new file mode 100644 index 000000000..8bb3132b7 --- /dev/null +++ b/filer/static/filer/fonts/django-filer-iconfont.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/filer/static/filer/fonts/django-filer-iconfont.ttf b/filer/static/filer/fonts/django-filer-iconfont.ttf new file mode 100644 index 000000000..7c0224e6c Binary files /dev/null and b/filer/static/filer/fonts/django-filer-iconfont.ttf differ diff --git a/filer/static/filer/fonts/django-filer-iconfont.woff b/filer/static/filer/fonts/django-filer-iconfont.woff new file mode 100644 index 000000000..98a0738c6 Binary files /dev/null and b/filer/static/filer/fonts/django-filer-iconfont.woff differ diff --git a/filer/static/filer/fonts/django-filer-iconfont.woff2 b/filer/static/filer/fonts/django-filer-iconfont.woff2 new file mode 100644 index 000000000..ff7d86d55 Binary files /dev/null and b/filer/static/filer/fonts/django-filer-iconfont.woff2 differ diff --git a/filer/static/filer/fonts/fa-brands-400.eot b/filer/static/filer/fonts/fa-brands-400.eot new file mode 100644 index 000000000..cba6c6cce Binary files /dev/null and b/filer/static/filer/fonts/fa-brands-400.eot differ diff --git a/filer/static/filer/fonts/fa-brands-400.svg b/filer/static/filer/fonts/fa-brands-400.svg new file mode 100644 index 000000000..b9881a43b --- /dev/null +++ b/filer/static/filer/fonts/fa-brands-400.svg @@ -0,0 +1,3717 @@ + + + + +Created by FontForge 20201107 at Wed Aug 4 12:25:29 2021 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/filer/static/filer/fonts/fa-brands-400.ttf b/filer/static/filer/fonts/fa-brands-400.ttf new file mode 100644 index 000000000..8d75dedda Binary files /dev/null and b/filer/static/filer/fonts/fa-brands-400.ttf differ diff --git a/filer/static/filer/fonts/fa-brands-400.woff b/filer/static/filer/fonts/fa-brands-400.woff new file mode 100644 index 000000000..3375bef09 Binary files /dev/null and b/filer/static/filer/fonts/fa-brands-400.woff differ diff --git a/filer/static/filer/fonts/fa-brands-400.woff2 b/filer/static/filer/fonts/fa-brands-400.woff2 new file mode 100644 index 000000000..402f81c0b Binary files /dev/null and b/filer/static/filer/fonts/fa-brands-400.woff2 differ diff --git a/filer/static/filer/fonts/fa-regular-400.eot b/filer/static/filer/fonts/fa-regular-400.eot new file mode 100644 index 000000000..a4e598936 Binary files /dev/null and b/filer/static/filer/fonts/fa-regular-400.eot differ diff --git a/filer/static/filer/fonts/fa-regular-400.svg b/filer/static/filer/fonts/fa-regular-400.svg new file mode 100644 index 000000000..463af27c0 --- /dev/null +++ b/filer/static/filer/fonts/fa-regular-400.svg @@ -0,0 +1,801 @@ + + + + +Created by FontForge 20201107 at Wed Aug 4 12:25:29 2021 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/filer/static/filer/fonts/fa-regular-400.ttf b/filer/static/filer/fonts/fa-regular-400.ttf new file mode 100644 index 000000000..7157aafba Binary files /dev/null and b/filer/static/filer/fonts/fa-regular-400.ttf differ diff --git a/filer/static/filer/fonts/fa-regular-400.woff b/filer/static/filer/fonts/fa-regular-400.woff new file mode 100644 index 000000000..ad077c6be Binary files /dev/null and b/filer/static/filer/fonts/fa-regular-400.woff differ diff --git a/filer/static/filer/fonts/fa-regular-400.woff2 b/filer/static/filer/fonts/fa-regular-400.woff2 new file mode 100644 index 000000000..56328948b Binary files /dev/null and b/filer/static/filer/fonts/fa-regular-400.woff2 differ diff --git a/filer/static/filer/fonts/fa-solid-900.eot b/filer/static/filer/fonts/fa-solid-900.eot new file mode 100644 index 000000000..e99417197 Binary files /dev/null and b/filer/static/filer/fonts/fa-solid-900.eot differ diff --git a/filer/static/filer/fonts/fa-solid-900.svg b/filer/static/filer/fonts/fa-solid-900.svg new file mode 100644 index 000000000..00296e959 --- /dev/null +++ b/filer/static/filer/fonts/fa-solid-900.svg @@ -0,0 +1,5034 @@ + + + + +Created by FontForge 20201107 at Wed Aug 4 12:25:29 2021 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/filer/static/filer/fonts/fa-solid-900.ttf b/filer/static/filer/fonts/fa-solid-900.ttf new file mode 100644 index 000000000..25abf389e Binary files /dev/null and b/filer/static/filer/fonts/fa-solid-900.ttf differ diff --git a/filer/static/filer/fonts/fa-solid-900.woff b/filer/static/filer/fonts/fa-solid-900.woff new file mode 100644 index 000000000..23ee66344 Binary files /dev/null and b/filer/static/filer/fonts/fa-solid-900.woff differ diff --git a/filer/static/filer/fonts/fa-solid-900.woff2 b/filer/static/filer/fonts/fa-solid-900.woff2 new file mode 100644 index 000000000..2217164f0 Binary files /dev/null and b/filer/static/filer/fonts/fa-solid-900.woff2 differ diff --git a/filer/static/filer/fonts/src/arrow-down.svg b/filer/static/filer/fonts/src/arrow-down.svg new file mode 100644 index 000000000..ad16b7805 --- /dev/null +++ b/filer/static/filer/fonts/src/arrow-down.svg @@ -0,0 +1,41 @@ + + + + + + diff --git a/filer/static/filer/fonts/src/caret-down.svg b/filer/static/filer/fonts/src/caret-down.svg new file mode 100644 index 000000000..fca4895cd --- /dev/null +++ b/filer/static/filer/fonts/src/caret-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/filer/static/filer/fonts/src/chevron-right.svg b/filer/static/filer/fonts/src/chevron-right.svg new file mode 100644 index 000000000..a94274f88 --- /dev/null +++ b/filer/static/filer/fonts/src/chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/filer/static/filer/fonts/src/download.svg b/filer/static/filer/fonts/src/download.svg new file mode 100644 index 000000000..5a826bb9e --- /dev/null +++ b/filer/static/filer/fonts/src/download.svg @@ -0,0 +1,4 @@ + + + + diff --git a/filer/static/filer/fonts/src/expand.svg b/filer/static/filer/fonts/src/expand.svg new file mode 100644 index 000000000..57ccd9f53 --- /dev/null +++ b/filer/static/filer/fonts/src/expand.svg @@ -0,0 +1,3 @@ + + + diff --git a/filer/static/filer/fonts/src/link.svg b/filer/static/filer/fonts/src/link.svg new file mode 100644 index 000000000..06ea8f409 --- /dev/null +++ b/filer/static/filer/fonts/src/link.svg @@ -0,0 +1,4 @@ + + + + diff --git a/filer/static/filer/fonts/src/move-to-folder.svg b/filer/static/filer/fonts/src/move-to-folder.svg new file mode 100644 index 000000000..1b93780fe --- /dev/null +++ b/filer/static/filer/fonts/src/move-to-folder.svg @@ -0,0 +1,3 @@ + + + diff --git a/filer/static/filer/fonts/src/picture.svg b/filer/static/filer/fonts/src/picture.svg new file mode 100644 index 000000000..5642c39ef --- /dev/null +++ b/filer/static/filer/fonts/src/picture.svg @@ -0,0 +1,4 @@ + + + + diff --git a/filer/static/filer/fonts/src/remove-selection.svg b/filer/static/filer/fonts/src/remove-selection.svg new file mode 100644 index 000000000..8f5a4ef75 --- /dev/null +++ b/filer/static/filer/fonts/src/remove-selection.svg @@ -0,0 +1,3 @@ + + + diff --git a/filer/static/filer/fonts/src/select.svg b/filer/static/filer/fonts/src/select.svg new file mode 100644 index 000000000..c8b67a60a --- /dev/null +++ b/filer/static/filer/fonts/src/select.svg @@ -0,0 +1,3 @@ + + + diff --git a/filer/static/filer/fonts/src/th-large.svg b/filer/static/filer/fonts/src/th-large.svg new file mode 100644 index 000000000..347853e02 --- /dev/null +++ b/filer/static/filer/fonts/src/th-large.svg @@ -0,0 +1,3 @@ + + + diff --git a/filer/static/filer/fonts/src/th-list.svg b/filer/static/filer/fonts/src/th-list.svg new file mode 100644 index 000000000..ed2dbf47d --- /dev/null +++ b/filer/static/filer/fonts/src/th-list.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/filer/static/filer/fonts/src/upload.svg b/filer/static/filer/fonts/src/upload.svg new file mode 100644 index 000000000..166624b48 --- /dev/null +++ b/filer/static/filer/fonts/src/upload.svg @@ -0,0 +1,3 @@ + + + diff --git a/filer/static/filer/icons/cloud-up.svg b/filer/static/filer/icons/cloud-up.svg new file mode 100644 index 000000000..75fb6a91c --- /dev/null +++ b/filer/static/filer/icons/cloud-up.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/filer/static/filer/icons/file-audio.svg b/filer/static/filer/icons/file-audio.svg new file mode 100644 index 000000000..070886d5f --- /dev/null +++ b/filer/static/filer/icons/file-audio.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/filer/static/filer/icons/file-empty.svg b/filer/static/filer/icons/file-empty.svg new file mode 100644 index 000000000..04ed00ad4 --- /dev/null +++ b/filer/static/filer/icons/file-empty.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/filer/static/filer/icons/file-font.svg b/filer/static/filer/icons/file-font.svg new file mode 100644 index 000000000..77ce44c3c --- /dev/null +++ b/filer/static/filer/icons/file-font.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/filer/static/filer/icons/file-missing.svg b/filer/static/filer/icons/file-missing.svg new file mode 100644 index 000000000..8d1d17a25 --- /dev/null +++ b/filer/static/filer/icons/file-missing.svg @@ -0,0 +1,84 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/filer/static/filer/icons/file-pdf.svg b/filer/static/filer/icons/file-pdf.svg new file mode 100644 index 000000000..a52203f52 --- /dev/null +++ b/filer/static/filer/icons/file-pdf.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/filer/static/filer/icons/file-picture.svg b/filer/static/filer/icons/file-picture.svg new file mode 100644 index 000000000..cffeb3218 --- /dev/null +++ b/filer/static/filer/icons/file-picture.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/filer/static/filer/icons/file-unknown.svg b/filer/static/filer/icons/file-unknown.svg new file mode 100644 index 000000000..426904a11 --- /dev/null +++ b/filer/static/filer/icons/file-unknown.svg @@ -0,0 +1,69 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/filer/static/filer/icons/file-video.svg b/filer/static/filer/icons/file-video.svg new file mode 100644 index 000000000..04576b68b --- /dev/null +++ b/filer/static/filer/icons/file-video.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/filer/static/filer/icons/file-zip.svg b/filer/static/filer/icons/file-zip.svg new file mode 100644 index 000000000..6d0afa9ba --- /dev/null +++ b/filer/static/filer/icons/file-zip.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/filer/static/filer/icons/folder-dropdown.svg b/filer/static/filer/icons/folder-dropdown.svg new file mode 100644 index 000000000..5afa4e93e --- /dev/null +++ b/filer/static/filer/icons/folder-dropdown.svg @@ -0,0 +1,85 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/filer/static/filer/icons/folder-root.svg b/filer/static/filer/icons/folder-root.svg new file mode 100644 index 000000000..9ee4a132b --- /dev/null +++ b/filer/static/filer/icons/folder-root.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/filer/static/filer/icons/folder-unfiled.svg b/filer/static/filer/icons/folder-unfiled.svg new file mode 100644 index 000000000..da2b21935 --- /dev/null +++ b/filer/static/filer/icons/folder-unfiled.svg @@ -0,0 +1,77 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/filer/static/filer/icons/folder.svg b/filer/static/filer/icons/folder.svg new file mode 100644 index 000000000..72f50ffba --- /dev/null +++ b/filer/static/filer/icons/folder.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/filer/static/filer/img/button-bg.gif b/filer/static/filer/img/button-bg.gif new file mode 100644 index 000000000..10106108d Binary files /dev/null and b/filer/static/filer/img/button-bg.gif differ diff --git a/filer/static/filer/img/icon_changelink.gif b/filer/static/filer/img/icon_changelink.gif new file mode 100644 index 000000000..0bd9d502b Binary files /dev/null and b/filer/static/filer/img/icon_changelink.gif differ diff --git a/filer/static/filer/img/icon_deletelink.gif b/filer/static/filer/img/icon_deletelink.gif new file mode 100644 index 000000000..165f5cca4 Binary files /dev/null and b/filer/static/filer/img/icon_deletelink.gif differ diff --git a/filer/static/filer/js/addons/copy-move-files.js b/filer/static/filer/js/addons/copy-move-files.js new file mode 100644 index 000000000..1673c96d8 --- /dev/null +++ b/filer/static/filer/js/addons/copy-move-files.js @@ -0,0 +1,32 @@ +'use strict'; +/* global Cl */ + +/* + This functionality is used in folder/choose_copy_destination.html template + to disable submit if there is only one folder to copy +*/ + +document.addEventListener('DOMContentLoaded', () => { + const destination = document.getElementById('destination'); + if (!destination) { + return; + } + + const destinationOptions = destination.querySelectorAll('option'); + const destinationOptionLength = destinationOptions.length; + const submit = document.querySelector('.js-submit-copy-move'); + const tooltip = document.querySelector('.js-disabled-btn-tooltip'); + + if (destinationOptionLength === 1 && destinationOptions[0].disabled) { + if (submit) { + submit.style.display = 'none'; + } + if (tooltip) { + tooltip.style.display = 'inline-block'; + } + } + + if (Cl.filerTooltip) { + Cl.filerTooltip(); + } +}); diff --git a/filer/static/filer/js/addons/dropdown-menu.js b/filer/static/filer/js/addons/dropdown-menu.js new file mode 100644 index 000000000..512dda3d5 --- /dev/null +++ b/filer/static/filer/js/addons/dropdown-menu.js @@ -0,0 +1,249 @@ +/* ======================================================================== + * Bootstrap: dropdown.js v3.3.6 + * http://getbootstrap.com/javascript/#dropdowns + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ +'use strict'; + +(() => { + // DROPDOWN CLASS DEFINITION + // ========================= + + const backdropClass = 'filer-dropdown-backdrop'; + const toggleSelector = '[data-toggle="filer-dropdown"]'; + + class Dropdown { + constructor(element) { + this.element = element; + element.addEventListener('click', () => this.toggle()); + } + + toggle() { + const element = this.element; + const parent = getParent(element); + const isActive = parent.classList.contains('open'); + const relatedTarget = { relatedTarget: element }; + + if (element.disabled || element.classList.contains('disabled')) { + return false; + } + + clearMenus(); + + if (!isActive) { + if ('ontouchstart' in document.documentElement && !parent.closest('.navbar-nav')) { + // if mobile we use a backdrop because click events don't delegate + const backdrop = document.createElement('div'); + backdrop.className = backdropClass; + element.parentNode.insertBefore(backdrop, element.nextSibling); + backdrop.addEventListener('click', clearMenus); + } + + const showEvent = new CustomEvent('show.bs.filer-dropdown', { + bubbles: true, + cancelable: true, + detail: relatedTarget + }); + parent.dispatchEvent(showEvent); + + if (showEvent.defaultPrevented) { + return false; + } + + element.focus(); + element.setAttribute('aria-expanded', 'true'); + parent.classList.add('open'); + + const shownEvent = new CustomEvent('shown.bs.filer-dropdown', { + bubbles: true, + detail: relatedTarget + }); + parent.dispatchEvent(shownEvent); + } + + return false; + } + + keydown(e) { + const element = this.element; + const parent = getParent(element); + const isActive = parent.classList.contains('open'); + const desc = ' li:not(.disabled):visible a'; + const items = Array.from(parent.querySelectorAll(`.filer-dropdown-menu${desc}`)) + .filter(item => item.offsetParent !== null); // visible check + const index = items.indexOf(e.target); + + if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) { + return; + } + + e.preventDefault(); + e.stopPropagation(); + + if (element.disabled || element.classList.contains('disabled')) { + return; + } + + if ((!isActive && e.which !== 27) || (isActive && e.which === 27)) { + if (e.which === 27) { + parent.querySelector(toggleSelector)?.focus(); + } + return element.click(); + } + + if (!items.length) { + return; + } + + let newIndex = index; + if (e.which === 38 && index > 0) { + newIndex--; // up + } + if (e.which === 40 && index < items.length - 1) { + newIndex++; // down + } + if (newIndex === -1) { + newIndex = 0; + } + + items[newIndex]?.focus(); + } + } + + function getParent(element) { + let selector = element.getAttribute('data-target'); + let parent = selector ? document.querySelector(selector) : null; + + if (!selector) { + selector = element.getAttribute('href'); + selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, ''); // strip for ie7 + parent = selector ? document.querySelector(selector) : null; + } + + return parent && parent.parentNode ? parent : element.parentNode; + } + + function clearMenus(e) { + if (e && e.which === 3) { + return; + } + + // Remove all backdrops + document.querySelectorAll(`.${backdropClass}`).forEach(el => el.remove()); + + document.querySelectorAll(toggleSelector).forEach((toggle) => { + const parent = getParent(toggle); + const relatedTarget = { relatedTarget: toggle }; + + if (!parent.classList.contains('open')) { + return; + } + + if (e && e.type === 'click' && /input|textarea/i.test(e.target.tagName) && parent.contains(e.target)) { + return; + } + + const hideEvent = new CustomEvent('hide.bs.filer-dropdown', { + bubbles: true, + cancelable: true, + detail: relatedTarget + }); + parent.dispatchEvent(hideEvent); + + if (hideEvent.defaultPrevented) { + return; + } + + toggle.setAttribute('aria-expanded', 'false'); + parent.classList.remove('open'); + + const hiddenEvent = new CustomEvent('hidden.bs.filer-dropdown', { + bubbles: true, + detail: relatedTarget + }); + parent.dispatchEvent(hiddenEvent); + }); + } + + // DROPDOWN PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + this.forEach((element) => { + let data = element._filerDropdownInstance; + + if (!data) { + data = new Dropdown(element); + element._filerDropdownInstance = data; + } + if (typeof option === 'string') { + data[option].call(element); + } + }); + return this; + } + + // Extend NodeList and HTMLCollection with dropdown method + if (!NodeList.prototype.dropdown) { + NodeList.prototype.dropdown = function(option) { + return Plugin.call(this, option); + }; + } + if (!HTMLCollection.prototype.dropdown) { + HTMLCollection.prototype.dropdown = function(option) { + return Plugin.call(this, option); + }; + } + + // APPLY TO STANDARD DROPDOWN ELEMENTS + // =================================== + + document.addEventListener('click', clearMenus); + + document.addEventListener('click', (e) => { + if (e.target.closest('.filer-dropdown form')) { + e.stopPropagation(); + } + }); + + document.addEventListener('click', (e) => { + const toggle = e.target.closest(toggleSelector); + if (toggle) { + const instance = toggle._filerDropdownInstance || new Dropdown(toggle); + if (!toggle._filerDropdownInstance) { + toggle._filerDropdownInstance = instance; + } + instance.toggle(e); + } + }); + + document.addEventListener('keydown', (e) => { + const toggle = e.target.closest(toggleSelector); + if (toggle) { + const instance = toggle._filerDropdownInstance || new Dropdown(toggle); + if (!toggle._filerDropdownInstance) { + toggle._filerDropdownInstance = instance; + } + instance.keydown(e); + } + }); + + document.addEventListener('keydown', (e) => { + const menu = e.target.closest('.filer-dropdown-menu'); + if (menu) { + const toggle = menu.parentNode.querySelector(toggleSelector); + if (toggle) { + const instance = toggle._filerDropdownInstance || new Dropdown(toggle); + if (!toggle._filerDropdownInstance) { + toggle._filerDropdownInstance = instance; + } + instance.keydown(e); + } + } + }); + + // Export for compatibility + window.FilerDropdown = Dropdown; +})(); diff --git a/filer/static/filer/js/addons/dropzone.init.js b/filer/static/filer/js/addons/dropzone.init.js new file mode 100644 index 000000000..e2f19e0e7 --- /dev/null +++ b/filer/static/filer/js/addons/dropzone.init.js @@ -0,0 +1,234 @@ +// #DROPZONE# +// This script implements the dropzone settings +'use strict'; + +import Dropzone from 'dropzone'; + +if (Dropzone) { + Dropzone.autoDiscover = false; +} + +document.addEventListener('DOMContentLoaded', () => { + const previewImageSelector = '.js-img-preview'; + const dropzoneSelector = '.js-filer-dropzone:not(.js-filer-dropzone-base):not(.js-filer-dropzone-folder):not(.js-filer-dropzone-info-message)'; + const dropzones = document.querySelectorAll(dropzoneSelector); + const messageSelector = '.js-filer-dropzone-message'; + const lookupButtonSelector = '.js-related-lookup'; + const editButtonSelector = '.js-related-edit'; + const dropzoneTemplate = '.js-filer-dropzone-template'; + const progressSelector = '.js-filer-dropzone-progress'; + const previewImageWrapperSelector = '.js-img-wrapper'; + const filerClearerSelector = '.filerClearer'; + const fileChooseSelector = '.js-file-selector'; + const fileIdInputSelector = '.vForeignKeyRawIdAdminField'; + const dragHoverClass = 'dz-drag-hover'; + const hiddenClass = 'hidden'; + const mobileClass = 'filer-dropzone-mobile'; + const objectAttachedClass = 'js-object-attached'; + const minWidth = 500; + + const checkMinWidth = (element) => { + const width = element.offsetWidth; + if (width < minWidth) { + element.classList.add(mobileClass); + } else { + element.classList.remove(mobileClass); + } + }; + + const showError = (message) => { + try { + window.parent.CMS.API.Messages.open({ + message: message + }); + } catch { + if (window.filerShowError) { + window.filerShowError(message); + } else { + alert(message); + } + } + }; + + const createDropzone = function (dropzone) { + const dropzoneUrl = dropzone.dataset.url; + const inputId = dropzone.querySelector(fileIdInputSelector); + const isImage = inputId?.getAttribute('name') === 'image'; + const lookupButton = dropzone.querySelector(lookupButtonSelector); + const editButton = dropzone.querySelector(editButtonSelector); + const message = dropzone.querySelector(messageSelector); + const clearButton = dropzone.querySelector(filerClearerSelector); + const fileChoose = dropzone.querySelector(fileChooseSelector); + + if (dropzone.dropzone) { + return; + } + + const resizeHandler = () => { + checkMinWidth(dropzone); + }; + window.addEventListener('resize', resizeHandler); + + new Dropzone(dropzone, { + url: dropzoneUrl, + paramName: 'file', + maxFiles: 1, + maxFilesize: dropzone.dataset.maxFilesize, + previewTemplate: document.querySelector(dropzoneTemplate)?.innerHTML || '
', + clickable: false, + addRemoveLinks: false, + init: function () { + checkMinWidth(dropzone); + + this.on('removedfile', () => { + if (fileChoose) { + fileChoose.style.display = ''; + } + dropzone.classList.remove(objectAttachedClass); + this.removeAllFiles(); + clearButton?.click(); + }); + + const images = this.element.querySelectorAll('img'); + images.forEach((img) => { + img.addEventListener('dragstart', (event) => { + event.preventDefault(); + }); + }); + + if (clearButton) { + clearButton.addEventListener('click', () => { + dropzone.classList.remove(objectAttachedClass); + // const changeEvent = new Event('change', { bubbles: true }); + // inputId?.dispatchEvent(changeEvent); + }); + } + }, + maxfilesexceeded: function () { + this.removeAllFiles(true); + }, + drop: function () { + this.removeAllFiles(true); + clearButton?.click(); + const progressEl = dropzone.querySelector(progressSelector); + if (progressEl) { + progressEl.classList.remove(hiddenClass); + } + if (fileChoose) { + fileChoose.style.display = 'block'; + } + lookupButton?.classList.add('related-lookup-change'); + editButton?.classList.add('related-lookup-change'); + message?.classList.add(hiddenClass); + dropzone.classList.remove(dragHoverClass); + dropzone.classList.add(objectAttachedClass); + }, + success: function (file, response) { + const progressEl = dropzone.querySelector(progressSelector); + if (progressEl) { + progressEl.classList.add(hiddenClass); + } + + if (file && file.status === 'success' && response) { + if (response.file_id && inputId) { + inputId.value = response.file_id; + const changeEvent = new Event('change', { bubbles: true }); + inputId.dispatchEvent(changeEvent); + } + if (response.thumbnail_180 && isImage) { + const previewImg = dropzone.querySelector(previewImageSelector); + if (previewImg) { + previewImg.style.backgroundImage = `url(${response.thumbnail_180})`; + } + const wrapper = dropzone.querySelector(previewImageWrapperSelector); + if (wrapper) { + wrapper.classList.remove(hiddenClass); + } + } + } else { + if (response && response.error) { + showError(`${file.name}: ${response.error}`); + } + this.removeAllFiles(true); + } + + const images = this.element.querySelectorAll('img'); + images.forEach((img) => { + img.addEventListener('dragstart', (event) => { + event.preventDefault(); + }); + }); + }, + error: function (file, msg, response) { + if (response && response.error) { + msg += ` ; ${response.error}`; + } + showError(`${file.name}: ${msg}`); + this.removeAllFiles(true); + }, + reset: function () { + if (isImage) { + const wrapper = dropzone.querySelector(previewImageWrapperSelector); + if (wrapper) { + wrapper.classList.add(hiddenClass); + } + const previewImg = dropzone.querySelector(previewImageSelector); + if (previewImg) { + previewImg.style.backgroundImage = 'none'; + } + } + dropzone.classList.remove(objectAttachedClass); + if (inputId) { + inputId.value = ''; + } + lookupButton?.classList.remove('related-lookup-change'); + editButton?.classList.remove('related-lookup-change'); + message?.classList.remove(hiddenClass); + if (inputId) { + const changeEvent = new Event('change', { bubbles: true }); + inputId.dispatchEvent(changeEvent); + } + } + }); + }; + + if (dropzones.length && Dropzone) { + if (!window.filerDropzoneInitialized) { + window.filerDropzoneInitialized = true; + Dropzone.autoDiscover = false; + } + dropzones.forEach(createDropzone); + + // Handle initialization of the dropzone on dynamic formsets (i.e. Django admin inlines) + document.addEventListener('formset:added', (event) => { + let dropzones; + let rowIdx; + let row; + + if (event.detail && event.detail.formsetName) { + /* + Django 4.1 changed the event type being fired when adding + a new formset from a jQuery to a vanilla JavaScript event. + https://docs.djangoproject.com/en/4.1/ref/contrib/admin/javascript/ + + In this case we find the newly added row and initialize the + dropzone on any dropzoneSelector on that row. + */ + + rowIdx = parseInt( + document.getElementById( + `id_${event.detail.formsetName}-TOTAL_FORMS` + ).value, 10 + ) - 1; + row = document.getElementById(`${event.detail.formsetName}-${rowIdx}`); + dropzones = row?.querySelectorAll(dropzoneSelector) || []; + } else { + // Fallback for older jQuery event format + row = event.target; + dropzones = row?.querySelectorAll(dropzoneSelector) || []; + } + + dropzones?.forEach(createDropzone); + }); + } +}); diff --git a/filer/static/filer/js/addons/filer_popup_response.js b/filer/static/filer/js/addons/filer_popup_response.js new file mode 100644 index 000000000..d0dfdef0c --- /dev/null +++ b/filer/static/filer/js/addons/filer_popup_response.js @@ -0,0 +1,22 @@ +/*global opener */ +(function () { + 'use strict'; + const dataElement = document.getElementById('django-admin-popup-response-constants'); + let initData; + + if (dataElement) { + initData = JSON.parse(dataElement.dataset.popupResponse); + switch (initData.action) { + case 'change': + // Specific function for file editing popup opened from widget + opener.dismissRelatedImageLookupPopup(window, initData.new_value, null, initData.obj, null); + break; + case 'delete': + opener.dismissDeleteRelatedObjectPopup(window, initData.value); + break; + default: + opener.dismissAddRelatedObjectPopup(window, initData.value, initData.obj); + break; + } + } +})(); diff --git a/filer/static/filer/js/addons/focal-point.js b/filer/static/filer/js/addons/focal-point.js new file mode 100644 index 000000000..ad1263c6e --- /dev/null +++ b/filer/static/filer/js/addons/focal-point.js @@ -0,0 +1,253 @@ +// #FOCAL POINT# +// This script implements the image focal point setting +'use strict'; + +window.Cl = window.Cl || {}; + +(() => { + class FocalPoint { + constructor(options = {}) { + this.options = { + containerSelector: '.js-focal-point', + imageSelector: '.js-focal-point-image', + circleSelector: '.js-focal-point-circle', + locationSelector: '.js-focal-point-location', + draggableClass: 'draggable', + hiddenClass: 'hidden', + dataLocation: 'locationSelector', + ...options + }; + this.focalPointInstances = []; + this._init = this._init.bind(this); + } + + _init(container) { + const focalPointInstance = new FocalPointConstructor(container, this.options); + this.focalPointInstances.push(focalPointInstance); + } + + initialize() { + const containers = document.querySelectorAll(this.options.containerSelector); + containers.forEach((container) => { + this._init(container); + }); + + if (window.Cl.mediator) { + window.Cl.mediator.subscribe('focal-point:init', this._init); + } + } + + destroy() { + if (window.Cl.mediator) { + window.Cl.mediator.remove('focal-point:init', this._init); + } + + this.focalPointInstances.forEach((focalPointInstance) => { + focalPointInstance.destroy(); + }); + + this.focalPointInstances = []; + } + } + + class FocalPointConstructor { + constructor(container, options = {}) { + this.options = { + imageSelector: '.js-focal-point-image', + circleSelector: '.js-focal-point-circle', + locationSelector: '.js-focal-point-location', + draggableClass: 'draggable', + hiddenClass: 'hidden', + dataLocation: 'locationSelector', + ...options + }; + + this.container = container; + this.image = this.container.querySelector(this.options.imageSelector); + this.circle = this.container.querySelector(this.options.circleSelector); + this.ratio = parseFloat(this.image?.dataset.ratio || 1); + this.location = this._getLocation(); + this.isDragging = false; + this.dragStartX = 0; + this.dragStartY = 0; + this.circleStartX = 0; + this.circleStartY = 0; + + this._onImageLoaded = this._onImageLoaded.bind(this); + this._onMouseDown = this._onMouseDown.bind(this); + this._onMouseMove = this._onMouseMove.bind(this); + this._onMouseUp = this._onMouseUp.bind(this); + + if (this.image?.complete) { + this._onImageLoaded(); + } else if (this.image) { + this.image.addEventListener('load', this._onImageLoaded); + } + } + + _updateLocationValue(x, y) { + const locationValue = `${Math.round(x * this.ratio)},${Math.round(y * this.ratio)}`; + if (this.location) { + this.location.value = locationValue; + } + } + + _getLocation() { + const locationSelector = this.container.dataset[this.options.dataLocation]; + if (locationSelector) { + const newLocation = document.querySelector(locationSelector); + if (newLocation) { + return newLocation; + } + } + return this.container.querySelector(this.options.locationSelector); + } + + _makeDraggable() { + if (!this.circle) { + return; + } + + this.circle.classList.add(this.options.draggableClass); + this.circle.addEventListener('mousedown', this._onMouseDown); + this.circle.addEventListener('touchstart', this._onMouseDown, { passive: false }); + } + + _onMouseDown(event) { + event.preventDefault(); + this.isDragging = true; + + const touch = event.type === 'touchstart' ? event.touches[0] : event; + + // Get container bounds + const containerRect = this.container.getBoundingClientRect(); + + // Calculate mouse position relative to container + this.dragStartX = touch.clientX - containerRect.left; + this.dragStartY = touch.clientY - containerRect.top; + + // Get current circle position (center) + const circleRect = this.circle.getBoundingClientRect(); + this.circleStartX = circleRect.left - containerRect.left + circleRect.width / 2; + this.circleStartY = circleRect.top - containerRect.top + circleRect.height / 2; + + document.addEventListener('mousemove', this._onMouseMove); + document.addEventListener('mouseup', this._onMouseUp); + document.addEventListener('touchmove', this._onMouseMove, { passive: false }); + document.addEventListener('touchend', this._onMouseUp); + } + + _onMouseMove(event) { + if (!this.isDragging) { + return; + } + + event.preventDefault(); + + const touch = event.type === 'touchmove' ? event.touches[0] : event; + + // Get container bounds + const containerRect = this.container.getBoundingClientRect(); + + // Calculate current mouse position relative to container + const currentX = touch.clientX - containerRect.left; + const currentY = touch.clientY - containerRect.top; + + // Calculate how much the mouse moved + const deltaX = currentX - this.dragStartX; + const deltaY = currentY - this.dragStartY; + + // Calculate new center position + let centerX = this.circleStartX + deltaX; + let centerY = this.circleStartY + deltaY; + + // Constrain center to container bounds + centerX = Math.max(0, Math.min(containerRect.width - 1, centerX)); + centerY = Math.max(0, Math.min(containerRect.height - 1, centerY)); + + // Position circle by its top-left corner (center - radius) + this.circle.style.left = `${centerX}px`; + this.circle.style.top = `${centerY}px`; + + // Update location value with center coordinates + this._updateLocationValue(centerX, centerY); + } + + _onMouseUp() { + this.isDragging = false; + document.removeEventListener('mousemove', this._onMouseMove); + document.removeEventListener('mouseup', this._onMouseUp); + document.removeEventListener('touchmove', this._onMouseMove); + document.removeEventListener('touchend', this._onMouseUp); + } + + _onImageLoaded() { + if (!this.image || this.image.naturalWidth === 0) { + return; + } + + this.circle?.classList.remove(this.options.hiddenClass); + + const locationValue = this.location?.value || ''; + const imageWidth = this.image.offsetWidth; + const imageHeight = this.image.offsetHeight; + + let x, y; + + if (locationValue.length) { + const coords = locationValue.split(','); + x = Math.round(Number(coords[0]) / this.ratio); + y = Math.round(Number(coords[1]) / this.ratio); + } else { + x = imageWidth / 2; + y = imageHeight / 2; + } + + if (isNaN(x) || isNaN(y)) { + return; + } + + // Position circle (accounting for circle size) + if (this.circle) { + this.circle.style.left = `${x}px`; + this.circle.style.top = `${y}px`; + } + + this._makeDraggable(); + this._updateLocationValue(x, y); + } + + destroy() { + if (this.circle?.classList.contains(this.options.draggableClass)) { + this.circle.removeEventListener('mousedown', this._onMouseDown); + this.circle.removeEventListener('touchstart', this._onMouseDown); + } + + document.removeEventListener('mousemove', this._onMouseMove); + document.removeEventListener('mouseup', this._onMouseUp); + document.removeEventListener('touchmove', this._onMouseMove); + document.removeEventListener('touchend', this._onMouseUp); + + if (this.image) { + this.image.removeEventListener('load', this._onImageLoaded); + } + + this.options = null; + this.container = null; + this.image = null; + this.circle = null; + this.location = null; + this.ratio = null; + } + } + + window.Cl.FocalPoint = FocalPoint; + window.Cl.FocalPointConstructor = FocalPointConstructor; + + // Export for ES6 module usage + if (typeof module !== 'undefined' && module.exports) { + module.exports = FocalPoint; + } +})(); + +export default window.Cl.FocalPoint; diff --git a/filer/static/filer/js/addons/popup_handling.js b/filer/static/filer/js/addons/popup_handling.js new file mode 100644 index 000000000..453a00a93 --- /dev/null +++ b/filer/static/filer/js/addons/popup_handling.js @@ -0,0 +1,137 @@ +'use strict'; + +const windowname_to_id = (text) => { + text = text.replace(/__dot__/g, '.'); + text = text.replace(/__dash__/g, '-'); + const last = text.lastIndexOf('__'); + return last === -1 ? text : text.substring(0, last); +}; + +window.dismissPopupAndReload = (win) => { + document.location.reload(); + win.close(); +}; + +window.dismissRelatedImageLookupPopup = ( + win, + chosenId, + chosenThumbnailUrl, + chosenDescriptionTxt, + chosenAdminChangeUrl +) => { + const id = windowname_to_id(win.name); + const lookup = document.getElementById(id); + if (!lookup) { + return; + } + const container = lookup.closest('.filerFile'); + if (!container) { + return; + } + const edit = container.querySelector('.edit'); + const image = container.querySelector('.thumbnail_img'); + const descriptionText = container.querySelector('.description_text'); + const clearer = container.querySelector('.filerClearer'); + const dropzoneMessage = container.parentElement.querySelector('.dz-message'); + const element = container.querySelector('input'); + const oldId = element.value; + + element.value = chosenId; + const dropzone = element.closest('.js-filer-dropzone'); + if (dropzone) { + dropzone.classList.add('js-object-attached'); + } + if (chosenThumbnailUrl && image) { + image.src = chosenThumbnailUrl; + image.classList.remove('hidden'); + image.removeAttribute('srcset'); + } + if (descriptionText) { + descriptionText.textContent = chosenDescriptionTxt; + } + if (clearer) { + clearer.classList.remove('hidden'); + } + lookup.classList.add('related-lookup-change'); + if (edit) { + edit.classList.add('related-lookup-change'); + } + if (chosenAdminChangeUrl && edit) { + edit.setAttribute('href', `${chosenAdminChangeUrl}?_edit_from_widget=1`); + } + if (dropzoneMessage) { + dropzoneMessage.classList.add('hidden'); + } + + if (oldId !== chosenId) { + element.dispatchEvent(new Event('change', { bubbles: true })); + } + win.close(); +}; +window.dismissRelatedFolderLookupPopup = (win, chosenId, chosenName) => { + const id = windowname_to_id(win.name); + const lookup = document.getElementById(id); + if (!lookup) { + return; + } + const container = lookup.closest('.filerFile'); + if (!container) { + return; + } + const image = container.querySelector('.thumbnail_img'); + const clearButton = document.getElementById(`id_${id}_clear`); + const input = document.getElementById(`id_${id}`); + const folderName = container.querySelector('.description_text'); + const addFolderButton = document.getElementById(id); + + if (input) { + input.value = chosenId; + } + if (image) { + image.classList.remove('hidden'); + } + if (folderName) { + folderName.textContent = chosenName; + } + if (clearButton) { + clearButton.classList.remove('hidden'); + } + if (addFolderButton) { + addFolderButton.classList.add('hidden'); + } + win.close(); +}; + +// Handle popup dismiss links (for folder/image selection in popups) +document.addEventListener('DOMContentLoaded', () => { + document.querySelectorAll('.js-dismiss-popup').forEach((link) => { + link.addEventListener('click', function (e) { + e.preventDefault(); + + const fileId = this.dataset.fileId; + const iconUrl = this.dataset.iconUrl; + const label = this.dataset.label; + + if (this.classList.contains('js-dismiss-image')) { + const changeUrl = this.dataset.changeUrl || ''; + window.opener.dismissRelatedImageLookupPopup( + window, + fileId, + iconUrl, + label, + changeUrl + ); + } else if (this.classList.contains('js-dismiss-folder')) { + window.opener.dismissRelatedFolderLookupPopup(window, fileId, label); + } + }); + }); + + // Auto-dismiss popup on page load (for dismiss_popup.html) + const popupData = document.getElementById('popup-dismiss-data'); + if (popupData && window.opener) { + const pk = popupData.dataset.pk; + const label = popupData.dataset.label; + window.opener.dismissRelatedPopup(window, pk, label); + } +}); diff --git a/filer/static/filer/js/addons/table-dropzone.js b/filer/static/filer/js/addons/table-dropzone.js new file mode 100644 index 000000000..377700694 --- /dev/null +++ b/filer/static/filer/js/addons/table-dropzone.js @@ -0,0 +1,314 @@ +// #DROPZONE# +// This script implements the dropzone settings +'use strict'; + +import Dropzone from 'dropzone'; + + +/* globals Cl */ +document.addEventListener('DOMContentLoaded', () => { + let submitNum = 0; + let maxSubmitNum = 0; + const dropzoneInstances = []; + const dropzoneBase = document.querySelector('.js-filer-dropzone-base'); + const dropzoneSelector = '.js-filer-dropzone'; + let dropzones; + const infoMessageClass = 'js-filer-dropzone-info-message'; + const infoMessage = document.querySelector(`.${infoMessageClass}`); + const folderName = document.querySelector('.js-filer-dropzone-folder-name'); + const uploadInfoContainer = document.querySelector('.js-filer-dropzone-upload-info-container'); + const uploadInfo = document.querySelector('.js-filer-dropzone-upload-info'); + const uploadWelcome = document.querySelector('.js-filer-dropzone-upload-welcome'); + const uploadNumber = document.querySelector('.js-filer-dropzone-upload-number'); + const uploadCount = document.querySelector('.js-filer-upload-count'); + const uploadText = document.querySelector('.js-filer-upload-text'); + const uploadFileNameSelector = '.js-filer-dropzone-file-name'; + const uploadProgressSelector = '.js-filer-dropzone-progress'; + const uploadSuccess = document.querySelector('.js-filer-dropzone-upload-success'); + const uploadCanceled = document.querySelector('.js-filer-dropzone-upload-canceled'); + const cancelUpload = document.querySelector('.js-filer-dropzone-cancel'); + const dragHoverClass = 'dz-drag-hover'; + const dataUploaderConnections = 'max-uploader-connections'; + const dragHoverBorder = document.querySelector('.drag-hover-border'); + const hiddenClass = 'hidden'; + let hideMessageTimeout; + let hasErrors = false; + let baseUrl; + let baseFolderTitle; + + // utility to update query string (same as upload-button) + const updateQuery = (uri, key, value) => { + const re = new RegExp(`([?&])${key}=.*?(&|$)`, 'i'); + const separator = uri.indexOf('?') !== -1 ? '&' : '?'; + const hash = window.location.hash; + uri = uri.replace(/#.*$/, ''); + if (uri.match(re)) { + return uri.replace(re, `$1${key}=${value}$2`) + hash; + } else { + return uri + separator + key + '=' + value + hash; + } + }; + + const reloadOrdered = () => { + const uri = window.location.toString(); + window.location.replace(updateQuery(uri, 'order_by', '-modified_at')); + }; + + const updateUploadNumber = () => { + if (uploadNumber) { + uploadNumber.textContent = `${maxSubmitNum - submitNum}/${maxSubmitNum}`; + } + if (uploadText) { + uploadText.classList.remove('hidden'); + } + if (uploadCount) { + uploadCount.classList.remove('hidden'); + } + }; + + const destroyDropzones = () => { + dropzoneInstances.forEach((instance) => { + instance.destroy(); + }); + }; + + const getElementByFile = (file, url) => { + return document.getElementById( + `file-${encodeURIComponent(file.name)}${file.size}${file.lastModified}${url}` + ); + }; + + if (dropzoneBase) { + baseUrl = dropzoneBase.dataset.url; + baseFolderTitle = dropzoneBase.dataset.folderName; + + const body = document.body; + body.dataset.url = baseUrl; + body.dataset.folderName = baseFolderTitle; + body.dataset.maxFiles = dropzoneBase.dataset.maxFiles; + body.dataset.maxFilesize = dropzoneBase.dataset.maxFilesize; + body.classList.add('js-filer-dropzone'); + } + + Cl.mediator.subscribe('filer-upload-in-progress', destroyDropzones); + + dropzones = document.querySelectorAll(dropzoneSelector); + + if (dropzones.length && Dropzone) { + Dropzone.autoDiscover = false; + dropzones.forEach((dropzoneElement) => { + if (dropzoneElement.dropzone) { + return; + } + const dropzoneUrl = dropzoneElement.dataset.url; + const dropzoneInstance = new Dropzone(dropzoneElement, { + url: dropzoneUrl, + paramName: 'file', + maxFiles: parseInt(dropzoneElement.dataset.maxFiles) || 100, + maxFilesize: parseInt(dropzoneElement.dataset.maxFilesize), // no default + previewTemplate: '
', + clickable: false, + addRemoveLinks: false, + parallelUploads: dropzoneElement.dataset[dataUploaderConnections] || 3, + accept: (file, done) => { + let uploadInfoClone; + + Cl.mediator.remove('filer-upload-in-progress', destroyDropzones); + Cl.mediator.publish('filer-upload-in-progress'); + + clearTimeout(hideMessageTimeout); + clearTimeout(hideMessageTimeout); + if (uploadWelcome) { + uploadWelcome.classList.add(hiddenClass); + } + if (cancelUpload) { + cancelUpload.classList.remove(hiddenClass); + } + + if (getElementByFile(file, dropzoneUrl)) { + done('duplicate'); + } else { + uploadInfoClone = uploadInfo.cloneNode(true); + + const fileNameEl = uploadInfoClone.querySelector(uploadFileNameSelector); + if (fileNameEl) { + fileNameEl.textContent = file.name; + } + const progressEl = uploadInfoClone.querySelector(uploadProgressSelector); + if (progressEl) { + progressEl.style.width = '0'; + } + uploadInfoClone.setAttribute( + 'id', + `file-${encodeURIComponent(file.name)}${file.size}${file.lastModified}${dropzoneUrl}` + ); + if (uploadInfoContainer) { + uploadInfoContainer.appendChild(uploadInfoClone); + } + + submitNum++; + maxSubmitNum++; + updateUploadNumber(); + done(); + } + + dropzones.forEach((dz) => dz.classList.remove('reset-hover')); + if (infoMessage) { + infoMessage.classList.remove(hiddenClass); + } + dropzones.forEach((dz) => dz.classList.remove(dragHoverClass)); + }, + dragover: (dragEvent) => { + const target = dragEvent.target.closest(dropzoneSelector); + const folderTitle = target?.dataset.folderName; + const dropzoneFolder = dropzoneElement.classList.contains('js-filer-dropzone-folder'); + const dropzoneBoundingRect = dropzoneElement.getBoundingClientRect(); + const borderStyle = dragHoverBorder ? window.getComputedStyle(dragHoverBorder) : null; + const topBorderSize = borderStyle ? borderStyle.borderTopWidth : '0px'; + const leftBorderSize = borderStyle ? borderStyle.borderLeftWidth : '0px'; + const dropzonePosition = { + top: `${dropzoneBoundingRect.top}px`, + bottom: `${dropzoneBoundingRect.bottom}px`, + left: `${dropzoneBoundingRect.left}px`, + right: `${dropzoneBoundingRect.right}px`, + width: `${dropzoneBoundingRect.width - parseInt(leftBorderSize, 10) * 2}px`, + height: `${dropzoneBoundingRect.height - parseInt(topBorderSize, 10) * 2}px`, + display: 'block' + }; + if (dropzoneFolder && dragHoverBorder) { + Object.assign(dragHoverBorder.style, dropzonePosition); + } + + dropzones.forEach((dz) => dz.classList.add('reset-hover')); + if (uploadSuccess) { + uploadSuccess.classList.add(hiddenClass); + } + if (infoMessage) { + infoMessage.classList.remove(hiddenClass); + } + dropzoneElement.classList.add(dragHoverClass); + dropzoneElement.classList.remove('reset-hover'); + + if (folderName && folderTitle) { + folderName.textContent = folderTitle; + } + }, + dragend: () => { + clearTimeout(hideMessageTimeout); + hideMessageTimeout = setTimeout(() => { + if (infoMessage) { + infoMessage.classList.add(hiddenClass); + } + }, 1000); + + if (infoMessage) { + infoMessage.classList.remove(hiddenClass); + } + dropzones.forEach((dz) => dz.classList.remove(dragHoverClass)); + if (dragHoverBorder) { + Object.assign(dragHoverBorder.style, { top: '0', bottom: '0', width: '0', height: '0' }); + } + }, + dragleave: () => { + clearTimeout(hideMessageTimeout); + hideMessageTimeout = setTimeout(() => { + if (infoMessage) { + infoMessage.classList.add(hiddenClass); + } + }, 1000); + + if (infoMessage) { + infoMessage.classList.remove(hiddenClass); + } + dropzones.forEach((dz) => dz.classList.remove(dragHoverClass)); + if (dragHoverBorder) { + Object.assign(dragHoverBorder.style, { top: '0', bottom: '0', width: '0', height: '0' }); + } + }, + sending: (file) => { + const fileEl = getElementByFile(file, dropzoneUrl); + if (fileEl) { + fileEl.classList.remove(hiddenClass); + } + }, + uploadprogress: (file, progress) => { + const fileEl = getElementByFile(file, dropzoneUrl); + if (fileEl) { + const progressEl = fileEl.querySelector(uploadProgressSelector); + if (progressEl) { + progressEl.style.width = `${progress}%`; + } + } + }, + success: (file, response) => { + submitNum--; + updateUploadNumber(); + const fileEl = getElementByFile(file, dropzoneUrl); + if (fileEl) { + fileEl.remove(); + } + if (response && response.error) { + hasErrors = true; + if (window.filerShowError) { + window.filerShowError(`${file.name}: ${response.error}`); + } + } + }, + queuecomplete: () => { + if (submitNum !== 0) { + return; + } + + updateUploadNumber(); + + if (cancelUpload) { + cancelUpload.classList.add(hiddenClass); + } + if (uploadInfo) { + uploadInfo.classList.add(hiddenClass); + } + + if (hasErrors) { + if (uploadNumber) { + uploadNumber.classList.add(hiddenClass); + } + setTimeout(() => { + reloadOrdered(); + }, 1000); + } else { + if (uploadSuccess) { + uploadSuccess.classList.remove(hiddenClass); + } + reloadOrdered(); + } + }, + error: (file, error) => { + if (error === 'duplicate') { + return; + } + submitNum--; + updateUploadNumber(); + const fileEl = getElementByFile(file, dropzoneUrl); + if (fileEl) { + fileEl.remove(); + } + hasErrors = true; + if (window.filerShowError) { + window.filerShowError(`${file.name}: ${error.message || error}`); + } + } + }); + dropzoneInstances.push(dropzoneInstance); + if (cancelUpload) { + cancelUpload.addEventListener('click', (clickEvent) => { + clickEvent.preventDefault(); + cancelUpload.classList.add(hiddenClass); + if (uploadCanceled) { + uploadCanceled.classList.remove(hiddenClass); + } + dropzoneInstance.removeAllFiles(true); + }); + } + }); + } +}); diff --git a/filer/static/filer/js/addons/toggler.js b/filer/static/filer/js/addons/toggler.js new file mode 100644 index 000000000..fb02f47b2 --- /dev/null +++ b/filer/static/filer/js/addons/toggler.js @@ -0,0 +1,82 @@ +// #TOGGLER# +// This script implements the simple element toggle +'use strict'; + +window.Cl = window.Cl || {}; + +class Toggler { + constructor(options = {}) { + this.options = { + linksSelector: '.js-toggler-link', + dataHeaderSelector: 'toggler-header-selector', + dataContentSelector: 'toggler-content-selector', + collapsedClass: 'js-collapsed', + expandedClass: 'js-expanded', + hiddenClass: 'hidden', + ...options + }; + + this.togglerInstances = []; + + const links = document.querySelectorAll(this.options.linksSelector); + links.forEach(link => { + const togglerInstance = new TogglerConstructor(link, this.options); + this.togglerInstances.push(togglerInstance); + }); + } + + destroy() { + this.links = null; + this.togglerInstances.forEach(togglerInstance => togglerInstance.destroy()); + this.togglerInstances = []; + } +} + +class TogglerConstructor { + constructor(link, options = {}) { + this.options = { ...options }; + this.link = link; + this.headerSelector = this.link.dataset[this.options.dataHeaderSelector]; + this.contentSelector = this.link.dataset[this.options.dataContentSelector]; + this.header = document.querySelector(this.headerSelector); + this.header = this.header || this.link; + this.content = document.querySelector(this.contentSelector); + + if (!this.content) { + return; + } + + this._initLink(); + } + + _updateClasses() { + if (this.content.classList.contains(this.options.hiddenClass)) { + this.header.classList.remove(this.options.expandedClass); + this.header.classList.add(this.options.collapsedClass); + } else { + this.header.classList.add(this.options.expandedClass); + this.header.classList.remove(this.options.collapsedClass); + } + } + + _onTogglerClick(clickEvent) { + this.content.classList.toggle(this.options.hiddenClass); + this._updateClasses(); + clickEvent.preventDefault(); + } + + _initLink() { + this._updateClasses(); + this.link.addEventListener('click', e => this._onTogglerClick(e)); + } + + destroy() { + this.options = null; + this.link = null; + } +} + +Cl.Toggler = Toggler; +Cl.TogglerConstructor = TogglerConstructor; + +export default Toggler; diff --git a/filer/static/filer/js/addons/tooltip.js b/filer/static/filer/js/addons/tooltip.js new file mode 100644 index 000000000..47bb041d2 --- /dev/null +++ b/filer/static/filer/js/addons/tooltip.js @@ -0,0 +1,40 @@ +'use strict'; +window.Cl = window.Cl || {}; + +Cl.filerTooltip = () => { + const tooltipSelector = '.js-filer-tooltip'; + const tooltips = document.querySelectorAll(tooltipSelector); + + tooltips.forEach((element) => { + element.addEventListener('mouseover', function () { + const title = this.getAttribute('title'); + if (!title) { + return; + } + + this.dataset.filerTooltip = title; + this.removeAttribute('title'); + + const tooltip = document.createElement('p'); + tooltip.className = 'filer-tooltip'; + tooltip.textContent = title; + + const container = document.querySelector(tooltipSelector); + if (container) { + container.appendChild(tooltip); + } + }); + + element.addEventListener('mouseout', function () { + const title = this.dataset.filerTooltip; + if (title) { + this.setAttribute('title', title); + } + + const existingTooltips = document.querySelectorAll('.filer-tooltip'); + existingTooltips.forEach((t) => { + t.remove(); + }); + }); + }); +}; diff --git a/filer/static/filer/js/addons/upload-button.js b/filer/static/filer/js/addons/upload-button.js new file mode 100644 index 000000000..09887831d --- /dev/null +++ b/filer/static/filer/js/addons/upload-button.js @@ -0,0 +1,259 @@ +// #UPLOAD BUTTON# +// This script implements the upload button logic +'use strict'; + +import Dropzone from 'dropzone'; + +/* globals Cl */ + +document.addEventListener('DOMContentLoaded', () => { + let submitNum = 0; + let maxSubmitNum = 1; + const uploadButton = document.querySelector('.js-upload-button'); + if (!uploadButton) { + return; + } + + const uploadButtonDisabled = document.querySelector('.js-upload-button-disabled'); + const uploadUrl = uploadButton.dataset.url; + + if (!uploadUrl) { + return; + } + + const uploadWelcome = document.querySelector('.js-filer-dropzone-upload-welcome'); + const uploadInfoContainer = document.querySelector('.js-filer-dropzone-upload-info-container'); + const uploadInfo = document.querySelector('.js-filer-dropzone-upload-info'); + const uploadNumber = document.querySelector('.js-filer-dropzone-upload-number'); + const uploadFileNameSelector = '.js-filer-dropzone-file-name'; + const uploadProgressSelector = '.js-filer-dropzone-progress'; + const uploadSuccess = document.querySelector('.js-filer-dropzone-upload-success'); + const uploadCanceled = document.querySelector('.js-filer-dropzone-upload-canceled'); + const uploadCancel = document.querySelector('.js-filer-dropzone-cancel'); + const infoMessage = document.querySelector('.js-filer-dropzone-info-message'); + const hiddenClass = 'hidden'; + const maxUploaderConnections = parseInt(uploadButton.dataset.maxUploaderConnections || 3, 10); + const maxFilesize = parseInt(uploadButton.dataset.maxFilesize || 0, 10); + let hasErrors = false; + + const updateUploadNumber = () => { + if (uploadNumber) { + uploadNumber.textContent = `${maxSubmitNum - submitNum}/${maxSubmitNum}`; + } + }; + + const removeButton = () => { + if (uploadButton) { + uploadButton.remove(); + } + }; + + // utility + const updateQuery = (uri, key, value) => { + const re = new RegExp(`([?&])${key}=.*?(&|$)`, 'i'); + const separator = uri.indexOf('?') !== -1 ? '&' : '?'; + const hash = window.location.hash; + uri = uri.replace(/#.*$/, ''); + if (uri.match(re)) { + return uri.replace(re, `$1${key}=${value}$2`) + hash; + } else { + return uri + separator + key + '=' + value + hash; + } + }; + + const reloadOrdered = () => { + const uri = window.location.toString(); + window.location.replace(updateQuery(uri, 'order_by', '-modified_at')); + }; + + Cl.mediator.subscribe('filer-upload-in-progress', removeButton); + + // Prevent default navigation which can interfere with the file dialog + uploadButton.addEventListener('click', (evt) => { + evt.preventDefault(); + }); + + // Initialize Dropzone on the upload button + Dropzone.autoDiscover = false; + + let dropzone; + try { + dropzone = new Dropzone(uploadButton, { + url: uploadUrl, + paramName: 'file', + maxFilesize: maxFilesize, // already in MB + parallelUploads: maxUploaderConnections, + clickable: uploadButton, + previewTemplate: '
', + addRemoveLinks: false, + autoProcessQueue: true + }); + } catch (e) { + console.error('[Filer Upload] Failed to create Dropzone instance:', e); + return; + } + + dropzone.on('addedfile', (file) => { + Cl.mediator.remove('filer-upload-in-progress', removeButton); + Cl.mediator.publish('filer-upload-in-progress'); + submitNum++; + + maxSubmitNum = dropzone.files.length; + + if (infoMessage) { + infoMessage.classList.remove(hiddenClass); + } + if (uploadWelcome) { + uploadWelcome.classList.add(hiddenClass); + } + if (uploadSuccess) { + uploadSuccess.classList.add(hiddenClass); + } + if (uploadInfoContainer) { + uploadInfoContainer.classList.remove(hiddenClass); + } + if (uploadCancel) { + uploadCancel.classList.remove(hiddenClass); + } + if (uploadCanceled) { + uploadCanceled.classList.add(hiddenClass); + } + + updateUploadNumber(); + }); + + dropzone.on('uploadprogress', (file, progress) => { + const percent = Math.round(progress); + const fileId = `file-${encodeURIComponent(file.name)}${file.size}${file.lastModified}`; + const fileItem = document.getElementById(fileId); + let uploadInfoClone; + + if (fileItem) { + const progressBar = fileItem.querySelector(uploadProgressSelector); + if (progressBar) { + progressBar.style.width = `${percent}%`; + } + } else if (uploadInfo) { + uploadInfoClone = uploadInfo.cloneNode(true); + + const fileNameEl = uploadInfoClone.querySelector(uploadFileNameSelector); + if (fileNameEl) { + fileNameEl.textContent = file.name; + } + const progressEl = uploadInfoClone.querySelector(uploadProgressSelector); + if (progressEl) { + progressEl.style.width = `${percent}%`; + } + uploadInfoClone.classList.remove(hiddenClass); + uploadInfoClone.setAttribute('id', fileId); + if (uploadInfoContainer) { + uploadInfoContainer.appendChild(uploadInfoClone); + } + } + }); + + dropzone.on('success', (file, response) => { + const fileId = `file-${encodeURIComponent(file.name)}${file.size}${file.lastModified}`; + const fileEl = document.getElementById(fileId); + if (fileEl) { + fileEl.remove(); + } + + if (response.error) { + hasErrors = true; + window.filerShowError(`${file.name}: ${response.error}`); + } + + submitNum--; + updateUploadNumber(); + + if (submitNum === 0) { + maxSubmitNum = 1; + + if (uploadWelcome) { + uploadWelcome.classList.add(hiddenClass); + } + if (uploadNumber) { + uploadNumber.classList.add(hiddenClass); + } + if (uploadCanceled) { + uploadCanceled.classList.add(hiddenClass); + } + if (uploadCancel) { + uploadCancel.classList.add(hiddenClass); + } + if (uploadSuccess) { + uploadSuccess.classList.remove(hiddenClass); + } + + if (hasErrors) { + setTimeout(reloadOrdered, 1000); + } else { + reloadOrdered(); + } + } + }); + + dropzone.on('error', (file, errorMessage) => { + const fileId = `file-${encodeURIComponent(file.name)}${file.size}${file.lastModified}`; + const fileEl = document.getElementById(fileId); + if (fileEl) { + fileEl.remove(); + } + + hasErrors = true; + window.filerShowError(`${file.name}: ${errorMessage}`); + + submitNum--; + updateUploadNumber(); + + if (submitNum === 0) { + maxSubmitNum = 1; + + if (uploadWelcome) { + uploadWelcome.classList.add(hiddenClass); + } + if (uploadNumber) { + uploadNumber.classList.add(hiddenClass); + } + if (uploadCanceled) { + uploadCanceled.classList.add(hiddenClass); + } + if (uploadCancel) { + uploadCancel.classList.add(hiddenClass); + } + if (uploadSuccess) { + uploadSuccess.classList.remove(hiddenClass); + } + + setTimeout(reloadOrdered, 1000); + } + }); + + if (uploadCancel) { + uploadCancel.addEventListener('click', (clickEvent) => { + clickEvent.preventDefault(); + uploadCancel.classList.add(hiddenClass); + if (uploadNumber) { + uploadNumber.classList.add(hiddenClass); + } + if (uploadInfoContainer) { + uploadInfoContainer.classList.add(hiddenClass); + } + if (uploadCanceled) { + uploadCanceled.classList.remove(hiddenClass); + } + + setTimeout(() => { + window.location.reload(); + }, 1000); + }); + } + + if (uploadButtonDisabled && Cl.filerTooltip) { + Cl.filerTooltip(); + } + + // Fire custom event after scripts have been executed + document.dispatchEvent(new Event('filer-upload-scripts-executed')); +}); diff --git a/filer/static/filer/js/addons/widget.js b/filer/static/filer/js/addons/widget.js new file mode 100644 index 000000000..d43015d19 --- /dev/null +++ b/filer/static/filer/js/addons/widget.js @@ -0,0 +1,56 @@ +'use strict'; + +document.addEventListener('DOMContentLoaded', () => { + const filer_clear = (ev) => { + ev.preventDefault(); + + const clearer = ev.currentTarget; + const container = clearer.closest('.filerFile'); + if (!container) { + return; + } + + const input = container.querySelector('input'); + const thumbnail = container.querySelector('.thumbnail_img'); + const description = container.querySelector('.description_text'); + const addImageButton = container.querySelector('.lookup'); + const editImageButton = container.querySelector('.edit'); + const dropzoneMessage = container.parentElement.querySelector('.dz-message'); + const hiddenClass = 'hidden'; + + clearer.classList.add(hiddenClass); + if (input) { + input.value = ''; + } + if (thumbnail) { + thumbnail.classList.add(hiddenClass); + var thumbnailLink = thumbnail.parentElement; + if (thumbnailLink.tagName === 'A') { + thumbnailLink.removeAttribute('href'); + } + } + if (addImageButton) { + addImageButton.classList.remove('related-lookup-change'); + } + if (editImageButton) { + editImageButton.classList.remove('related-lookup-change'); + } + if (dropzoneMessage) { + dropzoneMessage.classList.remove(hiddenClass); + } + if (description) { + description.textContent = ''; + } + }; + + const foreignKeyFields = document.querySelectorAll('.filerFile .vForeignKeyRawIdAdminField'); + foreignKeyFields.forEach((field) => { + field.setAttribute('type', 'hidden'); + }); + + // Remove any existing handlers and add new ones + const clearers = document.querySelectorAll('.filerFile .filerClearer'); + clearers.forEach((clearer) => { + clearer.addEventListener('click', filer_clear); + }); +}); diff --git a/filer/static/filer/js/base.js b/filer/static/filer/js/base.js new file mode 100644 index 000000000..9c7f34d6f --- /dev/null +++ b/filer/static/filer/js/base.js @@ -0,0 +1,441 @@ +// ##################################################################################################################### +// #BASE# +// Basic logic django filer +'use strict'; + +import Mediator from 'mediator-js/lib/mediator'; +import FocalPoint from './addons/focal-point'; +import Toggler from './addons/toggler'; + +// Import self-initializing addons so they are included in the bundle +import './addons/dropdown-menu'; +import './addons/upload-button'; +import './addons/dropzone.init'; +import './addons/table-dropzone'; +import './addons/copy-move-files'; +import './addons/tooltip'; +import './addons/widget'; +import './addons/popup_handling'; +import './addons/filer_popup_response'; + +window.Cl = window.Cl || {}; +Cl.mediator = new Mediator(); // mediator init +Cl.FocalPoint = FocalPoint; +Cl.Toggler = Toggler; + + +document.addEventListener('DOMContentLoaded', () => { + let showErrorTimeout; + + window.filerShowError = (message) => { + const messages = document.querySelector('.messagelist'); + const header = document.querySelector('#header'); + const filerErrorClass = 'js-filer-error'; + const tpl = `
  • {msg}
`; + const msg = tpl.replace('{msg}', message); + + if (messages) { + messages.outerHTML = msg; + } else if (header) { + header.insertAdjacentHTML('afterend', msg); + } + + if (showErrorTimeout) { + clearTimeout(showErrorTimeout); + } + + showErrorTimeout = setTimeout(() => { + const errorEl = document.querySelector(`.${filerErrorClass}`); + if (errorEl) { + errorEl.remove(); + } + }, 5000); + }; + + const filterFiles = document.querySelector('.js-filter-files'); + if (filterFiles) { + + filterFiles.addEventListener('focus', (event) => { + const container = event.target.closest('.navigator-top-nav'); + if (container) { + container.classList.add('search-is-focused'); + } + }); + + filterFiles.addEventListener('blur', (event) => { + const container = event.target.closest('.navigator-top-nav'); + if (container) { + const dropdownTrigger = container.querySelector('.dropdown-container a'); + if (!dropdownTrigger || event.relatedTarget !== dropdownTrigger) { + container.classList.remove('search-is-focused'); + } + } + }); + } + + // Search form submission logging + const searchForm = document.querySelector('.js-filter-files-container'); + if (searchForm) { + searchForm.addEventListener('submit', (event) => { + // form submit handling + }); + } + + // Focus on the search field on page load + (() => { + const filter = document.querySelector('.js-filter-files'); + const containerSelector = '.navigator-top-nav'; + const container = document.querySelector(containerSelector); + const searchDropdown = container?.querySelector('.filter-search-wrapper .filer-dropdown-container'); + + if (filter) { + filter.addEventListener('keydown', function (event) { + if (event.key === 'Enter') { + // Enter key pressed + } + const navContainer = this.closest(containerSelector); + if (navContainer) { + navContainer.classList.add('search-is-focused'); + } + }); + + if (searchDropdown) { + searchDropdown.addEventListener('show.bs.filer-dropdown', () => { + if (container) { + container.classList.add('search-is-focused'); + } + }); + searchDropdown.addEventListener('hide.bs.filer-dropdown', () => { + if (container) { + container.classList.remove('search-is-focused'); + } + }); + } + } + })(); + + // show counter if file is selected + (() => { + const navigatorTable = document.querySelectorAll('.navigator-table tr, .navigator-list .list-item'); + const actionList = document.querySelector('.actions-wrapper'); + const actionSelect = document.querySelectorAll( + '.action-select, #action-toggle, #files-action-toggle, #folders-action-toggle, .actions .clear a' + ); + + // timeout is needed to wait until table row has class selected. + setTimeout(() => { + // Set classes for checked items + actionSelect.forEach((el) => { + if (el.checked) { + const listItem = el.closest('.list-item'); + if (listItem) { + listItem.classList.add('selected'); + } + } + }); + const hasSelected = Array.from(navigatorTable).some((el) => + el.classList.contains('selected') + ); + if (hasSelected && actionList) { + actionList.classList.add('action-selected'); + } + }, 100); + + actionSelect.forEach((el) => { + el.addEventListener('change', function () { + // Mark element selected (for table view this is done by Django admin js - we do it ourselves + const listItem = this.closest('.list-item'); + if (listItem) { + if (this.checked) { + listItem.classList.add('selected'); + } else { + listItem.classList.remove('selected'); + } + } + // setTimeout makes sure that change event fires before click event which is reliable to admin + setTimeout(() => { + const hasSelected = Array.from(navigatorTable).some((el) => + el.classList.contains('selected') + ); + if (actionList) { + if (hasSelected) { + actionList.classList.add('action-selected'); + } else { + actionList.classList.remove('action-selected'); + } + } + }, 0); + }); + }); + })(); + + (() => { + const actionsMenu = document.querySelector('.js-actions-menu'); + if (!actionsMenu) { + return; + } + + const dropdown = actionsMenu.querySelector('.filer-dropdown-menu'); + const actionsSelect = document.querySelector('.actions select[name="action"]'); + const actionsSelectOptions = actionsSelect?.querySelectorAll('option') || []; + const actionsGo = document.querySelector('.actions button[type="submit"]'); + const actionDelete = document.querySelector('.js-action-delete'); + const actionCopy = document.querySelector('.js-action-copy'); + const actionMove = document.querySelector('.js-action-move'); + const valueDelete = 'delete_files_or_folders'; + const valueCopy = 'copy_files_and_folders'; + const valueMove = 'move_files_and_folders'; + const navigatorTable = document.querySelectorAll('.navigator-table tr, .navigator-list .list-item'); + + // triggers delete copy and move actions on separate buttons + const actionsButton = (optionValue, actionButton) => { + if (!actionButton) { + return; + } + actionsSelectOptions.forEach((option) => { + if (option.value === optionValue) { + actionButton.style.display = ''; + actionButton.addEventListener('click', (e) => { + e.preventDefault(); + const hasSelected = Array.from(navigatorTable).some((el) => + el.classList.contains('selected') + ); + if (hasSelected && actionsSelect && actionsGo) { + actionsSelect.value = optionValue; + const targetOption = actionsSelect.querySelector(`option[value="${optionValue}"]`); + if (targetOption) { + targetOption.selected = true; + } + actionsGo.click(); + } + }); + } + }); + }; + actionsButton(valueDelete, actionDelete); + actionsButton(valueCopy, actionCopy); + actionsButton(valueMove, actionMove); + + // mocking the action buttons to work in frontend UI + actionsSelectOptions.forEach((option, index) => { + if (index !== 0) { + const li = document.createElement('li'); + const a = document.createElement('a'); + a.href = '#'; + a.textContent = option.textContent; + + if (option.value === valueDelete || option.value === valueCopy || option.value === valueMove) { + a.classList.add('hidden'); + } + + li.appendChild(a); + if (dropdown) { + dropdown.appendChild(li); + } + } + }); + if (dropdown) { + + dropdown.addEventListener('click', (clickEvent) => { + if (clickEvent.target.tagName === 'A') { + const li = clickEvent.target.closest('li'); + const targetIndex = Array.from(dropdown.querySelectorAll('li')).indexOf(li) + 1; + + clickEvent.preventDefault(); + + if (actionsSelect && actionsGo) { + const options = actionsSelect.querySelectorAll('option'); + if (options[targetIndex]) { + actionsSelect.value = options[targetIndex].value; + options[targetIndex].selected = true; + } + actionsGo.click(); + } + } + }); + } + + actionsMenu.addEventListener('click', (e) => { + const hasSelected = Array.from(navigatorTable).some((el) => + el.classList.contains('selected') + ); + if (!hasSelected) { + e.preventDefault(); + e.stopPropagation(); + } + }); + })(); + + // breaks header if breadcrumbs name reaches a width of 80px + (() => { + const minBreadcrumbWidth = 80; + const header = document.querySelector('.navigator-top-nav'); + + if (!header) { + return; + } + + const breadcrumbContainer = document.querySelector('.breadcrumbs-container'); + if (!breadcrumbContainer) { + return; + } + + const breadcrumbFolder = breadcrumbContainer.querySelector('.navigator-breadcrumbs'); + const breadcrumbDropdown = breadcrumbContainer.querySelector('.filer-dropdown-container'); + const filterFilesContainer = document.querySelector('.filter-files-container'); + const actionsWrapper = document.querySelector('.actions-wrapper'); + const navigatorButtonWrapper = document.querySelector('.navigator-button-wrapper'); + + const breadcrumbFolderWidth = breadcrumbFolder?.offsetWidth || 0; + const breadcrumbDropdownWidth = breadcrumbDropdown?.offsetWidth || 0; + const searchWidth = filterFilesContainer?.offsetWidth || 0; + const actionsWidth = actionsWrapper?.offsetWidth || 0; + const buttonsWidth = navigatorButtonWrapper?.offsetWidth || 0; + + const headerStyles = window.getComputedStyle(header); + const headerPadding = parseInt(headerStyles.paddingLeft, 10) + parseInt(headerStyles.paddingRight, 10); + + let headerWidth = header.offsetWidth; + const fullHeaderWidth = minBreadcrumbWidth + breadcrumbFolderWidth + + breadcrumbDropdownWidth + searchWidth + actionsWidth + buttonsWidth + headerPadding; + + const breadcrumbSizeHandlerClassName = 'breadcrumb-min-width'; + + const breadcrumbSizeHandler = () => { + if (headerWidth < fullHeaderWidth) { + header.classList.add(breadcrumbSizeHandlerClassName); + } else { + header.classList.remove(breadcrumbSizeHandlerClassName); + } + }; + + breadcrumbSizeHandler(); + + window.addEventListener('resize', () => { + headerWidth = header.offsetWidth; + breadcrumbSizeHandler(); + }); + })(); + // thumbnail folder admin view + (() => { + const actionEls = document.querySelectorAll('.navigator-list .list-item input.action-select'); + const foldersActionCheckboxes = '.navigator-list .navigator-folders-body .list-item input.action-select'; + const filesActionCheckboxes = '.navigator-list .navigator-files-body .list-item input.action-select'; + const allFilesToggle = document.querySelector('#files-action-toggle'); + const allFoldersToggle = document.querySelector('#folders-action-toggle'); + + if (allFoldersToggle) { + allFoldersToggle.addEventListener('click', function () { + const checkboxes = document.querySelectorAll(foldersActionCheckboxes); + if (this.checked) { + checkboxes.forEach((cb) => { + if (!cb.checked) { + cb.click(); + } + }); + } else { + checkboxes.forEach((cb) => { + if (cb.checked) { + cb.click(); + } + }); + } + }); + } + + if (allFilesToggle) { + allFilesToggle.addEventListener('click', function () { + const checkboxes = document.querySelectorAll(filesActionCheckboxes); + if (this.checked) { + checkboxes.forEach((cb) => { + if (!cb.checked) { + cb.click(); + } + }); + } else { + checkboxes.forEach((cb) => { + if (cb.checked) { + cb.click(); + } + }); + } + }); + } + + actionEls.forEach((el) => { + el.addEventListener('click', function () { + const filesCheckboxes = document.querySelectorAll(filesActionCheckboxes); + const foldersCheckboxes = document.querySelectorAll(foldersActionCheckboxes); + + if (!this.checked) { + const hasUncheckedFiles = Array.from(filesCheckboxes).some((cb) => !cb.checked); + const hasUncheckedFolders = Array.from(foldersCheckboxes).some((cb) => !cb.checked); + + if (hasUncheckedFiles && allFilesToggle) { + allFilesToggle.checked = false; + } + if (hasUncheckedFolders && allFoldersToggle) { + allFoldersToggle.checked = false; + } + } else { + const allFilesChecked = Array.from(filesCheckboxes).every((cb) => cb.checked); + const allFoldersChecked = Array.from(foldersCheckboxes).every((cb) => cb.checked); + + if (allFilesChecked && allFilesToggle) { + allFilesToggle.checked = true; + } + if (allFoldersChecked && allFoldersToggle) { + allFoldersToggle.checked = true; + } + } + }); + }); + + const clearLink = document.querySelector('.navigator .actions .clear a'); + if (clearLink) { + clearLink.addEventListener('click', () => { + if (allFoldersToggle) { + allFoldersToggle.checked = false; + } + if (allFilesToggle) { + allFilesToggle.checked = false; + } + }); + } + })(); + + const copyUrlButtons = document.querySelectorAll('.js-copy-url'); + copyUrlButtons.forEach((button) => { + button.addEventListener('click', function (e) { + const url = new URL(this.dataset.url, document.location.href); + const msg = this.dataset.msg || 'URL copied to clipboard'; + const infobox = document.createElement('template'); + e.preventDefault(); + + const existingTooltips = document.querySelectorAll('.info.filer-tooltip'); + existingTooltips.forEach((el) => { + el.remove(); + }); + + navigator.clipboard.writeText(url.href); + infobox.innerHTML = `
${msg}
`; + this.classList.add('filer-tooltip-wrapper'); + this.appendChild(infobox.content.firstChild); + + const self = this; + setTimeout(() => { + const tooltip = self.querySelector('.info'); + if (tooltip) { + tooltip.remove(); + } + }, 1200); + }); + }); + + // Initialize FocalPoint + const focalPoint = new FocalPoint(); + focalPoint.initialize(); + + // Initialize Toggler (auto-initializes in constructor) + new Toggler(); +}); diff --git a/filer/static/filer/js/dist/filer-base.bundle.js b/filer/static/filer/js/dist/filer-base.bundle.js new file mode 100644 index 000000000..4b0a12dad --- /dev/null +++ b/filer/static/filer/js/dist/filer-base.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see filer-base.bundle.js.LICENSE.txt */ +(()=>{var e={117(){"use strict";document.addEventListener("DOMContentLoaded",()=>{const e=document.getElementById("destination");if(!e)return;const t=e.querySelectorAll("option"),n=t.length,r=document.querySelector(".js-submit-copy-move"),i=document.querySelector(".js-disabled-btn-tooltip");1===n&&t[0].disabled&&(r&&(r.style.display="none"),i&&(i.style.display="inline-block")),Cl.filerTooltip&&Cl.filerTooltip()})},413(){"use strict";(()=>{const e="filer-dropdown-backdrop",t='[data-toggle="filer-dropdown"]';class n{constructor(e){this.element=e,e.addEventListener("click",()=>this.toggle())}toggle(){const t=this.element,n=r(t),o=n.classList.contains("open"),s={relatedTarget:t};if(t.disabled||t.classList.contains("disabled"))return!1;if(i(),!o){if("ontouchstart"in document.documentElement&&!n.closest(".navbar-nav")){const n=document.createElement("div");n.className=e,t.parentNode.insertBefore(n,t.nextSibling),n.addEventListener("click",i)}const r=new CustomEvent("show.bs.filer-dropdown",{bubbles:!0,cancelable:!0,detail:s});if(n.dispatchEvent(r),r.defaultPrevented)return!1;t.focus(),t.setAttribute("aria-expanded","true"),n.classList.add("open");const o=new CustomEvent("shown.bs.filer-dropdown",{bubbles:!0,detail:s});n.dispatchEvent(o)}return!1}keydown(e){const n=this.element,i=r(n),o=i.classList.contains("open"),s=Array.from(i.querySelectorAll(".filer-dropdown-menu li:not(.disabled):visible a")).filter(e=>null!==e.offsetParent),a=s.indexOf(e.target);if(!/(38|40|27|32)/.test(e.which)||/input|textarea/i.test(e.target.tagName))return;if(e.preventDefault(),e.stopPropagation(),n.disabled||n.classList.contains("disabled"))return;if(!o&&27!==e.which||o&&27===e.which)return 27===e.which&&i.querySelector(t)?.focus(),n.click();if(!s.length)return;let l=a;38===e.which&&a>0&&l--,40===e.which&&ae.remove()),document.querySelectorAll(t).forEach(e=>{const t=r(e),i={relatedTarget:e};if(!t.classList.contains("open"))return;if(n&&"click"===n.type&&/input|textarea/i.test(n.target.tagName)&&t.contains(n.target))return;const o=new CustomEvent("hide.bs.filer-dropdown",{bubbles:!0,cancelable:!0,detail:i});if(t.dispatchEvent(o),o.defaultPrevented)return;e.setAttribute("aria-expanded","false"),t.classList.remove("open");const s=new CustomEvent("hidden.bs.filer-dropdown",{bubbles:!0,detail:i});t.dispatchEvent(s)}))}function o(e){return this.forEach(t=>{let r=t._filerDropdownInstance;r||(r=new n(t),t._filerDropdownInstance=r),"string"==typeof e&&r[e].call(t)}),this}NodeList.prototype.dropdown||(NodeList.prototype.dropdown=function(e){return o.call(this,e)}),HTMLCollection.prototype.dropdown||(HTMLCollection.prototype.dropdown=function(e){return o.call(this,e)}),document.addEventListener("click",i),document.addEventListener("click",e=>{e.target.closest(".filer-dropdown form")&&e.stopPropagation()}),document.addEventListener("click",e=>{const r=e.target.closest(t);if(r){const t=r._filerDropdownInstance||new n(r);r._filerDropdownInstance||(r._filerDropdownInstance=t),t.toggle(e)}}),document.addEventListener("keydown",e=>{const r=e.target.closest(t);if(r){const t=r._filerDropdownInstance||new n(r);r._filerDropdownInstance||(r._filerDropdownInstance=t),t.keydown(e)}}),document.addEventListener("keydown",e=>{const r=e.target.closest(".filer-dropdown-menu");if(r){const i=r.parentNode.querySelector(t);if(i){const t=i._filerDropdownInstance||new n(i);i._filerDropdownInstance||(i._filerDropdownInstance=t),t.keydown(e)}}}),window.FilerDropdown=n})()},577(){!function(){"use strict";const e=document.getElementById("django-admin-popup-response-constants");let t;if(e)switch(t=JSON.parse(e.dataset.popupResponse),t.action){case"change":opener.dismissRelatedImageLookupPopup(window,t.new_value,null,t.obj,null);break;case"delete":opener.dismissDeleteRelatedObjectPopup(window,t.value);break;default:opener.dismissAddRelatedObjectPopup(window,t.value,t.obj)}}()},216(e,t,n){"use strict";n.d(t,{A:()=>r}),e=n.hmd(e),window.Cl=window.Cl||{},(()=>{class t{constructor(e={}){this.options={containerSelector:".js-focal-point",imageSelector:".js-focal-point-image",circleSelector:".js-focal-point-circle",locationSelector:".js-focal-point-location",draggableClass:"draggable",hiddenClass:"hidden",dataLocation:"locationSelector",...e},this.focalPointInstances=[],this._init=this._init.bind(this)}_init(e){const t=new n(e,this.options);this.focalPointInstances.push(t)}initialize(){document.querySelectorAll(this.options.containerSelector).forEach(e=>{this._init(e)}),window.Cl.mediator&&window.Cl.mediator.subscribe("focal-point:init",this._init)}destroy(){window.Cl.mediator&&window.Cl.mediator.remove("focal-point:init",this._init),this.focalPointInstances.forEach(e=>{e.destroy()}),this.focalPointInstances=[]}}class n{constructor(e,t={}){this.options={imageSelector:".js-focal-point-image",circleSelector:".js-focal-point-circle",locationSelector:".js-focal-point-location",draggableClass:"draggable",hiddenClass:"hidden",dataLocation:"locationSelector",...t},this.container=e,this.image=this.container.querySelector(this.options.imageSelector),this.circle=this.container.querySelector(this.options.circleSelector),this.ratio=parseFloat(this.image?.dataset.ratio||1),this.location=this._getLocation(),this.isDragging=!1,this.dragStartX=0,this.dragStartY=0,this.circleStartX=0,this.circleStartY=0,this._onImageLoaded=this._onImageLoaded.bind(this),this._onMouseDown=this._onMouseDown.bind(this),this._onMouseMove=this._onMouseMove.bind(this),this._onMouseUp=this._onMouseUp.bind(this),this.image?.complete?this._onImageLoaded():this.image&&this.image.addEventListener("load",this._onImageLoaded)}_updateLocationValue(e,t){const n=`${Math.round(e*this.ratio)},${Math.round(t*this.ratio)}`;this.location&&(this.location.value=n)}_getLocation(){const e=this.container.dataset[this.options.dataLocation];if(e){const t=document.querySelector(e);if(t)return t}return this.container.querySelector(this.options.locationSelector)}_makeDraggable(){this.circle&&(this.circle.classList.add(this.options.draggableClass),this.circle.addEventListener("mousedown",this._onMouseDown),this.circle.addEventListener("touchstart",this._onMouseDown,{passive:!1}))}_onMouseDown(e){e.preventDefault(),this.isDragging=!0;const t="touchstart"===e.type?e.touches[0]:e,n=this.container.getBoundingClientRect();this.dragStartX=t.clientX-n.left,this.dragStartY=t.clientY-n.top;const r=this.circle.getBoundingClientRect();this.circleStartX=r.left-n.left+r.width/2,this.circleStartY=r.top-n.top+r.height/2,document.addEventListener("mousemove",this._onMouseMove),document.addEventListener("mouseup",this._onMouseUp),document.addEventListener("touchmove",this._onMouseMove,{passive:!1}),document.addEventListener("touchend",this._onMouseUp)}_onMouseMove(e){if(!this.isDragging)return;e.preventDefault();const t="touchmove"===e.type?e.touches[0]:e,n=this.container.getBoundingClientRect(),r=t.clientX-n.left,i=t.clientY-n.top,o=r-this.dragStartX,s=i-this.dragStartY;let a=this.circleStartX+o,l=this.circleStartY+s;a=Math.max(0,Math.min(n.width-1,a)),l=Math.max(0,Math.min(n.height-1,l)),this.circle.style.left=`${a}px`,this.circle.style.top=`${l}px`,this._updateLocationValue(a,l)}_onMouseUp(){this.isDragging=!1,document.removeEventListener("mousemove",this._onMouseMove),document.removeEventListener("mouseup",this._onMouseUp),document.removeEventListener("touchmove",this._onMouseMove),document.removeEventListener("touchend",this._onMouseUp)}_onImageLoaded(){if(!this.image||0===this.image.naturalWidth)return;this.circle?.classList.remove(this.options.hiddenClass);const e=this.location?.value||"",t=this.image.offsetWidth,n=this.image.offsetHeight;let r,i;if(e.length){const t=e.split(",");r=Math.round(Number(t[0])/this.ratio),i=Math.round(Number(t[1])/this.ratio)}else r=t/2,i=n/2;isNaN(r)||isNaN(i)||(this.circle&&(this.circle.style.left=`${r}px`,this.circle.style.top=`${i}px`),this._makeDraggable(),this._updateLocationValue(r,i))}destroy(){this.circle?.classList.contains(this.options.draggableClass)&&(this.circle.removeEventListener("mousedown",this._onMouseDown),this.circle.removeEventListener("touchstart",this._onMouseDown)),document.removeEventListener("mousemove",this._onMouseMove),document.removeEventListener("mouseup",this._onMouseUp),document.removeEventListener("touchmove",this._onMouseMove),document.removeEventListener("touchend",this._onMouseUp),this.image&&this.image.removeEventListener("load",this._onImageLoaded),this.options=null,this.container=null,this.image=null,this.circle=null,this.location=null,this.ratio=null}}window.Cl.FocalPoint=t,window.Cl.FocalPointConstructor=n,e.exports&&(e.exports=t)})();const r=window.Cl.FocalPoint},902(){"use strict";const e=e=>{const t=(e=(e=e.replace(/__dot__/g,".")).replace(/__dash__/g,"-")).lastIndexOf("__");return-1===t?e:e.substring(0,t)};window.dismissPopupAndReload=e=>{document.location.reload(),e.close()},window.dismissRelatedImageLookupPopup=(t,n,r,i,o)=>{const s=e(t.name),a=document.getElementById(s);if(!a)return;const l=a.closest(".filerFile");if(!l)return;const c=l.querySelector(".edit"),u=l.querySelector(".thumbnail_img"),d=l.querySelector(".description_text"),f=l.querySelector(".filerClearer"),p=l.parentElement.querySelector(".dz-message"),h=l.querySelector("input"),v=h.value;h.value=n;const m=h.closest(".js-filer-dropzone");m&&m.classList.add("js-object-attached"),r&&u&&(u.src=r,u.classList.remove("hidden"),u.removeAttribute("srcset")),d&&(d.textContent=i),f&&f.classList.remove("hidden"),a.classList.add("related-lookup-change"),c&&c.classList.add("related-lookup-change"),o&&c&&c.setAttribute("href",`${o}?_edit_from_widget=1`),p&&p.classList.add("hidden"),v!==n&&h.dispatchEvent(new Event("change",{bubbles:!0})),t.close()},window.dismissRelatedFolderLookupPopup=(t,n,r)=>{const i=e(t.name),o=document.getElementById(i);if(!o)return;const s=o.closest(".filerFile");if(!s)return;const a=s.querySelector(".thumbnail_img"),l=document.getElementById(`id_${i}_clear`),c=document.getElementById(`id_${i}`),u=s.querySelector(".description_text"),d=document.getElementById(i);c&&(c.value=n),a&&a.classList.remove("hidden"),u&&(u.textContent=r),l&&l.classList.remove("hidden"),d&&d.classList.add("hidden"),t.close()},document.addEventListener("DOMContentLoaded",()=>{document.querySelectorAll(".js-dismiss-popup").forEach(e=>{e.addEventListener("click",function(e){e.preventDefault();const t=this.dataset.fileId,n=this.dataset.iconUrl,r=this.dataset.label;if(this.classList.contains("js-dismiss-image")){const e=this.dataset.changeUrl||"";window.opener.dismissRelatedImageLookupPopup(window,t,n,r,e)}else this.classList.contains("js-dismiss-folder")&&window.opener.dismissRelatedFolderLookupPopup(window,t,r)})});const e=document.getElementById("popup-dismiss-data");if(e&&window.opener){const t=e.dataset.pk,n=e.dataset.label;window.opener.dismissRelatedPopup(window,t,n)}})},221(){"use strict";window.Cl=window.Cl||{},Cl.filerTooltip=()=>{const e=".js-filer-tooltip";document.querySelectorAll(e).forEach(t=>{t.addEventListener("mouseover",function(){const t=this.getAttribute("title");if(!t)return;this.dataset.filerTooltip=t,this.removeAttribute("title");const n=document.createElement("p");n.className="filer-tooltip",n.textContent=t;const r=document.querySelector(e);r&&r.appendChild(n)}),t.addEventListener("mouseout",function(){const e=this.dataset.filerTooltip;e&&this.setAttribute("title",e),document.querySelectorAll(".filer-tooltip").forEach(e=>{e.remove()})})})}},472(){"use strict";document.addEventListener("DOMContentLoaded",()=>{const e=e=>{e.preventDefault();const t=e.currentTarget,n=t.closest(".filerFile");if(!n)return;const r=n.querySelector("input"),i=n.querySelector(".thumbnail_img"),o=n.querySelector(".description_text"),s=n.querySelector(".lookup"),a=n.querySelector(".edit"),l=n.parentElement.querySelector(".dz-message"),c="hidden";if(t.classList.add(c),r&&(r.value=""),i){i.classList.add(c);var u=i.parentElement;"A"===u.tagName&&u.removeAttribute("href")}s&&s.classList.remove("related-lookup-change"),a&&a.classList.remove("related-lookup-change"),l&&l.classList.remove(c),o&&(o.textContent="")};document.querySelectorAll(".filerFile .vForeignKeyRawIdAdminField").forEach(e=>{e.setAttribute("type","hidden")}),document.querySelectorAll(".filerFile .filerClearer").forEach(t=>{t.addEventListener("click",e)})})},628(e){var t;self,t=function(){return function(){var e={3099:function(e){e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},6077:function(e,t,n){var r=n(111);e.exports=function(e){if(!r(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e}},1223:function(e,t,n){var r=n(5112),i=n(30),o=n(3070),s=r("unscopables"),a=Array.prototype;null==a[s]&&o.f(a,s,{configurable:!0,value:i(null)}),e.exports=function(e){a[s][e]=!0}},1530:function(e,t,n){"use strict";var r=n(8710).charAt;e.exports=function(e,t,n){return t+(n?r(e,t).length:1)}},5787:function(e){e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e}},9670:function(e,t,n){var r=n(111);e.exports=function(e){if(!r(e))throw TypeError(String(e)+" is not an object");return e}},4019:function(e){e.exports="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView},260:function(e,t,n){"use strict";var r,i=n(4019),o=n(9781),s=n(7854),a=n(111),l=n(6656),c=n(648),u=n(8880),d=n(1320),f=n(3070).f,p=n(9518),h=n(7674),v=n(5112),m=n(9711),y=s.Int8Array,g=y&&y.prototype,b=s.Uint8ClampedArray,w=b&&b.prototype,x=y&&p(y),E=g&&p(g),S=Object.prototype,k=S.isPrototypeOf,L=v("toStringTag"),A=m("TYPED_ARRAY_TAG"),C=i&&!!h&&"Opera"!==c(s.opera),_=!1,T={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},F={BigInt64Array:8,BigUint64Array:8},I=function(e){if(!a(e))return!1;var t=c(e);return l(T,t)||l(F,t)};for(r in T)s[r]||(C=!1);if((!C||"function"!=typeof x||x===Function.prototype)&&(x=function(){throw TypeError("Incorrect invocation")},C))for(r in T)s[r]&&h(s[r],x);if((!C||!E||E===S)&&(E=x.prototype,C))for(r in T)s[r]&&h(s[r].prototype,E);if(C&&p(w)!==E&&h(w,E),o&&!l(E,L))for(r in _=!0,f(E,L,{get:function(){return a(this)?this[A]:void 0}}),T)s[r]&&u(s[r],A,r);e.exports={NATIVE_ARRAY_BUFFER_VIEWS:C,TYPED_ARRAY_TAG:_&&A,aTypedArray:function(e){if(I(e))return e;throw TypeError("Target is not a typed array")},aTypedArrayConstructor:function(e){if(h){if(k.call(x,e))return e}else for(var t in T)if(l(T,r)){var n=s[t];if(n&&(e===n||k.call(n,e)))return e}throw TypeError("Target is not a typed array constructor")},exportTypedArrayMethod:function(e,t,n){if(o){if(n)for(var r in T){var i=s[r];i&&l(i.prototype,e)&&delete i.prototype[e]}E[e]&&!n||d(E,e,n?t:C&&g[e]||t)}},exportTypedArrayStaticMethod:function(e,t,n){var r,i;if(o){if(h){if(n)for(r in T)(i=s[r])&&l(i,e)&&delete i[e];if(x[e]&&!n)return;try{return d(x,e,n?t:C&&y[e]||t)}catch(e){}}for(r in T)!(i=s[r])||i[e]&&!n||d(i,e,t)}},isView:function(e){if(!a(e))return!1;var t=c(e);return"DataView"===t||l(T,t)||l(F,t)},isTypedArray:I,TypedArray:x,TypedArrayPrototype:E}},3331:function(e,t,n){"use strict";var r=n(7854),i=n(9781),o=n(4019),s=n(8880),a=n(2248),l=n(7293),c=n(5787),u=n(9958),d=n(7466),f=n(7067),p=n(1179),h=n(9518),v=n(7674),m=n(8006).f,y=n(3070).f,g=n(1285),b=n(8003),w=n(9909),x=w.get,E=w.set,S="ArrayBuffer",k="DataView",L="prototype",A="Wrong index",C=r[S],_=C,T=r[k],F=T&&T[L],I=Object.prototype,M=r.RangeError,R=p.pack,z=p.unpack,q=function(e){return[255&e]},j=function(e){return[255&e,e>>8&255]},U=function(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]},O=function(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]},P=function(e){return R(e,23,4)},D=function(e){return R(e,52,8)},N=function(e,t){y(e[L],t,{get:function(){return x(this)[t]}})},$=function(e,t,n,r){var i=f(n),o=x(e);if(i+t>o.byteLength)throw M(A);var s=x(o.buffer).bytes,a=i+o.byteOffset,l=s.slice(a,a+t);return r?l:l.reverse()},B=function(e,t,n,r,i,o){var s=f(n),a=x(e);if(s+t>a.byteLength)throw M(A);for(var l=x(a.buffer).bytes,c=s+a.byteOffset,u=r(+i),d=0;dG;)(W=Y[G++])in _||s(_,W,C[W]);H.constructor=_}v&&h(F)!==I&&v(F,I);var Q=new T(new _(2)),X=F.setInt8;Q.setInt8(0,2147483648),Q.setInt8(1,2147483649),!Q.getInt8(0)&&Q.getInt8(1)||a(F,{setInt8:function(e,t){X.call(this,e,t<<24>>24)},setUint8:function(e,t){X.call(this,e,t<<24>>24)}},{unsafe:!0})}else _=function(e){c(this,_,S);var t=f(e);E(this,{bytes:g.call(new Array(t),0),byteLength:t}),i||(this.byteLength=t)},T=function(e,t,n){c(this,T,k),c(e,_,k);var r=x(e).byteLength,o=u(t);if(o<0||o>r)throw M("Wrong offset");if(o+(n=void 0===n?r-o:d(n))>r)throw M("Wrong length");E(this,{buffer:e,byteLength:n,byteOffset:o}),i||(this.buffer=e,this.byteLength=n,this.byteOffset=o)},i&&(N(_,"byteLength"),N(T,"buffer"),N(T,"byteLength"),N(T,"byteOffset")),a(T[L],{getInt8:function(e){return $(this,1,e)[0]<<24>>24},getUint8:function(e){return $(this,1,e)[0]},getInt16:function(e){var t=$(this,2,e,arguments.length>1?arguments[1]:void 0);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=$(this,2,e,arguments.length>1?arguments[1]:void 0);return t[1]<<8|t[0]},getInt32:function(e){return O($(this,4,e,arguments.length>1?arguments[1]:void 0))},getUint32:function(e){return O($(this,4,e,arguments.length>1?arguments[1]:void 0))>>>0},getFloat32:function(e){return z($(this,4,e,arguments.length>1?arguments[1]:void 0),23)},getFloat64:function(e){return z($(this,8,e,arguments.length>1?arguments[1]:void 0),52)},setInt8:function(e,t){B(this,1,e,q,t)},setUint8:function(e,t){B(this,1,e,q,t)},setInt16:function(e,t){B(this,2,e,j,t,arguments.length>2?arguments[2]:void 0)},setUint16:function(e,t){B(this,2,e,j,t,arguments.length>2?arguments[2]:void 0)},setInt32:function(e,t){B(this,4,e,U,t,arguments.length>2?arguments[2]:void 0)},setUint32:function(e,t){B(this,4,e,U,t,arguments.length>2?arguments[2]:void 0)},setFloat32:function(e,t){B(this,4,e,P,t,arguments.length>2?arguments[2]:void 0)},setFloat64:function(e,t){B(this,8,e,D,t,arguments.length>2?arguments[2]:void 0)}});b(_,S),b(T,k),e.exports={ArrayBuffer:_,DataView:T}},1048:function(e,t,n){"use strict";var r=n(7908),i=n(1400),o=n(7466),s=Math.min;e.exports=[].copyWithin||function(e,t){var n=r(this),a=o(n.length),l=i(e,a),c=i(t,a),u=arguments.length>2?arguments[2]:void 0,d=s((void 0===u?a:i(u,a))-c,a-l),f=1;for(c0;)c in n?n[l]=n[c]:delete n[l],l+=f,c+=f;return n}},1285:function(e,t,n){"use strict";var r=n(7908),i=n(1400),o=n(7466);e.exports=function(e){for(var t=r(this),n=o(t.length),s=arguments.length,a=i(s>1?arguments[1]:void 0,n),l=s>2?arguments[2]:void 0,c=void 0===l?n:i(l,n);c>a;)t[a++]=e;return t}},8533:function(e,t,n){"use strict";var r=n(2092).forEach,i=n(9341)("forEach");e.exports=i?[].forEach:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}},8457:function(e,t,n){"use strict";var r=n(9974),i=n(7908),o=n(3411),s=n(7659),a=n(7466),l=n(6135),c=n(1246);e.exports=function(e){var t,n,u,d,f,p,h=i(e),v="function"==typeof this?this:Array,m=arguments.length,y=m>1?arguments[1]:void 0,g=void 0!==y,b=c(h),w=0;if(g&&(y=r(y,m>2?arguments[2]:void 0,2)),null==b||v==Array&&s(b))for(n=new v(t=a(h.length));t>w;w++)p=g?y(h[w],w):h[w],l(n,w,p);else for(f=(d=b.call(h)).next,n=new v;!(u=f.call(d)).done;w++)p=g?o(d,y,[u.value,w],!0):u.value,l(n,w,p);return n.length=w,n}},1318:function(e,t,n){var r=n(5656),i=n(7466),o=n(1400),s=function(e){return function(t,n,s){var a,l=r(t),c=i(l.length),u=o(s,c);if(e&&n!=n){for(;c>u;)if((a=l[u++])!=a)return!0}else for(;c>u;u++)if((e||u in l)&&l[u]===n)return e||u||0;return!e&&-1}};e.exports={includes:s(!0),indexOf:s(!1)}},2092:function(e,t,n){var r=n(9974),i=n(8361),o=n(7908),s=n(7466),a=n(5417),l=[].push,c=function(e){var t=1==e,n=2==e,c=3==e,u=4==e,d=6==e,f=7==e,p=5==e||d;return function(h,v,m,y){for(var g,b,w=o(h),x=i(w),E=r(v,m,3),S=s(x.length),k=0,L=y||a,A=t?L(h,S):n||f?L(h,0):void 0;S>k;k++)if((p||k in x)&&(b=E(g=x[k],k,w),e))if(t)A[k]=b;else if(b)switch(e){case 3:return!0;case 5:return g;case 6:return k;case 2:l.call(A,g)}else switch(e){case 4:return!1;case 7:l.call(A,g)}return d?-1:c||u?u:A}};e.exports={forEach:c(0),map:c(1),filter:c(2),some:c(3),every:c(4),find:c(5),findIndex:c(6),filterOut:c(7)}},6583:function(e,t,n){"use strict";var r=n(5656),i=n(9958),o=n(7466),s=n(9341),a=Math.min,l=[].lastIndexOf,c=!!l&&1/[1].lastIndexOf(1,-0)<0,u=s("lastIndexOf"),d=c||!u;e.exports=d?function(e){if(c)return l.apply(this,arguments)||0;var t=r(this),n=o(t.length),s=n-1;for(arguments.length>1&&(s=a(s,i(arguments[1]))),s<0&&(s=n+s);s>=0;s--)if(s in t&&t[s]===e)return s||0;return-1}:l},1194:function(e,t,n){var r=n(7293),i=n(5112),o=n(7392),s=i("species");e.exports=function(e){return o>=51||!r(function(){var t=[];return(t.constructor={})[s]=function(){return{foo:1}},1!==t[e](Boolean).foo})}},9341:function(e,t,n){"use strict";var r=n(7293);e.exports=function(e,t){var n=[][e];return!!n&&r(function(){n.call(null,t||function(){throw 1},1)})}},3671:function(e,t,n){var r=n(3099),i=n(7908),o=n(8361),s=n(7466),a=function(e){return function(t,n,a,l){r(n);var c=i(t),u=o(c),d=s(c.length),f=e?d-1:0,p=e?-1:1;if(a<2)for(;;){if(f in u){l=u[f],f+=p;break}if(f+=p,e?f<0:d<=f)throw TypeError("Reduce of empty array with no initial value")}for(;e?f>=0:d>f;f+=p)f in u&&(l=n(l,u[f],f,c));return l}};e.exports={left:a(!1),right:a(!0)}},5417:function(e,t,n){var r=n(111),i=n(3157),o=n(5112)("species");e.exports=function(e,t){var n;return i(e)&&("function"!=typeof(n=e.constructor)||n!==Array&&!i(n.prototype)?r(n)&&null===(n=n[o])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===t?0:t)}},3411:function(e,t,n){var r=n(9670),i=n(9212);e.exports=function(e,t,n,o){try{return o?t(r(n)[0],n[1]):t(n)}catch(t){throw i(e),t}}},7072:function(e,t,n){var r=n(5112)("iterator"),i=!1;try{var o=0,s={next:function(){return{done:!!o++}},return:function(){i=!0}};s[r]=function(){return this},Array.from(s,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!i)return!1;var n=!1;try{var o={};o[r]=function(){return{next:function(){return{done:n=!0}}}},e(o)}catch(e){}return n}},4326:function(e){var t={}.toString;e.exports=function(e){return t.call(e).slice(8,-1)}},648:function(e,t,n){var r=n(1694),i=n(4326),o=n(5112)("toStringTag"),s="Arguments"==i(function(){return arguments}());e.exports=r?i:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),o))?n:s?i(t):"Object"==(r=i(t))&&"function"==typeof t.callee?"Arguments":r}},9920:function(e,t,n){var r=n(6656),i=n(3887),o=n(1236),s=n(3070);e.exports=function(e,t){for(var n=i(t),a=s.f,l=o.f,c=0;c=74)&&(r=s.match(/Chrome\/(\d+)/))&&(i=r[1]),e.exports=i&&+i},748:function(e){e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},2109:function(e,t,n){var r=n(7854),i=n(1236).f,o=n(8880),s=n(1320),a=n(3505),l=n(9920),c=n(4705);e.exports=function(e,t){var n,u,d,f,p,h=e.target,v=e.global,m=e.stat;if(n=v?r:m?r[h]||a(h,{}):(r[h]||{}).prototype)for(u in t){if(f=t[u],d=e.noTargetGet?(p=i(n,u))&&p.value:n[u],!c(v?u:h+(m?".":"#")+u,e.forced)&&void 0!==d){if(typeof f==typeof d)continue;l(f,d)}(e.sham||d&&d.sham)&&o(f,"sham",!0),s(n,u,f,e)}}},7293:function(e){e.exports=function(e){try{return!!e()}catch(e){return!0}}},7007:function(e,t,n){"use strict";n(4916);var r=n(1320),i=n(7293),o=n(5112),s=n(2261),a=n(8880),l=o("species"),c=!i(function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$
")}),u="$0"==="a".replace(/./,"$0"),d=o("replace"),f=!!/./[d]&&""===/./[d]("a","$0"),p=!i(function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]});e.exports=function(e,t,n,d){var h=o(e),v=!i(function(){var t={};return t[h]=function(){return 7},7!=""[e](t)}),m=v&&!i(function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[l]=function(){return n},n.flags="",n[h]=/./[h]),n.exec=function(){return t=!0,null},n[h](""),!t});if(!v||!m||"replace"===e&&(!c||!u||f)||"split"===e&&!p){var y=/./[h],g=n(h,""[e],function(e,t,n,r,i){return t.exec===s?v&&!i?{done:!0,value:y.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}},{REPLACE_KEEPS_$0:u,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:f}),b=g[0],w=g[1];r(String.prototype,e,b),r(RegExp.prototype,h,2==t?function(e,t){return w.call(e,this,t)}:function(e){return w.call(e,this)})}d&&a(RegExp.prototype[h],"sham",!0)}},9974:function(e,t,n){var r=n(3099);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}}},5005:function(e,t,n){var r=n(857),i=n(7854),o=function(e){return"function"==typeof e?e:void 0};e.exports=function(e,t){return arguments.length<2?o(r[e])||o(i[e]):r[e]&&r[e][t]||i[e]&&i[e][t]}},1246:function(e,t,n){var r=n(648),i=n(7497),o=n(5112)("iterator");e.exports=function(e){if(null!=e)return e[o]||e["@@iterator"]||i[r(e)]}},8554:function(e,t,n){var r=n(9670),i=n(1246);e.exports=function(e){var t=i(e);if("function"!=typeof t)throw TypeError(String(e)+" is not iterable");return r(t.call(e))}},647:function(e,t,n){var r=n(7908),i=Math.floor,o="".replace,s=/\$([$&'`]|\d\d?|<[^>]*>)/g,a=/\$([$&'`]|\d\d?)/g;e.exports=function(e,t,n,l,c,u){var d=n+e.length,f=l.length,p=a;return void 0!==c&&(c=r(c),p=s),o.call(u,p,function(r,o){var s;switch(o.charAt(0)){case"$":return"$";case"&":return e;case"`":return t.slice(0,n);case"'":return t.slice(d);case"<":s=c[o.slice(1,-1)];break;default:var a=+o;if(0===a)return r;if(a>f){var u=i(a/10);return 0===u?r:u<=f?void 0===l[u-1]?o.charAt(1):l[u-1]+o.charAt(1):r}s=l[a-1]}return void 0===s?"":s})}},7854:function(e,t,n){var r=function(e){return e&&e.Math==Math&&e};e.exports=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof n.g&&n.g)||function(){return this}()||Function("return this")()},6656:function(e){var t={}.hasOwnProperty;e.exports=function(e,n){return t.call(e,n)}},3501:function(e){e.exports={}},490:function(e,t,n){var r=n(5005);e.exports=r("document","documentElement")},4664:function(e,t,n){var r=n(9781),i=n(7293),o=n(317);e.exports=!r&&!i(function(){return 7!=Object.defineProperty(o("div"),"a",{get:function(){return 7}}).a})},1179:function(e){var t=Math.abs,n=Math.pow,r=Math.floor,i=Math.log,o=Math.LN2;e.exports={pack:function(e,s,a){var l,c,u,d=new Array(a),f=8*a-s-1,p=(1<>1,v=23===s?n(2,-24)-n(2,-77):0,m=e<0||0===e&&1/e<0?1:0,y=0;for((e=t(e))!=e||e===1/0?(c=e!=e?1:0,l=p):(l=r(i(e)/o),e*(u=n(2,-l))<1&&(l--,u*=2),(e+=l+h>=1?v/u:v*n(2,1-h))*u>=2&&(l++,u/=2),l+h>=p?(c=0,l=p):l+h>=1?(c=(e*u-1)*n(2,s),l+=h):(c=e*n(2,h-1)*n(2,s),l=0));s>=8;d[y++]=255&c,c/=256,s-=8);for(l=l<0;d[y++]=255&l,l/=256,f-=8);return d[--y]|=128*m,d},unpack:function(e,t){var r,i=e.length,o=8*i-t-1,s=(1<>1,l=o-7,c=i-1,u=e[c--],d=127&u;for(u>>=7;l>0;d=256*d+e[c],c--,l-=8);for(r=d&(1<<-l)-1,d>>=-l,l+=t;l>0;r=256*r+e[c],c--,l-=8);if(0===d)d=1-a;else{if(d===s)return r?NaN:u?-1/0:1/0;r+=n(2,t),d-=a}return(u?-1:1)*r*n(2,d-t)}}},8361:function(e,t,n){var r=n(7293),i=n(4326),o="".split;e.exports=r(function(){return!Object("z").propertyIsEnumerable(0)})?function(e){return"String"==i(e)?o.call(e,""):Object(e)}:Object},9587:function(e,t,n){var r=n(111),i=n(7674);e.exports=function(e,t,n){var o,s;return i&&"function"==typeof(o=t.constructor)&&o!==n&&r(s=o.prototype)&&s!==n.prototype&&i(e,s),e}},2788:function(e,t,n){var r=n(5465),i=Function.toString;"function"!=typeof r.inspectSource&&(r.inspectSource=function(e){return i.call(e)}),e.exports=r.inspectSource},9909:function(e,t,n){var r,i,o,s=n(8536),a=n(7854),l=n(111),c=n(8880),u=n(6656),d=n(5465),f=n(6200),p=n(3501),h=a.WeakMap;if(s){var v=d.state||(d.state=new h),m=v.get,y=v.has,g=v.set;r=function(e,t){return t.facade=e,g.call(v,e,t),t},i=function(e){return m.call(v,e)||{}},o=function(e){return y.call(v,e)}}else{var b=f("state");p[b]=!0,r=function(e,t){return t.facade=e,c(e,b,t),t},i=function(e){return u(e,b)?e[b]:{}},o=function(e){return u(e,b)}}e.exports={set:r,get:i,has:o,enforce:function(e){return o(e)?i(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!l(t)||(n=i(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}}},7659:function(e,t,n){var r=n(5112),i=n(7497),o=r("iterator"),s=Array.prototype;e.exports=function(e){return void 0!==e&&(i.Array===e||s[o]===e)}},3157:function(e,t,n){var r=n(4326);e.exports=Array.isArray||function(e){return"Array"==r(e)}},4705:function(e,t,n){var r=n(7293),i=/#|\.prototype\./,o=function(e,t){var n=a[s(e)];return n==c||n!=l&&("function"==typeof t?r(t):!!t)},s=o.normalize=function(e){return String(e).replace(i,".").toLowerCase()},a=o.data={},l=o.NATIVE="N",c=o.POLYFILL="P";e.exports=o},111:function(e){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},1913:function(e){e.exports=!1},7850:function(e,t,n){var r=n(111),i=n(4326),o=n(5112)("match");e.exports=function(e){var t;return r(e)&&(void 0!==(t=e[o])?!!t:"RegExp"==i(e))}},9212:function(e,t,n){var r=n(9670);e.exports=function(e){var t=e.return;if(void 0!==t)return r(t.call(e)).value}},3383:function(e,t,n){"use strict";var r,i,o,s=n(7293),a=n(9518),l=n(8880),c=n(6656),u=n(5112),d=n(1913),f=u("iterator"),p=!1;[].keys&&("next"in(o=[].keys())?(i=a(a(o)))!==Object.prototype&&(r=i):p=!0);var h=null==r||s(function(){var e={};return r[f].call(e)!==e});h&&(r={}),d&&!h||c(r,f)||l(r,f,function(){return this}),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:p}},7497:function(e){e.exports={}},133:function(e,t,n){var r=n(7293);e.exports=!!Object.getOwnPropertySymbols&&!r(function(){return!String(Symbol())})},590:function(e,t,n){var r=n(7293),i=n(5112),o=n(1913),s=i("iterator");e.exports=!r(function(){var e=new URL("b?a=1&b=2&c=3","http://a"),t=e.searchParams,n="";return e.pathname="c%20d",t.forEach(function(e,r){t.delete("b"),n+=r+e}),o&&!e.toJSON||!t.sort||"http://a/c%20d?a=1&c=3"!==e.href||"3"!==t.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!t[s]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==n||"x"!==new URL("http://x",void 0).host})},8536:function(e,t,n){var r=n(7854),i=n(2788),o=r.WeakMap;e.exports="function"==typeof o&&/native code/.test(i(o))},1574:function(e,t,n){"use strict";var r=n(9781),i=n(7293),o=n(1956),s=n(5181),a=n(5296),l=n(7908),c=n(8361),u=Object.assign,d=Object.defineProperty;e.exports=!u||i(function(){if(r&&1!==u({b:1},u(d({},"a",{enumerable:!0,get:function(){d(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),i="abcdefghijklmnopqrst";return e[n]=7,i.split("").forEach(function(e){t[e]=e}),7!=u({},e)[n]||o(u({},t)).join("")!=i})?function(e,t){for(var n=l(e),i=arguments.length,u=1,d=s.f,f=a.f;i>u;)for(var p,h=c(arguments[u++]),v=d?o(h).concat(d(h)):o(h),m=v.length,y=0;m>y;)p=v[y++],r&&!f.call(h,p)||(n[p]=h[p]);return n}:u},30:function(e,t,n){var r,i=n(9670),o=n(6048),s=n(748),a=n(3501),l=n(490),c=n(317),u=n(6200),d="prototype",f="script",p=u("IE_PROTO"),h=function(){},v=function(e){return"<"+f+">"+e+""},m=function(){try{r=document.domain&&new ActiveXObject("htmlfile")}catch(e){}var e,t,n;m=r?function(e){e.write(v("")),e.close();var t=e.parentWindow.Object;return e=null,t}(r):(t=c("iframe"),n="java"+f+":",t.style.display="none",l.appendChild(t),t.src=String(n),(e=t.contentWindow.document).open(),e.write(v("document.F=Object")),e.close(),e.F);for(var i=s.length;i--;)delete m[d][s[i]];return m()};a[p]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(h[d]=i(e),n=new h,h[d]=null,n[p]=e):n=m(),void 0===t?n:o(n,t)}},6048:function(e,t,n){var r=n(9781),i=n(3070),o=n(9670),s=n(1956);e.exports=r?Object.defineProperties:function(e,t){o(e);for(var n,r=s(t),a=r.length,l=0;a>l;)i.f(e,n=r[l++],t[n]);return e}},3070:function(e,t,n){var r=n(9781),i=n(4664),o=n(9670),s=n(7593),a=Object.defineProperty;t.f=r?a:function(e,t,n){if(o(e),t=s(t,!0),o(n),i)try{return a(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},1236:function(e,t,n){var r=n(9781),i=n(5296),o=n(9114),s=n(5656),a=n(7593),l=n(6656),c=n(4664),u=Object.getOwnPropertyDescriptor;t.f=r?u:function(e,t){if(e=s(e),t=a(t,!0),c)try{return u(e,t)}catch(e){}if(l(e,t))return o(!i.f.call(e,t),e[t])}},8006:function(e,t,n){var r=n(6324),i=n(748).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return r(e,i)}},5181:function(e,t){t.f=Object.getOwnPropertySymbols},9518:function(e,t,n){var r=n(6656),i=n(7908),o=n(6200),s=n(8544),a=o("IE_PROTO"),l=Object.prototype;e.exports=s?Object.getPrototypeOf:function(e){return e=i(e),r(e,a)?e[a]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?l:null}},6324:function(e,t,n){var r=n(6656),i=n(5656),o=n(1318).indexOf,s=n(3501);e.exports=function(e,t){var n,a=i(e),l=0,c=[];for(n in a)!r(s,n)&&r(a,n)&&c.push(n);for(;t.length>l;)r(a,n=t[l++])&&(~o(c,n)||c.push(n));return c}},1956:function(e,t,n){var r=n(6324),i=n(748);e.exports=Object.keys||function(e){return r(e,i)}},5296:function(e,t){"use strict";var n={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,i=r&&!n.call({1:2},1);t.f=i?function(e){var t=r(this,e);return!!t&&t.enumerable}:n},7674:function(e,t,n){var r=n(9670),i=n(6077);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(n,[]),t=n instanceof Array}catch(e){}return function(n,o){return r(n),i(o),t?e.call(n,o):n.__proto__=o,n}}():void 0)},288:function(e,t,n){"use strict";var r=n(1694),i=n(648);e.exports=r?{}.toString:function(){return"[object "+i(this)+"]"}},3887:function(e,t,n){var r=n(5005),i=n(8006),o=n(5181),s=n(9670);e.exports=r("Reflect","ownKeys")||function(e){var t=i.f(s(e)),n=o.f;return n?t.concat(n(e)):t}},857:function(e,t,n){var r=n(7854);e.exports=r},2248:function(e,t,n){var r=n(1320);e.exports=function(e,t,n){for(var i in t)r(e,i,t[i],n);return e}},1320:function(e,t,n){var r=n(7854),i=n(8880),o=n(6656),s=n(3505),a=n(2788),l=n(9909),c=l.get,u=l.enforce,d=String(String).split("String");(e.exports=function(e,t,n,a){var l,c=!!a&&!!a.unsafe,f=!!a&&!!a.enumerable,p=!!a&&!!a.noTargetGet;"function"==typeof n&&("string"!=typeof t||o(n,"name")||i(n,"name",t),(l=u(n)).source||(l.source=d.join("string"==typeof t?t:""))),e!==r?(c?!p&&e[t]&&(f=!0):delete e[t],f?e[t]=n:i(e,t,n)):f?e[t]=n:s(t,n)})(Function.prototype,"toString",function(){return"function"==typeof this&&c(this).source||a(this)})},7651:function(e,t,n){var r=n(4326),i=n(2261);e.exports=function(e,t){var n=e.exec;if("function"==typeof n){var o=n.call(e,t);if("object"!=typeof o)throw TypeError("RegExp exec method returned something other than an Object or null");return o}if("RegExp"!==r(e))throw TypeError("RegExp#exec called on incompatible receiver");return i.call(e,t)}},2261:function(e,t,n){"use strict";var r,i,o=n(7066),s=n(2999),a=RegExp.prototype.exec,l=String.prototype.replace,c=a,u=(r=/a/,i=/b*/g,a.call(r,"a"),a.call(i,"a"),0!==r.lastIndex||0!==i.lastIndex),d=s.UNSUPPORTED_Y||s.BROKEN_CARET,f=void 0!==/()??/.exec("")[1];(u||f||d)&&(c=function(e){var t,n,r,i,s=this,c=d&&s.sticky,p=o.call(s),h=s.source,v=0,m=e;return c&&(-1===(p=p.replace("y","")).indexOf("g")&&(p+="g"),m=String(e).slice(s.lastIndex),s.lastIndex>0&&(!s.multiline||s.multiline&&"\n"!==e[s.lastIndex-1])&&(h="(?: "+h+")",m=" "+m,v++),n=new RegExp("^(?:"+h+")",p)),f&&(n=new RegExp("^"+h+"$(?!\\s)",p)),u&&(t=s.lastIndex),r=a.call(c?n:s,m),c?r?(r.input=r.input.slice(v),r[0]=r[0].slice(v),r.index=s.lastIndex,s.lastIndex+=r[0].length):s.lastIndex=0:u&&r&&(s.lastIndex=s.global?r.index+r[0].length:t),f&&r&&r.length>1&&l.call(r[0],n,function(){for(i=1;i=c?e?"":void 0:(o=a.charCodeAt(l))<55296||o>56319||l+1===c||(s=a.charCodeAt(l+1))<56320||s>57343?e?a.charAt(l):o:e?a.slice(l,l+2):s-56320+(o-55296<<10)+65536}};e.exports={codeAt:o(!1),charAt:o(!0)}},3197:function(e){"use strict";var t=2147483647,n=/[^\0-\u007E]/,r=/[.\u3002\uFF0E\uFF61]/g,i="Overflow: input needs wider integers to process",o=Math.floor,s=String.fromCharCode,a=function(e){return e+22+75*(e<26)},l=function(e,t,n){var r=0;for(e=n?o(e/700):e>>1,e+=o(e/t);e>455;r+=36)e=o(e/35);return o(r+36*e/(e+38))},c=function(e){var n=[];e=function(e){for(var t=[],n=0,r=e.length;n=55296&&i<=56319&&n=d&&co((t-f)/y))throw RangeError(i);for(f+=(m-d)*y,d=m,r=0;rt)throw RangeError(i);if(c==d){for(var g=f,b=36;;b+=36){var w=b<=p?1:b>=p+26?26:b-p;if(g0?n:t)(e)}},7466:function(e,t,n){var r=n(9958),i=Math.min;e.exports=function(e){return e>0?i(r(e),9007199254740991):0}},7908:function(e,t,n){var r=n(4488);e.exports=function(e){return Object(r(e))}},4590:function(e,t,n){var r=n(3002);e.exports=function(e,t){var n=r(e);if(n%t)throw RangeError("Wrong offset");return n}},3002:function(e,t,n){var r=n(9958);e.exports=function(e){var t=r(e);if(t<0)throw RangeError("The argument can't be less than 0");return t}},7593:function(e,t,n){var r=n(111);e.exports=function(e,t){if(!r(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!r(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")}},1694:function(e,t,n){var r={};r[n(5112)("toStringTag")]="z",e.exports="[object z]"===String(r)},9843:function(e,t,n){"use strict";var r=n(2109),i=n(7854),o=n(9781),s=n(3832),a=n(260),l=n(3331),c=n(5787),u=n(9114),d=n(8880),f=n(7466),p=n(7067),h=n(4590),v=n(7593),m=n(6656),y=n(648),g=n(111),b=n(30),w=n(7674),x=n(8006).f,E=n(7321),S=n(2092).forEach,k=n(6340),L=n(3070),A=n(1236),C=n(9909),_=n(9587),T=C.get,F=C.set,I=L.f,M=A.f,R=Math.round,z=i.RangeError,q=l.ArrayBuffer,j=l.DataView,U=a.NATIVE_ARRAY_BUFFER_VIEWS,O=a.TYPED_ARRAY_TAG,P=a.TypedArray,D=a.TypedArrayPrototype,N=a.aTypedArrayConstructor,$=a.isTypedArray,B="BYTES_PER_ELEMENT",W="Wrong length",H=function(e,t){for(var n=0,r=t.length,i=new(N(e))(r);r>n;)i[n]=t[n++];return i},Y=function(e,t){I(e,t,{get:function(){return T(this)[t]}})},G=function(e){var t;return e instanceof q||"ArrayBuffer"==(t=y(e))||"SharedArrayBuffer"==t},Q=function(e,t){return $(e)&&"symbol"!=typeof t&&t in e&&String(+t)==String(t)},X=function(e,t){return Q(e,t=v(t,!0))?u(2,e[t]):M(e,t)},V=function(e,t,n){return!(Q(e,t=v(t,!0))&&g(n)&&m(n,"value"))||m(n,"get")||m(n,"set")||n.configurable||m(n,"writable")&&!n.writable||m(n,"enumerable")&&!n.enumerable?I(e,t,n):(e[t]=n.value,e)};o?(U||(A.f=X,L.f=V,Y(D,"buffer"),Y(D,"byteOffset"),Y(D,"byteLength"),Y(D,"length")),r({target:"Object",stat:!0,forced:!U},{getOwnPropertyDescriptor:X,defineProperty:V}),e.exports=function(e,t,n){var o=e.match(/\d+$/)[0]/8,a=e+(n?"Clamped":"")+"Array",l="get"+e,u="set"+e,v=i[a],m=v,y=m&&m.prototype,L={},A=function(e,t){I(e,t,{get:function(){return function(e,t){var n=T(e);return n.view[l](t*o+n.byteOffset,!0)}(this,t)},set:function(e){return function(e,t,r){var i=T(e);n&&(r=(r=R(r))<0?0:r>255?255:255&r),i.view[u](t*o+i.byteOffset,r,!0)}(this,t,e)},enumerable:!0})};U?s&&(m=t(function(e,t,n,r){return c(e,m,a),_(g(t)?G(t)?void 0!==r?new v(t,h(n,o),r):void 0!==n?new v(t,h(n,o)):new v(t):$(t)?H(m,t):E.call(m,t):new v(p(t)),e,m)}),w&&w(m,P),S(x(v),function(e){e in m||d(m,e,v[e])}),m.prototype=y):(m=t(function(e,t,n,r){c(e,m,a);var i,s,l,u=0,d=0;if(g(t)){if(!G(t))return $(t)?H(m,t):E.call(m,t);i=t,d=h(n,o);var v=t.byteLength;if(void 0===r){if(v%o)throw z(W);if((s=v-d)<0)throw z(W)}else if((s=f(r)*o)+d>v)throw z(W);l=s/o}else l=p(t),i=new q(s=l*o);for(F(e,{buffer:i,byteOffset:d,byteLength:s,length:l,view:new j(i)});uo;)a[o]=t[o++];return a}},7321:function(e,t,n){var r=n(7908),i=n(7466),o=n(1246),s=n(7659),a=n(9974),l=n(260).aTypedArrayConstructor;e.exports=function(e){var t,n,c,u,d,f,p=r(e),h=arguments.length,v=h>1?arguments[1]:void 0,m=void 0!==v,y=o(p);if(null!=y&&!s(y))for(f=(d=y.call(p)).next,p=[];!(u=f.call(d)).done;)p.push(u.value);for(m&&h>2&&(v=a(v,arguments[2],2)),n=i(p.length),c=new(l(this))(n),t=0;n>t;t++)c[t]=m?v(p[t],t):p[t];return c}},9711:function(e){var t=0,n=Math.random();e.exports=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++t+n).toString(36)}},3307:function(e,t,n){var r=n(133);e.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},5112:function(e,t,n){var r=n(7854),i=n(2309),o=n(6656),s=n(9711),a=n(133),l=n(3307),c=i("wks"),u=r.Symbol,d=l?u:u&&u.withoutSetter||s;e.exports=function(e){return o(c,e)||(a&&o(u,e)?c[e]=u[e]:c[e]=d("Symbol."+e)),c[e]}},1361:function(e){e.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},8264:function(e,t,n){"use strict";var r=n(2109),i=n(7854),o=n(3331),s=n(6340),a="ArrayBuffer",l=o[a];r({global:!0,forced:i[a]!==l},{ArrayBuffer:l}),s(a)},2222:function(e,t,n){"use strict";var r=n(2109),i=n(7293),o=n(3157),s=n(111),a=n(7908),l=n(7466),c=n(6135),u=n(5417),d=n(1194),f=n(5112),p=n(7392),h=f("isConcatSpreadable"),v=9007199254740991,m="Maximum allowed index exceeded",y=p>=51||!i(function(){var e=[];return e[h]=!1,e.concat()[0]!==e}),g=d("concat"),b=function(e){if(!s(e))return!1;var t=e[h];return void 0!==t?!!t:o(e)};r({target:"Array",proto:!0,forced:!y||!g},{concat:function(e){var t,n,r,i,o,s=a(this),d=u(s,0),f=0;for(t=-1,r=arguments.length;tv)throw TypeError(m);for(n=0;n=v)throw TypeError(m);c(d,f++,o)}return d.length=f,d}})},7327:function(e,t,n){"use strict";var r=n(2109),i=n(2092).filter;r({target:"Array",proto:!0,forced:!n(1194)("filter")},{filter:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}})},2772:function(e,t,n){"use strict";var r=n(2109),i=n(1318).indexOf,o=n(9341),s=[].indexOf,a=!!s&&1/[1].indexOf(1,-0)<0,l=o("indexOf");r({target:"Array",proto:!0,forced:a||!l},{indexOf:function(e){return a?s.apply(this,arguments)||0:i(this,e,arguments.length>1?arguments[1]:void 0)}})},6992:function(e,t,n){"use strict";var r=n(5656),i=n(1223),o=n(7497),s=n(9909),a=n(654),l="Array Iterator",c=s.set,u=s.getterFor(l);e.exports=a(Array,"Array",function(e,t){c(this,{type:l,target:r(e),index:0,kind:t})},function(){var e=u(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}},"values"),o.Arguments=o.Array,i("keys"),i("values"),i("entries")},1249:function(e,t,n){"use strict";var r=n(2109),i=n(2092).map;r({target:"Array",proto:!0,forced:!n(1194)("map")},{map:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}})},7042:function(e,t,n){"use strict";var r=n(2109),i=n(111),o=n(3157),s=n(1400),a=n(7466),l=n(5656),c=n(6135),u=n(5112),d=n(1194)("slice"),f=u("species"),p=[].slice,h=Math.max;r({target:"Array",proto:!0,forced:!d},{slice:function(e,t){var n,r,u,d=l(this),v=a(d.length),m=s(e,v),y=s(void 0===t?v:t,v);if(o(d)&&("function"!=typeof(n=d.constructor)||n!==Array&&!o(n.prototype)?i(n)&&null===(n=n[f])&&(n=void 0):n=void 0,n===Array||void 0===n))return p.call(d,m,y);for(r=new(void 0===n?Array:n)(h(y-m,0)),u=0;m9007199254740991)throw TypeError("Maximum allowed length exceeded");for(u=l(m,r),p=0;py-r+n;p--)delete m[p-1]}else if(n>r)for(p=y-r;p>g;p--)v=p+n-1,(h=p+r-1)in m?m[v]=m[h]:delete m[v];for(p=0;p=n.length?{value:void 0,done:!0}:(e=r(n,i),t.index+=e.length,{value:e,done:!1})})},4723:function(e,t,n){"use strict";var r=n(7007),i=n(9670),o=n(7466),s=n(4488),a=n(1530),l=n(7651);r("match",1,function(e,t,n){return[function(t){var n=s(this),r=null==t?void 0:t[e];return void 0!==r?r.call(t,n):new RegExp(t)[e](String(n))},function(e){var r=n(t,e,this);if(r.done)return r.value;var s=i(e),c=String(this);if(!s.global)return l(s,c);var u=s.unicode;s.lastIndex=0;for(var d,f=[],p=0;null!==(d=l(s,c));){var h=String(d[0]);f[p]=h,""===h&&(s.lastIndex=a(c,o(s.lastIndex),u)),p++}return 0===p?null:f}]})},5306:function(e,t,n){"use strict";var r=n(7007),i=n(9670),o=n(7466),s=n(9958),a=n(4488),l=n(1530),c=n(647),u=n(7651),d=Math.max,f=Math.min,p=function(e){return void 0===e?e:String(e)};r("replace",2,function(e,t,n,r){var h=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,v=r.REPLACE_KEEPS_$0,m=h?"$":"$0";return[function(n,r){var i=a(this),o=null==n?void 0:n[e];return void 0!==o?o.call(n,i,r):t.call(String(i),n,r)},function(e,r){if(!h&&v||"string"==typeof r&&-1===r.indexOf(m)){var a=n(t,e,this,r);if(a.done)return a.value}var y=i(e),g=String(this),b="function"==typeof r;b||(r=String(r));var w=y.global;if(w){var x=y.unicode;y.lastIndex=0}for(var E=[];;){var S=u(y,g);if(null===S)break;if(E.push(S),!w)break;""===String(S[0])&&(y.lastIndex=l(g,o(y.lastIndex),x))}for(var k="",L=0,A=0;A=L&&(k+=g.slice(L,_)+R,L=_+C.length)}return k+g.slice(L)}]})},3123:function(e,t,n){"use strict";var r=n(7007),i=n(7850),o=n(9670),s=n(4488),a=n(6707),l=n(1530),c=n(7466),u=n(7651),d=n(2261),f=n(7293),p=[].push,h=Math.min,v=4294967295,m=!f(function(){return!RegExp(v,"y")});r("split",2,function(e,t,n){var r;return r="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,n){var r=String(s(this)),o=void 0===n?v:n>>>0;if(0===o)return[];if(void 0===e)return[r];if(!i(e))return t.call(r,e,o);for(var a,l,c,u=[],f=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),h=0,m=new RegExp(e.source,f+"g");(a=d.call(m,r))&&!((l=m.lastIndex)>h&&(u.push(r.slice(h,a.index)),a.length>1&&a.index=o));)m.lastIndex===a.index&&m.lastIndex++;return h===r.length?!c&&m.test("")||u.push(""):u.push(r.slice(h)),u.length>o?u.slice(0,o):u}:"0".split(void 0,0).length?function(e,n){return void 0===e&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var i=s(this),o=null==t?void 0:t[e];return void 0!==o?o.call(t,i,n):r.call(String(i),t,n)},function(e,i){var s=n(r,e,this,i,r!==t);if(s.done)return s.value;var d=o(e),f=String(this),p=a(d,RegExp),y=d.unicode,g=(d.ignoreCase?"i":"")+(d.multiline?"m":"")+(d.unicode?"u":"")+(m?"y":"g"),b=new p(m?d:"^(?:"+d.source+")",g),w=void 0===i?v:i>>>0;if(0===w)return[];if(0===f.length)return null===u(b,f)?[f]:[];for(var x=0,E=0,S=[];E2?arguments[2]:void 0)})},8927:function(e,t,n){"use strict";var r=n(260),i=n(2092).every,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("every",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},3105:function(e,t,n){"use strict";var r=n(260),i=n(1285),o=r.aTypedArray;(0,r.exportTypedArrayMethod)("fill",function(e){return i.apply(o(this),arguments)})},5035:function(e,t,n){"use strict";var r=n(260),i=n(2092).filter,o=n(3074),s=r.aTypedArray;(0,r.exportTypedArrayMethod)("filter",function(e){var t=i(s(this),e,arguments.length>1?arguments[1]:void 0);return o(this,t)})},7174:function(e,t,n){"use strict";var r=n(260),i=n(2092).findIndex,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("findIndex",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},4345:function(e,t,n){"use strict";var r=n(260),i=n(2092).find,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("find",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},2846:function(e,t,n){"use strict";var r=n(260),i=n(2092).forEach,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("forEach",function(e){i(o(this),e,arguments.length>1?arguments[1]:void 0)})},4731:function(e,t,n){"use strict";var r=n(260),i=n(1318).includes,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("includes",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},7209:function(e,t,n){"use strict";var r=n(260),i=n(1318).indexOf,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("indexOf",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},6319:function(e,t,n){"use strict";var r=n(7854),i=n(260),o=n(6992),s=n(5112)("iterator"),a=r.Uint8Array,l=o.values,c=o.keys,u=o.entries,d=i.aTypedArray,f=i.exportTypedArrayMethod,p=a&&a.prototype[s],h=!!p&&("values"==p.name||null==p.name),v=function(){return l.call(d(this))};f("entries",function(){return u.call(d(this))}),f("keys",function(){return c.call(d(this))}),f("values",v,!h),f(s,v,!h)},8867:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=[].join;o("join",function(e){return s.apply(i(this),arguments)})},7789:function(e,t,n){"use strict";var r=n(260),i=n(6583),o=r.aTypedArray;(0,r.exportTypedArrayMethod)("lastIndexOf",function(e){return i.apply(o(this),arguments)})},3739:function(e,t,n){"use strict";var r=n(260),i=n(2092).map,o=n(6707),s=r.aTypedArray,a=r.aTypedArrayConstructor;(0,r.exportTypedArrayMethod)("map",function(e){return i(s(this),e,arguments.length>1?arguments[1]:void 0,function(e,t){return new(a(o(e,e.constructor)))(t)})})},4483:function(e,t,n){"use strict";var r=n(260),i=n(3671).right,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("reduceRight",function(e){return i(o(this),e,arguments.length,arguments.length>1?arguments[1]:void 0)})},9368:function(e,t,n){"use strict";var r=n(260),i=n(3671).left,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("reduce",function(e){return i(o(this),e,arguments.length,arguments.length>1?arguments[1]:void 0)})},2056:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=Math.floor;o("reverse",function(){for(var e,t=this,n=i(t).length,r=s(n/2),o=0;o1?arguments[1]:void 0,1),n=this.length,r=s(e),a=i(r.length),c=0;if(a+t>n)throw RangeError("Wrong length");for(;co;)u[o]=n[o++];return u},o(function(){new Int8Array(1).slice()}))},7462:function(e,t,n){"use strict";var r=n(260),i=n(2092).some,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("some",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},3824:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=[].sort;o("sort",function(e){return s.call(i(this),e)})},5021:function(e,t,n){"use strict";var r=n(260),i=n(7466),o=n(1400),s=n(6707),a=r.aTypedArray;(0,r.exportTypedArrayMethod)("subarray",function(e,t){var n=a(this),r=n.length,l=o(e,r);return new(s(n,n.constructor))(n.buffer,n.byteOffset+l*n.BYTES_PER_ELEMENT,i((void 0===t?r:o(t,r))-l))})},2974:function(e,t,n){"use strict";var r=n(7854),i=n(260),o=n(7293),s=r.Int8Array,a=i.aTypedArray,l=i.exportTypedArrayMethod,c=[].toLocaleString,u=[].slice,d=!!s&&o(function(){c.call(new s(1))});l("toLocaleString",function(){return c.apply(d?u.call(a(this)):a(this),arguments)},o(function(){return[1,2].toLocaleString()!=new s([1,2]).toLocaleString()})||!o(function(){s.prototype.toLocaleString.call([1,2])}))},5016:function(e,t,n){"use strict";var r=n(260).exportTypedArrayMethod,i=n(7293),o=n(7854).Uint8Array,s=o&&o.prototype||{},a=[].toString,l=[].join;i(function(){a.call({})})&&(a=function(){return l.call(this)});var c=s.toString!=a;r("toString",a,c)},2472:function(e,t,n){n(9843)("Uint8",function(e){return function(t,n,r){return e(this,t,n,r)}})},4747:function(e,t,n){var r=n(7854),i=n(8324),o=n(8533),s=n(8880);for(var a in i){var l=r[a],c=l&&l.prototype;if(c&&c.forEach!==o)try{s(c,"forEach",o)}catch(e){c.forEach=o}}},3948:function(e,t,n){var r=n(7854),i=n(8324),o=n(6992),s=n(8880),a=n(5112),l=a("iterator"),c=a("toStringTag"),u=o.values;for(var d in i){var f=r[d],p=f&&f.prototype;if(p){if(p[l]!==u)try{s(p,l,u)}catch(e){p[l]=u}if(p[c]||s(p,c,d),i[d])for(var h in o)if(p[h]!==o[h])try{s(p,h,o[h])}catch(e){p[h]=o[h]}}}},1637:function(e,t,n){"use strict";n(6992);var r=n(2109),i=n(5005),o=n(590),s=n(1320),a=n(2248),l=n(8003),c=n(4994),u=n(9909),d=n(5787),f=n(6656),p=n(9974),h=n(648),v=n(9670),m=n(111),y=n(30),g=n(9114),b=n(8554),w=n(1246),x=n(5112),E=i("fetch"),S=i("Headers"),k=x("iterator"),L="URLSearchParams",A=L+"Iterator",C=u.set,_=u.getterFor(L),T=u.getterFor(A),F=/\+/g,I=Array(4),M=function(e){return I[e-1]||(I[e-1]=RegExp("((?:%[\\da-f]{2}){"+e+"})","gi"))},R=function(e){try{return decodeURIComponent(e)}catch(t){return e}},z=function(e){var t=e.replace(F," "),n=4;try{return decodeURIComponent(t)}catch(e){for(;n;)t=t.replace(M(n--),R);return t}},q=/[!'()~]|%20/g,j={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},U=function(e){return j[e]},O=function(e){return encodeURIComponent(e).replace(q,U)},P=function(e,t){if(t)for(var n,r,i=t.split("&"),o=0;o0?arguments[0]:void 0,u=[];if(C(this,{type:L,entries:u,updateURL:function(){},updateSearchParams:D}),void 0!==c)if(m(c))if("function"==typeof(e=w(c)))for(n=(t=e.call(c)).next;!(r=n.call(t)).done;){if((s=(o=(i=b(v(r.value))).next).call(i)).done||(a=o.call(i)).done||!o.call(i).done)throw TypeError("Expected sequence with length 2");u.push({key:s.value+"",value:a.value+""})}else for(l in c)f(c,l)&&u.push({key:l,value:c[l]+""});else P(u,"string"==typeof c?"?"===c.charAt(0)?c.slice(1):c:c+"")},W=B.prototype;a(W,{append:function(e,t){N(arguments.length,2);var n=_(this);n.entries.push({key:e+"",value:t+""}),n.updateURL()},delete:function(e){N(arguments.length,1);for(var t=_(this),n=t.entries,r=e+"",i=0;ie.key){i.splice(t,0,e);break}t===n&&i.push(e)}r.updateURL()},forEach:function(e){for(var t,n=_(this).entries,r=p(e,arguments.length>1?arguments[1]:void 0,3),i=0;i1&&(m(t=arguments[1])&&(n=t.body,h(n)===L&&((r=t.headers?new S(t.headers):new S).has("content-type")||r.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"),t=y(t,{body:g(0,String(n)),headers:g(0,r)}))),i.push(t)),E.apply(this,i)}}),e.exports={URLSearchParams:B,getState:_}},285:function(e,t,n){"use strict";n(8783);var r,i=n(2109),o=n(9781),s=n(590),a=n(7854),l=n(6048),c=n(1320),u=n(5787),d=n(6656),f=n(1574),p=n(8457),h=n(8710).codeAt,v=n(3197),m=n(8003),y=n(1637),g=n(9909),b=a.URL,w=y.URLSearchParams,x=y.getState,E=g.set,S=g.getterFor("URL"),k=Math.floor,L=Math.pow,A="Invalid scheme",C="Invalid host",_="Invalid port",T=/[A-Za-z]/,F=/[\d+-.A-Za-z]/,I=/\d/,M=/^(0x|0X)/,R=/^[0-7]+$/,z=/^\d+$/,q=/^[\dA-Fa-f]+$/,j=/[\u0000\t\u000A\u000D #%/:?@[\\]]/,U=/[\u0000\t\u000A\u000D #/:?@[\\]]/,O=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,P=/[\t\u000A\u000D]/g,D=function(e,t){var n,r,i;if("["==t.charAt(0)){if("]"!=t.charAt(t.length-1))return C;if(!(n=$(t.slice(1,-1))))return C;e.host=n}else if(V(e)){if(t=v(t),j.test(t))return C;if(null===(n=N(t)))return C;e.host=n}else{if(U.test(t))return C;for(n="",r=p(t),i=0;i4)return e;for(n=[],r=0;r1&&"0"==i.charAt(0)&&(o=M.test(i)?16:8,i=i.slice(8==o?1:2)),""===i)s=0;else{if(!(10==o?z:8==o?R:q).test(i))return e;s=parseInt(i,o)}n.push(s)}for(r=0;r=L(256,5-t))return null}else if(s>255)return null;for(a=n.pop(),r=0;r6)return;for(r=0;f();){if(i=null,r>0){if(!("."==f()&&r<4))return;d++}if(!I.test(f()))return;for(;I.test(f());){if(o=parseInt(f(),10),null===i)i=o;else{if(0==i)return;i=10*i+o}if(i>255)return;d++}l[c]=256*l[c]+i,2!=++r&&4!=r||c++}if(4!=r)return;break}if(":"==f()){if(d++,!f())return}else if(f())return;l[c++]=t}else{if(null!==u)return;d++,u=++c}}if(null!==u)for(s=c-u,c=7;0!=c&&s>0;)a=l[c],l[c--]=l[u+s-1],l[u+--s]=a;else if(8!=c)return;return l},B=function(e){var t,n,r,i;if("number"==typeof e){for(t=[],n=0;n<4;n++)t.unshift(e%256),e=k(e/256);return t.join(".")}if("object"==typeof e){for(t="",r=function(e){for(var t=null,n=1,r=null,i=0,o=0;o<8;o++)0!==e[o]?(i>n&&(t=r,n=i),r=null,i=0):(null===r&&(r=o),++i);return i>n&&(t=r,n=i),t}(e),n=0;n<8;n++)i&&0===e[n]||(i&&(i=!1),r===n?(t+=n?":":"::",i=!0):(t+=e[n].toString(16),n<7&&(t+=":")));return"["+t+"]"}return e},W={},H=f({},W,{" ":1,'"':1,"<":1,">":1,"`":1}),Y=f({},H,{"#":1,"?":1,"{":1,"}":1}),G=f({},Y,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),Q=function(e,t){var n=h(e,0);return n>32&&n<127&&!d(t,e)?e:encodeURIComponent(e)},X={ftp:21,file:null,http:80,https:443,ws:80,wss:443},V=function(e){return d(X,e.scheme)},K=function(e){return""!=e.username||""!=e.password},Z=function(e){return!e.host||e.cannotBeABaseURL||"file"==e.scheme},J=function(e,t){var n;return 2==e.length&&T.test(e.charAt(0))&&(":"==(n=e.charAt(1))||!t&&"|"==n)},ee=function(e){var t;return e.length>1&&J(e.slice(0,2))&&(2==e.length||"/"===(t=e.charAt(2))||"\\"===t||"?"===t||"#"===t)},te=function(e){var t=e.path,n=t.length;!n||"file"==e.scheme&&1==n&&J(t[0],!0)||t.pop()},ne=function(e){return"."===e||"%2e"===e.toLowerCase()},re=function(e){return".."===(e=e.toLowerCase())||"%2e."===e||".%2e"===e||"%2e%2e"===e},ie={},oe={},se={},ae={},le={},ce={},ue={},de={},fe={},pe={},he={},ve={},me={},ye={},ge={},be={},we={},xe={},Ee={},Se={},ke={},Le=function(e,t,n,i){var o,s,a,l,c=n||ie,u=0,f="",h=!1,v=!1,m=!1;for(n||(e.scheme="",e.username="",e.password="",e.host=null,e.port=null,e.path=[],e.query=null,e.fragment=null,e.cannotBeABaseURL=!1,t=t.replace(O,"")),t=t.replace(P,""),o=p(t);u<=o.length;){switch(s=o[u],c){case ie:if(!s||!T.test(s)){if(n)return A;c=se;continue}f+=s.toLowerCase(),c=oe;break;case oe:if(s&&(F.test(s)||"+"==s||"-"==s||"."==s))f+=s.toLowerCase();else{if(":"!=s){if(n)return A;f="",c=se,u=0;continue}if(n&&(V(e)!=d(X,f)||"file"==f&&(K(e)||null!==e.port)||"file"==e.scheme&&!e.host))return;if(e.scheme=f,n)return void(V(e)&&X[e.scheme]==e.port&&(e.port=null));f="","file"==e.scheme?c=ye:V(e)&&i&&i.scheme==e.scheme?c=ae:V(e)?c=de:"/"==o[u+1]?(c=le,u++):(e.cannotBeABaseURL=!0,e.path.push(""),c=Ee)}break;case se:if(!i||i.cannotBeABaseURL&&"#"!=s)return A;if(i.cannotBeABaseURL&&"#"==s){e.scheme=i.scheme,e.path=i.path.slice(),e.query=i.query,e.fragment="",e.cannotBeABaseURL=!0,c=ke;break}c="file"==i.scheme?ye:ce;continue;case ae:if("/"!=s||"/"!=o[u+1]){c=ce;continue}c=fe,u++;break;case le:if("/"==s){c=pe;break}c=xe;continue;case ce:if(e.scheme=i.scheme,s==r)e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query=i.query;else if("/"==s||"\\"==s&&V(e))c=ue;else if("?"==s)e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query="",c=Se;else{if("#"!=s){e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.path.pop(),c=xe;continue}e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query=i.query,e.fragment="",c=ke}break;case ue:if(!V(e)||"/"!=s&&"\\"!=s){if("/"!=s){e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,c=xe;continue}c=pe}else c=fe;break;case de:if(c=fe,"/"!=s||"/"!=f.charAt(u+1))continue;u++;break;case fe:if("/"!=s&&"\\"!=s){c=pe;continue}break;case pe:if("@"==s){h&&(f="%40"+f),h=!0,a=p(f);for(var y=0;y65535)return _;e.port=V(e)&&w===X[e.scheme]?null:w,f=""}if(n)return;c=we;continue}return _}f+=s;break;case ye:if(e.scheme="file","/"==s||"\\"==s)c=ge;else{if(!i||"file"!=i.scheme){c=xe;continue}if(s==r)e.host=i.host,e.path=i.path.slice(),e.query=i.query;else if("?"==s)e.host=i.host,e.path=i.path.slice(),e.query="",c=Se;else{if("#"!=s){ee(o.slice(u).join(""))||(e.host=i.host,e.path=i.path.slice(),te(e)),c=xe;continue}e.host=i.host,e.path=i.path.slice(),e.query=i.query,e.fragment="",c=ke}}break;case ge:if("/"==s||"\\"==s){c=be;break}i&&"file"==i.scheme&&!ee(o.slice(u).join(""))&&(J(i.path[0],!0)?e.path.push(i.path[0]):e.host=i.host),c=xe;continue;case be:if(s==r||"/"==s||"\\"==s||"?"==s||"#"==s){if(!n&&J(f))c=xe;else if(""==f){if(e.host="",n)return;c=we}else{if(l=D(e,f))return l;if("localhost"==e.host&&(e.host=""),n)return;f="",c=we}continue}f+=s;break;case we:if(V(e)){if(c=xe,"/"!=s&&"\\"!=s)continue}else if(n||"?"!=s)if(n||"#"!=s){if(s!=r&&(c=xe,"/"!=s))continue}else e.fragment="",c=ke;else e.query="",c=Se;break;case xe:if(s==r||"/"==s||"\\"==s&&V(e)||!n&&("?"==s||"#"==s)){if(re(f)?(te(e),"/"==s||"\\"==s&&V(e)||e.path.push("")):ne(f)?"/"==s||"\\"==s&&V(e)||e.path.push(""):("file"==e.scheme&&!e.path.length&&J(f)&&(e.host&&(e.host=""),f=f.charAt(0)+":"),e.path.push(f)),f="","file"==e.scheme&&(s==r||"?"==s||"#"==s))for(;e.path.length>1&&""===e.path[0];)e.path.shift();"?"==s?(e.query="",c=Se):"#"==s&&(e.fragment="",c=ke)}else f+=Q(s,Y);break;case Ee:"?"==s?(e.query="",c=Se):"#"==s?(e.fragment="",c=ke):s!=r&&(e.path[0]+=Q(s,W));break;case Se:n||"#"!=s?s!=r&&("'"==s&&V(e)?e.query+="%27":e.query+="#"==s?"%23":Q(s,W)):(e.fragment="",c=ke);break;case ke:s!=r&&(e.fragment+=Q(s,H))}u++}},Ae=function(e){var t,n,r=u(this,Ae,"URL"),i=arguments.length>1?arguments[1]:void 0,s=String(e),a=E(r,{type:"URL"});if(void 0!==i)if(i instanceof Ae)t=S(i);else if(n=Le(t={},String(i)))throw TypeError(n);if(n=Le(a,s,null,t))throw TypeError(n);var l=a.searchParams=new w,c=x(l);c.updateSearchParams(a.query),c.updateURL=function(){a.query=String(l)||null},o||(r.href=_e.call(r),r.origin=Te.call(r),r.protocol=Fe.call(r),r.username=Ie.call(r),r.password=Me.call(r),r.host=Re.call(r),r.hostname=ze.call(r),r.port=qe.call(r),r.pathname=je.call(r),r.search=Ue.call(r),r.searchParams=Oe.call(r),r.hash=Pe.call(r))},Ce=Ae.prototype,_e=function(){var e=S(this),t=e.scheme,n=e.username,r=e.password,i=e.host,o=e.port,s=e.path,a=e.query,l=e.fragment,c=t+":";return null!==i?(c+="//",K(e)&&(c+=n+(r?":"+r:"")+"@"),c+=B(i),null!==o&&(c+=":"+o)):"file"==t&&(c+="//"),c+=e.cannotBeABaseURL?s[0]:s.length?"/"+s.join("/"):"",null!==a&&(c+="?"+a),null!==l&&(c+="#"+l),c},Te=function(){var e=S(this),t=e.scheme,n=e.port;if("blob"==t)try{return new URL(t.path[0]).origin}catch(e){return"null"}return"file"!=t&&V(e)?t+"://"+B(e.host)+(null!==n?":"+n:""):"null"},Fe=function(){return S(this).scheme+":"},Ie=function(){return S(this).username},Me=function(){return S(this).password},Re=function(){var e=S(this),t=e.host,n=e.port;return null===t?"":null===n?B(t):B(t)+":"+n},ze=function(){var e=S(this).host;return null===e?"":B(e)},qe=function(){var e=S(this).port;return null===e?"":String(e)},je=function(){var e=S(this),t=e.path;return e.cannotBeABaseURL?t[0]:t.length?"/"+t.join("/"):""},Ue=function(){var e=S(this).query;return e?"?"+e:""},Oe=function(){return S(this).searchParams},Pe=function(){var e=S(this).fragment;return e?"#"+e:""},De=function(e,t){return{get:e,set:t,configurable:!0,enumerable:!0}};if(o&&l(Ce,{href:De(_e,function(e){var t=S(this),n=String(e),r=Le(t,n);if(r)throw TypeError(r);x(t.searchParams).updateSearchParams(t.query)}),origin:De(Te),protocol:De(Fe,function(e){var t=S(this);Le(t,String(e)+":",ie)}),username:De(Ie,function(e){var t=S(this),n=p(String(e));if(!Z(t)){t.username="";for(var r=0;re.length)&&(t=e.length);for(var n=0,r=new Array(t);n1?r-1:0),o=1;o=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s,a=!0,l=!1;return{s:function(){r=t[Symbol.iterator]()},n:function(){var e=r.next();return a=e.done,e},e:function(e){l=!0,s=e},f:function(){try{a||null==r.return||r.return()}finally{if(l)throw s}}}}(n,!0);try{for(a.s();!(s=a.n()).done;)s.value.apply(this,i)}catch(e){a.e(e)}finally{a.f()}}return this.element&&this.element.dispatchEvent(this.makeEvent("dropzone:"+t,{args:i})),this}},{key:"makeEvent",value:function(e,t){var n={bubbles:!0,cancelable:!0,detail:t};if("function"==typeof window.CustomEvent)return new CustomEvent(e,n);var r=document.createEvent("CustomEvent");return r.initCustomEvent(e,n.bubbles,n.cancelable,n.detail),r}},{key:"off",value:function(e,t){if(!this._callbacks||0===arguments.length)return this._callbacks={},this;var n=this._callbacks[e];if(!n)return this;if(1===arguments.length)return delete this._callbacks[e],this;for(var r=0;r=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,l=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return a=e.done,e},e:function(e){l=!0,o=e},f:function(){try{a||null==n.return||n.return()}finally{if(l)throw o}}}}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n'),this.element.appendChild(e));var i=e.getElementsByTagName("span")[0];return i&&(null!=i.textContent?i.textContent=this.options.dictFallbackMessage:null!=i.innerText&&(i.innerText=this.options.dictFallbackMessage)),this.element.appendChild(this.getFallbackForm())},resize:function(e,t,n,r){var i={srcX:0,srcY:0,srcWidth:e.width,srcHeight:e.height},o=e.width/e.height;null==t&&null==n?(t=i.srcWidth,n=i.srcHeight):null==t?t=n*o:null==n&&(n=t/o);var s=(t=Math.min(t,i.srcWidth))/(n=Math.min(n,i.srcHeight));if(i.srcWidth>t||i.srcHeight>n)if("crop"===r)o>s?(i.srcHeight=e.height,i.srcWidth=i.srcHeight*s):(i.srcWidth=e.width,i.srcHeight=i.srcWidth/s);else{if("contain"!==r)throw new Error("Unknown resizeMethod '".concat(r,"'"));o>s?n=t/o:t=n*o}return i.srcX=(e.width-i.srcWidth)/2,i.srcY=(e.height-i.srcHeight)/2,i.trgWidth=t,i.trgHeight=n,i},transformFile:function(e,t){return(this.options.resizeWidth||this.options.resizeHeight)&&e.type.match(/image.*/)?this.resizeImage(e,this.options.resizeWidth,this.options.resizeHeight,this.options.resizeMethod,t):t(e)},previewTemplate:'
Check
Error
',drop:function(e){return this.element.classList.remove("dz-drag-hover")},dragstart:function(e){},dragend:function(e){return this.element.classList.remove("dz-drag-hover")},dragenter:function(e){return this.element.classList.add("dz-drag-hover")},dragover:function(e){return this.element.classList.add("dz-drag-hover")},dragleave:function(e){return this.element.classList.remove("dz-drag-hover")},paste:function(e){},reset:function(){return this.element.classList.remove("dz-started")},addedfile:function(e){var t=this;if(this.element===this.previewsContainer&&this.element.classList.add("dz-started"),this.previewsContainer&&!this.options.disablePreviews){e.previewElement=g.createElement(this.options.previewTemplate.trim()),e.previewTemplate=e.previewElement,this.previewsContainer.appendChild(e.previewElement);var n,r=o(e.previewElement.querySelectorAll("[data-dz-name]"),!0);try{for(r.s();!(n=r.n()).done;){var i=n.value;i.textContent=e.name}}catch(e){r.e(e)}finally{r.f()}var s,a=o(e.previewElement.querySelectorAll("[data-dz-size]"),!0);try{for(a.s();!(s=a.n()).done;)(i=s.value).innerHTML=this.filesize(e.size)}catch(e){a.e(e)}finally{a.f()}this.options.addRemoveLinks&&(e._removeLink=g.createElement('
'.concat(this.options.dictRemoveFile,"")),e.previewElement.appendChild(e._removeLink));var l,c=function(n){return n.preventDefault(),n.stopPropagation(),e.status===g.UPLOADING?g.confirm(t.options.dictCancelUploadConfirmation,function(){return t.removeFile(e)}):t.options.dictRemoveFileConfirmation?g.confirm(t.options.dictRemoveFileConfirmation,function(){return t.removeFile(e)}):t.removeFile(e)},u=o(e.previewElement.querySelectorAll("[data-dz-remove]"),!0);try{for(u.s();!(l=u.n()).done;)l.value.addEventListener("click",c)}catch(e){u.e(e)}finally{u.f()}}},removedfile:function(e){return null!=e.previewElement&&null!=e.previewElement.parentNode&&e.previewElement.parentNode.removeChild(e.previewElement),this._updateMaxFilesReachedClass()},thumbnail:function(e,t){if(e.previewElement){e.previewElement.classList.remove("dz-file-preview");var n,r=o(e.previewElement.querySelectorAll("[data-dz-thumbnail]"),!0);try{for(r.s();!(n=r.n()).done;){var i=n.value;i.alt=e.name,i.src=t}}catch(e){r.e(e)}finally{r.f()}return setTimeout(function(){return e.previewElement.classList.add("dz-image-preview")},1)}},error:function(e,t){if(e.previewElement){e.previewElement.classList.add("dz-error"),"string"!=typeof t&&t.error&&(t=t.error);var n,r=o(e.previewElement.querySelectorAll("[data-dz-errormessage]"),!0);try{for(r.s();!(n=r.n()).done;)n.value.textContent=t}catch(e){r.e(e)}finally{r.f()}}},errormultiple:function(){},processing:function(e){if(e.previewElement&&(e.previewElement.classList.add("dz-processing"),e._removeLink))return e._removeLink.innerHTML=this.options.dictCancelUpload},processingmultiple:function(){},uploadprogress:function(e,t,n){if(e.previewElement){var r,i=o(e.previewElement.querySelectorAll("[data-dz-uploadprogress]"),!0);try{for(i.s();!(r=i.n()).done;){var s=r.value;"PROGRESS"===s.nodeName?s.value=t:s.style.width="".concat(t,"%")}}catch(e){i.e(e)}finally{i.f()}}},totaluploadprogress:function(){},sending:function(){},sendingmultiple:function(){},success:function(e){if(e.previewElement)return e.previewElement.classList.add("dz-success")},successmultiple:function(){},canceled:function(e){return this.emit("error",e,this.options.dictUploadCanceled)},canceledmultiple:function(){},complete:function(e){if(e._removeLink&&(e._removeLink.innerHTML=this.options.dictRemoveFile),e.previewElement)return e.previewElement.classList.add("dz-complete")},completemultiple:function(){},maxfilesexceeded:function(){},maxfilesreached:function(){},queuecomplete:function(){},addedfiles:function(){}};function l(e){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},l(e)}function c(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return u(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?u(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,i=function(){};return{s:i,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return s=e.done,e},e:function(e){a=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n"))),this.clickableElements.length&&function t(){e.hiddenFileInput&&e.hiddenFileInput.parentNode.removeChild(e.hiddenFileInput),e.hiddenFileInput=document.createElement("input"),e.hiddenFileInput.setAttribute("type","file"),(null===e.options.maxFiles||e.options.maxFiles>1)&&e.hiddenFileInput.setAttribute("multiple","multiple"),e.hiddenFileInput.className="dz-hidden-input",null!==e.options.acceptedFiles&&e.hiddenFileInput.setAttribute("accept",e.options.acceptedFiles),null!==e.options.capture&&e.hiddenFileInput.setAttribute("capture",e.options.capture),e.hiddenFileInput.setAttribute("tabindex","-1"),e.hiddenFileInput.style.visibility="hidden",e.hiddenFileInput.style.position="absolute",e.hiddenFileInput.style.top="0",e.hiddenFileInput.style.left="0",e.hiddenFileInput.style.height="0",e.hiddenFileInput.style.width="0",o.getElement(e.options.hiddenInputContainer,"hiddenInputContainer").appendChild(e.hiddenFileInput),e.hiddenFileInput.addEventListener("change",function(){var n=e.hiddenFileInput.files;if(n.length){var r,i=c(n,!0);try{for(i.s();!(r=i.n()).done;){var o=r.value;e.addFile(o)}}catch(e){i.e(e)}finally{i.f()}}e.emit("addedfiles",n),t()})}(),this.URL=null!==window.URL?window.URL:window.webkitURL;var t,n=c(this.events,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;this.on(r,this.options[r])}}catch(e){n.e(e)}finally{n.f()}this.on("uploadprogress",function(){return e.updateTotalUploadProgress()}),this.on("removedfile",function(){return e.updateTotalUploadProgress()}),this.on("canceled",function(t){return e.emit("complete",t)}),this.on("complete",function(t){if(0===e.getAddedFiles().length&&0===e.getUploadingFiles().length&&0===e.getQueuedFiles().length)return setTimeout(function(){return e.emit("queuecomplete")},0)});var i=function(e){if(function(e){if(e.dataTransfer.types)for(var t=0;t")),n+='');var r=o.createElement(n);return"FORM"!==this.element.tagName?(t=o.createElement('
'))).appendChild(r):(this.element.setAttribute("enctype","multipart/form-data"),this.element.setAttribute("method",this.options.method)),null!=t?t:r}},{key:"getExistingFallback",value:function(){for(var e=function(e){var t,n=c(e,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;if(/(^| )fallback($| )/.test(r.className))return r}}catch(e){n.e(e)}finally{n.f()}},t=0,n=["div","form"];t0){for(var r=["tb","gb","mb","kb","b"],i=0;i=Math.pow(this.options.filesizeBase,4-i)/10){t=e/Math.pow(this.options.filesizeBase,4-i),n=o;break}}t=Math.round(10*t)/10}return"".concat(t," ").concat(this.options.dictFileSizeUnits[n])}},{key:"_updateMaxFilesReachedClass",value:function(){return null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(this.getAcceptedFiles().length===this.options.maxFiles&&this.emit("maxfilesreached",this.files),this.element.classList.add("dz-max-files-reached")):this.element.classList.remove("dz-max-files-reached")}},{key:"drop",value:function(e){if(e.dataTransfer){this.emit("drop",e);for(var t=[],n=0;n0){var i,o=c(r,!0);try{for(o.s();!(i=o.n()).done;){var s=i.value;s.isFile?s.file(function(e){if(!n.options.ignoreHiddenFiles||"."!==e.name.substring(0,1))return e.fullPath="".concat(t,"/").concat(e.name),n.addFile(e)}):s.isDirectory&&n._addFilesFromDirectory(s,"".concat(t,"/").concat(s.name))}}catch(e){o.e(e)}finally{o.f()}e()}return null},i)}()}},{key:"accept",value:function(e,t){this.options.maxFilesize&&e.size>1024*this.options.maxFilesize*1024?t(this.options.dictFileTooBig.replace("{{filesize}}",Math.round(e.size/1024/10.24)/100).replace("{{maxFilesize}}",this.options.maxFilesize)):o.isValidFile(e,this.options.acceptedFiles)?null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(t(this.options.dictMaxFilesExceeded.replace("{{maxFiles}}",this.options.maxFiles)),this.emit("maxfilesexceeded",e)):this.options.accept.call(this,e,t):t(this.options.dictInvalidFileType)}},{key:"addFile",value:function(e){var t=this;e.upload={uuid:o.uuidv4(),progress:0,total:e.size,bytesSent:0,filename:this._renameFile(e)},this.files.push(e),e.status=o.ADDED,this.emit("addedfile",e),this._enqueueThumbnail(e),this.accept(e,function(n){n?(e.accepted=!1,t._errorProcessing([e],n)):(e.accepted=!0,t.options.autoQueue&&t.enqueueFile(e)),t._updateMaxFilesReachedClass()})}},{key:"enqueueFiles",value:function(e){var t,n=c(e,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;this.enqueueFile(r)}}catch(e){n.e(e)}finally{n.f()}return null}},{key:"enqueueFile",value:function(e){var t=this;if(e.status!==o.ADDED||!0!==e.accepted)throw new Error("This file can't be queued because it has already been processed or was rejected.");if(e.status=o.QUEUED,this.options.autoProcessQueue)return setTimeout(function(){return t.processQueue()},0)}},{key:"_enqueueThumbnail",value:function(e){var t=this;if(this.options.createImageThumbnails&&e.type.match(/image.*/)&&e.size<=1024*this.options.maxThumbnailFilesize*1024)return this._thumbnailQueue.push(e),setTimeout(function(){return t._processThumbnailQueue()},0)}},{key:"_processThumbnailQueue",value:function(){var e=this;if(!this._processingThumbnail&&0!==this._thumbnailQueue.length){this._processingThumbnail=!0;var t=this._thumbnailQueue.shift();return this.createThumbnail(t,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,!0,function(n){return e.emit("thumbnail",t,n),e._processingThumbnail=!1,e._processThumbnailQueue()})}}},{key:"removeFile",value:function(e){if(e.status===o.UPLOADING&&this.cancelUpload(e),this.files=b(this.files,e),this.emit("removedfile",e),0===this.files.length)return this.emit("reset")}},{key:"removeAllFiles",value:function(e){null==e&&(e=!1);var t,n=c(this.files.slice(),!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;(r.status!==o.UPLOADING||e)&&this.removeFile(r)}}catch(e){n.e(e)}finally{n.f()}return null}},{key:"resizeImage",value:function(e,t,n,r,i){var s=this;return this.createThumbnail(e,t,n,r,!0,function(t,n){if(null==n)return i(e);var r=s.options.resizeMimeType;null==r&&(r=e.type);var a=n.toDataURL(r,s.options.resizeQuality);return"image/jpeg"!==r&&"image/jpg"!==r||(a=E.restore(e.dataURL,a)),i(o.dataURItoBlob(a))})}},{key:"createThumbnail",value:function(e,t,n,r,i,o){var s=this,a=new FileReader;a.onload=function(){e.dataURL=a.result,"image/svg+xml"!==e.type?s.createThumbnailFromUrl(e,t,n,r,i,o):null!=o&&o(a.result)},a.readAsDataURL(e)}},{key:"displayExistingFile",value:function(e,t,n,r){var i=this,o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4];this.emit("addedfile",e),this.emit("complete",e),o?(e.dataURL=t,this.createThumbnailFromUrl(e,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,this.options.fixOrientation,function(t){i.emit("thumbnail",e,t),n&&n()},r)):(this.emit("thumbnail",e,t),n&&n())}},{key:"createThumbnailFromUrl",value:function(e,t,n,r,i,o,s){var a=this,l=document.createElement("img");return s&&(l.crossOrigin=s),i="from-image"!=getComputedStyle(document.body).imageOrientation&&i,l.onload=function(){var s=function(e){return e(1)};return"undefined"!=typeof EXIF&&null!==EXIF&&i&&(s=function(e){return EXIF.getData(l,function(){return e(EXIF.getTag(this,"Orientation"))})}),s(function(i){e.width=l.width,e.height=l.height;var s=a.options.resize.call(a,e,t,n,r),c=document.createElement("canvas"),u=c.getContext("2d");switch(c.width=s.trgWidth,c.height=s.trgHeight,i>4&&(c.width=s.trgHeight,c.height=s.trgWidth),i){case 2:u.translate(c.width,0),u.scale(-1,1);break;case 3:u.translate(c.width,c.height),u.rotate(Math.PI);break;case 4:u.translate(0,c.height),u.scale(1,-1);break;case 5:u.rotate(.5*Math.PI),u.scale(1,-1);break;case 6:u.rotate(.5*Math.PI),u.translate(0,-c.width);break;case 7:u.rotate(.5*Math.PI),u.translate(c.height,-c.width),u.scale(-1,1);break;case 8:u.rotate(-.5*Math.PI),u.translate(-c.height,0)}x(u,l,null!=s.srcX?s.srcX:0,null!=s.srcY?s.srcY:0,s.srcWidth,s.srcHeight,null!=s.trgX?s.trgX:0,null!=s.trgY?s.trgY:0,s.trgWidth,s.trgHeight);var d=c.toDataURL("image/png");if(null!=o)return o(d,c)})},null!=o&&(l.onerror=o),l.src=e.dataURL}},{key:"processQueue",value:function(){var e=this.options.parallelUploads,t=this.getUploadingFiles().length,n=t;if(!(t>=e)){var r=this.getQueuedFiles();if(r.length>0){if(this.options.uploadMultiple)return this.processFiles(r.slice(0,e-t));for(;n1?t-1:0),r=1;rt.options.chunkSize),e[0].upload.totalChunkCount=Math.ceil(r.size/t.options.chunkSize)}if(e[0].upload.chunked){var i=e[0],s=n[0];i.upload.chunks=[];var a=function(){for(var n=0;void 0!==i.upload.chunks[n];)n++;if(!(n>=i.upload.totalChunkCount)){var r=n*t.options.chunkSize,a=Math.min(r+t.options.chunkSize,s.size),l={name:t._getParamName(0),data:s.webkitSlice?s.webkitSlice(r,a):s.slice(r,a),filename:i.upload.filename,chunkIndex:n};i.upload.chunks[n]={file:i,index:n,dataBlock:l,status:o.UPLOADING,progress:0,retries:0},t._uploadData(e,[l])}};if(i.upload.finishedChunkUpload=function(n,r){var s=!0;n.status=o.SUCCESS,n.dataBlock=null,n.xhr=null;for(var l=0;l1?t-1:0),r=1;r=s;a?o++:o--)i[o]=t.charCodeAt(o);return new Blob([r],{type:n})};var b=function(e,t){return e.filter(function(e){return e!==t}).map(function(e){return e})},w=function(e){return e.replace(/[\-_](\w)/g,function(e){return e.charAt(1).toUpperCase()})};g.createElement=function(e){var t=document.createElement("div");return t.innerHTML=e,t.childNodes[0]},g.elementInside=function(e,t){if(e===t)return!0;for(;e=e.parentNode;)if(e===t)return!0;return!1},g.getElement=function(e,t){var n;if("string"==typeof e?n=document.querySelector(e):null!=e.nodeType&&(n=e),null==n)throw new Error("Invalid `".concat(t,"` option provided. Please provide a CSS selector or a plain HTML element."));return n},g.getElements=function(e,t){var n,r;if(e instanceof Array){r=[];try{var i,o=c(e,!0);try{for(o.s();!(i=o.n()).done;)n=i.value,r.push(this.getElement(n,t))}catch(e){o.e(e)}finally{o.f()}}catch(e){r=null}}else if("string"==typeof e){r=[];var s,a=c(document.querySelectorAll(e),!0);try{for(a.s();!(s=a.n()).done;)n=s.value,r.push(n)}catch(e){a.e(e)}finally{a.f()}}else null!=e.nodeType&&(r=[e]);if(null==r||!r.length)throw new Error("Invalid `".concat(t,"` option provided. Please provide a CSS selector, a plain HTML element or a list of those."));return r},g.confirm=function(e,t,n){return window.confirm(e)?t():null!=n?n():void 0},g.isValidFile=function(e,t){if(!t)return!0;t=t.split(",");var n,r=e.type,i=r.replace(/\/.*$/,""),o=c(t,!0);try{for(o.s();!(n=o.n()).done;){var s=n.value;if("."===(s=s.trim()).charAt(0)){if(-1!==e.name.toLowerCase().indexOf(s.toLowerCase(),e.name.length-s.length))return!0}else if(/\/\*$/.test(s)){if(i===s.replace(/\/.*$/,""))return!0}else if(r===s)return!0}}catch(e){o.e(e)}finally{o.f()}return!1},"undefined"!=typeof jQuery&&null!==jQuery&&(jQuery.fn.dropzone=function(e){return this.each(function(){return new g(this,e)})}),g.ADDED="added",g.QUEUED="queued",g.ACCEPTED=g.QUEUED,g.UPLOADING="uploading",g.PROCESSING=g.UPLOADING,g.CANCELED="canceled",g.ERROR="error",g.SUCCESS="success";var x=function(e,t,n,r,i,o,s,a,l,c){var u=function(e){e.naturalWidth;var t=e.naturalHeight,n=document.createElement("canvas");n.width=1,n.height=t;var r=n.getContext("2d");r.drawImage(e,0,0);for(var i=r.getImageData(1,0,1,t).data,o=0,s=t,a=t;a>o;)0===i[4*(a-1)+3]?s=a:o=a,a=s+o>>1;var l=a/t;return 0===l?1:l}(t);return e.drawImage(t,n,r,i,o,s,a,l,c/u)},E=function(){function e(){d(this,e)}return p(e,null,[{key:"initClass",value:function(){this.KEY_STR="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}},{key:"encode64",value:function(e){for(var t="",n=void 0,r=void 0,i="",o=void 0,s=void 0,a=void 0,l="",c=0;o=(n=e[c++])>>2,s=(3&n)<<4|(r=e[c++])>>4,a=(15&r)<<2|(i=e[c++])>>6,l=63&i,isNaN(r)?a=l=64:isNaN(i)&&(l=64),t=t+this.KEY_STR.charAt(o)+this.KEY_STR.charAt(s)+this.KEY_STR.charAt(a)+this.KEY_STR.charAt(l),n=r=i="",o=s=a=l="",ce.length)break}return n}},{key:"decode64",value:function(e){var t=void 0,n=void 0,r="",i=void 0,o=void 0,s="",a=0,l=[];for(/[^A-Za-z0-9\+\/\=]/g.exec(e)&&console.warn("There were invalid base64 characters in the input text.\nValid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\nExpect errors in decoding."),e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");t=this.KEY_STR.indexOf(e.charAt(a++))<<2|(i=this.KEY_STR.indexOf(e.charAt(a++)))>>4,n=(15&i)<<4|(o=this.KEY_STR.indexOf(e.charAt(a++)))>>2,r=(3&o)<<6|(s=this.KEY_STR.indexOf(e.charAt(a++))),l.push(t),64!==o&&l.push(n),64!==s&&l.push(r),t=n=r="",i=o=s="",at.options.priority?-1:e.options.priority=0;n--)this._subscribers[n].fn!==e&&this._subscribers[n].id!==e||(this._subscribers[n].channel=null,this._subscribers.splice(n,1));else this._subscribers=[];if(t&&this.autoCleanChannel(),n=this._subscribers.length-1,e)for(;n>=0;n--)this._subscribers[n].fn!==e&&this._subscribers[n].id!==e||(this._subscribers[n].channel=null,this._subscribers.splice(n,1));else this._subscribers=[]},t.prototype.autoCleanChannel=function(){if(0===this._subscribers.length){for(var e in this._channels)if(this._channels.hasOwnProperty(e))return;if(null!=this._parent){var t=this.namespace.split(":"),n=t[t.length-1];this._parent.removeChannel(n)}}},t.prototype.removeChannel=function(e){this.hasChannel(e)&&(this._channels[e]=null,delete this._channels[e],this.autoCleanChannel())},t.prototype.publish=function(e){for(var t,n,r,i=0,o=this._subscribers.length,s=!1;i0)for(;i{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.hmd=e=>((e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:()=>{throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";var e=n(295),t=n.n(e),r=n(216);window.Cl=window.Cl||{};class i{constructor(e={}){this.options={linksSelector:".js-toggler-link",dataHeaderSelector:"toggler-header-selector",dataContentSelector:"toggler-content-selector",collapsedClass:"js-collapsed",expandedClass:"js-expanded",hiddenClass:"hidden",...e},this.togglerInstances=[],document.querySelectorAll(this.options.linksSelector).forEach(e=>{const t=new o(e,this.options);this.togglerInstances.push(t)})}destroy(){this.links=null,this.togglerInstances.forEach(e=>e.destroy()),this.togglerInstances=[]}}class o{constructor(e,t={}){this.options={...t},this.link=e,this.headerSelector=this.link.dataset[this.options.dataHeaderSelector],this.contentSelector=this.link.dataset[this.options.dataContentSelector],this.header=document.querySelector(this.headerSelector),this.header=this.header||this.link,this.content=document.querySelector(this.contentSelector),this.content&&this._initLink()}_updateClasses(){this.content.classList.contains(this.options.hiddenClass)?(this.header.classList.remove(this.options.expandedClass),this.header.classList.add(this.options.collapsedClass)):(this.header.classList.add(this.options.expandedClass),this.header.classList.remove(this.options.collapsedClass))}_onTogglerClick(e){this.content.classList.toggle(this.options.hiddenClass),this._updateClasses(),e.preventDefault()}_initLink(){this._updateClasses(),this.link.addEventListener("click",e=>this._onTogglerClick(e))}destroy(){this.options=null,this.link=null}}Cl.Toggler=i,Cl.TogglerConstructor=o;const s=i;n(413);var a=n(628),l=n.n(a);document.addEventListener("DOMContentLoaded",()=>{let e=0,t=1;const n=document.querySelector(".js-upload-button");if(!n)return;const r=document.querySelector(".js-upload-button-disabled"),i=n.dataset.url;if(!i)return;const o=document.querySelector(".js-filer-dropzone-upload-welcome"),s=document.querySelector(".js-filer-dropzone-upload-info-container"),a=document.querySelector(".js-filer-dropzone-upload-info"),c=document.querySelector(".js-filer-dropzone-upload-number"),u=".js-filer-dropzone-progress",d=document.querySelector(".js-filer-dropzone-upload-success"),f=document.querySelector(".js-filer-dropzone-upload-canceled"),p=document.querySelector(".js-filer-dropzone-cancel"),h=document.querySelector(".js-filer-dropzone-info-message"),v="hidden",m=parseInt(n.dataset.maxUploaderConnections||3,10),y=parseInt(n.dataset.maxFilesize||0,10);let g=!1;const b=()=>{c&&(c.textContent=`${t-e}/${t}`)},w=()=>{n&&n.remove()},x=()=>{const e=window.location.toString();window.location.replace(((e,t,n)=>{const r=new RegExp(`([?&])${t}=.*?(&|$)`,"i"),i=-1!==e.indexOf("?")?"&":"?",o=window.location.hash;return(e=e.replace(/#.*$/,"")).match(r)?e.replace(r,`$1${t}=${n}$2`)+o:e+i+t+"="+n+o})(e,"order_by","-modified_at"))};let E;Cl.mediator.subscribe("filer-upload-in-progress",w),n.addEventListener("click",e=>{e.preventDefault()}),l().autoDiscover=!1;try{E=new(l())(n,{url:i,paramName:"file",maxFilesize:y,parallelUploads:m,clickable:n,previewTemplate:"
",addRemoveLinks:!1,autoProcessQueue:!0})}catch(e){return void console.error("[Filer Upload] Failed to create Dropzone instance:",e)}E.on("addedfile",n=>{Cl.mediator.remove("filer-upload-in-progress",w),Cl.mediator.publish("filer-upload-in-progress"),e++,t=E.files.length,h&&h.classList.remove(v),o&&o.classList.add(v),d&&d.classList.add(v),s&&s.classList.remove(v),p&&p.classList.remove(v),f&&f.classList.add(v),b()}),E.on("uploadprogress",(e,t)=>{const n=Math.round(t),r=`file-${encodeURIComponent(e.name)}${e.size}${e.lastModified}`,i=document.getElementById(r);let o;if(i){const e=i.querySelector(u);e&&(e.style.width=`${n}%`)}else if(a){o=a.cloneNode(!0);const t=o.querySelector(".js-filer-dropzone-file-name");t&&(t.textContent=e.name);const i=o.querySelector(u);i&&(i.style.width=`${n}%`),o.classList.remove(v),o.setAttribute("id",r),s&&s.appendChild(o)}}),E.on("success",(n,r)=>{const i=`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}`,s=document.getElementById(i);s&&s.remove(),r.error&&(g=!0,window.filerShowError(`${n.name}: ${r.error}`)),e--,b(),0===e&&(t=1,o&&o.classList.add(v),c&&c.classList.add(v),f&&f.classList.add(v),p&&p.classList.add(v),d&&d.classList.remove(v),g?setTimeout(x,1e3):x())}),E.on("error",(n,r)=>{const i=`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}`,s=document.getElementById(i);s&&s.remove(),g=!0,window.filerShowError(`${n.name}: ${r}`),e--,b(),0===e&&(t=1,o&&o.classList.add(v),c&&c.classList.add(v),f&&f.classList.add(v),p&&p.classList.add(v),d&&d.classList.remove(v),setTimeout(x,1e3))}),p&&p.addEventListener("click",e=>{e.preventDefault(),p.classList.add(v),c&&c.classList.add(v),s&&s.classList.add(v),f&&f.classList.remove(v),setTimeout(()=>{window.location.reload()},1e3)}),r&&Cl.filerTooltip&&Cl.filerTooltip(),document.dispatchEvent(new Event("filer-upload-scripts-executed"))}),l()&&(l().autoDiscover=!1),document.addEventListener("DOMContentLoaded",()=>{const e=".js-img-preview",t=".js-filer-dropzone:not(.js-filer-dropzone-base):not(.js-filer-dropzone-folder):not(.js-filer-dropzone-info-message)",n=document.querySelectorAll(t),r=".js-filer-dropzone-progress",i=".js-img-wrapper",o="hidden",s="filer-dropzone-mobile",a="js-object-attached",c=e=>{e.offsetWidth<500?e.classList.add(s):e.classList.remove(s)},u=e=>{try{window.parent.CMS.API.Messages.open({message:e})}catch{window.filerShowError?window.filerShowError(e):alert(e)}},d=function(t){const n=t.dataset.url,s=t.querySelector(".vForeignKeyRawIdAdminField"),d="image"===s?.getAttribute("name"),f=t.querySelector(".js-related-lookup"),p=t.querySelector(".js-related-edit"),h=t.querySelector(".js-filer-dropzone-message"),v=t.querySelector(".filerClearer"),m=t.querySelector(".js-file-selector");t.dropzone||(window.addEventListener("resize",()=>{c(t)}),new(l())(t,{url:n,paramName:"file",maxFiles:1,maxFilesize:t.dataset.maxFilesize,previewTemplate:document.querySelector(".js-filer-dropzone-template")?.innerHTML||"
",clickable:!1,addRemoveLinks:!1,init:function(){c(t),this.on("removedfile",()=>{m&&(m.style.display=""),t.classList.remove(a),this.removeAllFiles(),v?.click()}),this.element.querySelectorAll("img").forEach(e=>{e.addEventListener("dragstart",e=>{e.preventDefault()})}),v&&v.addEventListener("click",()=>{t.classList.remove(a)})},maxfilesexceeded:function(){this.removeAllFiles(!0)},drop:function(){this.removeAllFiles(!0),v?.click();const e=t.querySelector(r);e&&e.classList.remove(o),m&&(m.style.display="block"),f?.classList.add("related-lookup-change"),p?.classList.add("related-lookup-change"),h?.classList.add(o),t.classList.remove("dz-drag-hover"),t.classList.add(a)},success:function(n,a){const l=t.querySelector(r);if(l&&l.classList.add(o),n&&"success"===n.status&&a){if(a.file_id&&s){s.value=a.file_id;const e=new Event("change",{bubbles:!0});s.dispatchEvent(e)}if(a.thumbnail_180&&d){const n=t.querySelector(e);n&&(n.style.backgroundImage=`url(${a.thumbnail_180})`);const r=t.querySelector(i);r&&r.classList.remove(o)}}else a&&a.error&&u(`${n.name}: ${a.error}`),this.removeAllFiles(!0);this.element.querySelectorAll("img").forEach(e=>{e.addEventListener("dragstart",e=>{e.preventDefault()})})},error:function(e,t,n){n&&n.error&&(t+=` ; ${n.error}`),u(`${e.name}: ${t}`),this.removeAllFiles(!0)},reset:function(){if(d){const n=t.querySelector(i);n&&n.classList.add(o);const r=t.querySelector(e);r&&(r.style.backgroundImage="none")}if(t.classList.remove(a),s&&(s.value=""),f?.classList.remove("related-lookup-change"),p?.classList.remove("related-lookup-change"),h?.classList.remove(o),s){const e=new Event("change",{bubbles:!0});s.dispatchEvent(e)}}}))};n.length&&l()&&(window.filerDropzoneInitialized||(window.filerDropzoneInitialized=!0,l().autoDiscover=!1),n.forEach(d),document.addEventListener("formset:added",e=>{let n,r,i;e.detail&&e.detail.formsetName?(r=parseInt(document.getElementById(`id_${e.detail.formsetName}-TOTAL_FORMS`).value,10)-1,i=document.getElementById(`${e.detail.formsetName}-${r}`),n=i?.querySelectorAll(t)||[]):(i=e.target,n=i?.querySelectorAll(t)||[]),n?.forEach(d)}))}),document.addEventListener("DOMContentLoaded",()=>{let e=0,t=0;const n=[],r=document.querySelector(".js-filer-dropzone-base"),i=".js-filer-dropzone";let o;const s=document.querySelector(".js-filer-dropzone-info-message"),a=document.querySelector(".js-filer-dropzone-folder-name"),c=document.querySelector(".js-filer-dropzone-upload-info-container"),u=document.querySelector(".js-filer-dropzone-upload-info"),d=document.querySelector(".js-filer-dropzone-upload-welcome"),f=document.querySelector(".js-filer-dropzone-upload-number"),p=document.querySelector(".js-filer-upload-count"),h=document.querySelector(".js-filer-upload-text"),v=".js-filer-dropzone-progress",m=document.querySelector(".js-filer-dropzone-upload-success"),y=document.querySelector(".js-filer-dropzone-upload-canceled"),g=document.querySelector(".js-filer-dropzone-cancel"),b="dz-drag-hover",w=document.querySelector(".drag-hover-border"),x="hidden";let E,S,k,L=!1;const A=()=>{const e=window.location.toString();window.location.replace(((e,t,n)=>{const r=new RegExp(`([?&])${t}=.*?(&|$)`,"i"),i=-1!==e.indexOf("?")?"&":"?",o=window.location.hash;return(e=e.replace(/#.*$/,"")).match(r)?e.replace(r,`$1${t}=${n}$2`)+o:e+i+t+"="+n+o})(e,"order_by","-modified_at"))},C=()=>{f&&(f.textContent=`${t-e}/${t}`),h&&h.classList.remove("hidden"),p&&p.classList.remove("hidden")},_=()=>{n.forEach(e=>{e.destroy()})},T=(e,t)=>document.getElementById(`file-${encodeURIComponent(e.name)}${e.size}${e.lastModified}${t}`);if(r){S=r.dataset.url,k=r.dataset.folderName;const e=document.body;e.dataset.url=S,e.dataset.folderName=k,e.dataset.maxFiles=r.dataset.maxFiles,e.dataset.maxFilesize=r.dataset.maxFilesize,e.classList.add("js-filer-dropzone")}Cl.mediator.subscribe("filer-upload-in-progress",_),o=document.querySelectorAll(i),o.length&&l()&&(l().autoDiscover=!1,o.forEach(r=>{if(r.dropzone)return;const p=r.dataset.url,h=new(l())(r,{url:p,paramName:"file",maxFiles:parseInt(r.dataset.maxFiles)||100,maxFilesize:parseInt(r.dataset.maxFilesize),previewTemplate:"
",clickable:!1,addRemoveLinks:!1,parallelUploads:r.dataset["max-uploader-connections"]||3,accept:(n,r)=>{let i;if(Cl.mediator.remove("filer-upload-in-progress",_),Cl.mediator.publish("filer-upload-in-progress"),clearTimeout(E),clearTimeout(E),d&&d.classList.add(x),g&&g.classList.remove(x),T(n,p))r("duplicate");else{i=u.cloneNode(!0);const o=i.querySelector(".js-filer-dropzone-file-name");o&&(o.textContent=n.name);const s=i.querySelector(v);s&&(s.style.width="0"),i.setAttribute("id",`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}${p}`),c&&c.appendChild(i),e++,t++,C(),r()}o.forEach(e=>e.classList.remove("reset-hover")),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b))},dragover:e=>{const t=e.target.closest(i),n=t?.dataset.folderName,l=r.classList.contains("js-filer-dropzone-folder"),c=r.getBoundingClientRect(),u=w?window.getComputedStyle(w):null,d=u?u.borderTopWidth:"0px",f=u?u.borderLeftWidth:"0px",p={top:`${c.top}px`,bottom:`${c.bottom}px`,left:`${c.left}px`,right:`${c.right}px`,width:c.width-2*parseInt(f,10)+"px",height:c.height-2*parseInt(d,10)+"px",display:"block"};l&&w&&Object.assign(w.style,p),o.forEach(e=>e.classList.add("reset-hover")),m&&m.classList.add(x),s&&s.classList.remove(x),r.classList.add(b),r.classList.remove("reset-hover"),a&&n&&(a.textContent=n)},dragend:()=>{clearTimeout(E),E=setTimeout(()=>{s&&s.classList.add(x)},1e3),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b)),w&&Object.assign(w.style,{top:"0",bottom:"0",width:"0",height:"0"})},dragleave:()=>{clearTimeout(E),E=setTimeout(()=>{s&&s.classList.add(x)},1e3),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b)),w&&Object.assign(w.style,{top:"0",bottom:"0",width:"0",height:"0"})},sending:e=>{const t=T(e,p);t&&t.classList.remove(x)},uploadprogress:(e,t)=>{const n=T(e,p);if(n){const e=n.querySelector(v);e&&(e.style.width=`${t}%`)}},success:(t,n)=>{e--,C();const r=T(t,p);r&&r.remove(),n&&n.error&&(L=!0,window.filerShowError&&window.filerShowError(`${t.name}: ${n.error}`))},queuecomplete:()=>{0===e&&(C(),g&&g.classList.add(x),u&&u.classList.add(x),L?(f&&f.classList.add(x),setTimeout(()=>{A()},1e3)):(m&&m.classList.remove(x),A()))},error:(t,n)=>{if("duplicate"===n)return;e--,C();const r=T(t,p);r&&r.remove(),L=!0,window.filerShowError&&window.filerShowError(`${t.name}: ${n.message||n}`)}});n.push(h),g&&g.addEventListener("click",e=>{e.preventDefault(),g.classList.add(x),y&&y.classList.remove(x),h.removeAllFiles(!0)})}))}),n(117),n(221),n(472),n(902),n(577),window.Cl=window.Cl||{},Cl.mediator=new(t()),Cl.FocalPoint=r.A,Cl.Toggler=s,document.addEventListener("DOMContentLoaded",()=>{let e;window.filerShowError=t=>{const n=document.querySelector(".messagelist"),r=document.querySelector("#header"),i="js-filer-error",o=`
  • {msg}
`.replace("{msg}",t);n?n.outerHTML=o:r&&r.insertAdjacentHTML("afterend",o),e&&clearTimeout(e),e=setTimeout(()=>{const e=document.querySelector(`.${i}`);e&&e.remove()},5e3)};const t=document.querySelector(".js-filter-files");t&&(t.addEventListener("focus",e=>{const t=e.target.closest(".navigator-top-nav");t&&t.classList.add("search-is-focused")}),t.addEventListener("blur",e=>{const t=e.target.closest(".navigator-top-nav");if(t){const n=t.querySelector(".dropdown-container a");n&&e.relatedTarget===n||t.classList.remove("search-is-focused")}}));const n=document.querySelector(".js-filter-files-container");n&&n.addEventListener("submit",e=>{}),(()=>{const e=document.querySelector(".js-filter-files"),t=".navigator-top-nav",n=document.querySelector(t),r=n?.querySelector(".filter-search-wrapper .filer-dropdown-container");e&&(e.addEventListener("keydown",function(e){e.key;const n=this.closest(t);n&&n.classList.add("search-is-focused")}),r&&(r.addEventListener("show.bs.filer-dropdown",()=>{n&&n.classList.add("search-is-focused")}),r.addEventListener("hide.bs.filer-dropdown",()=>{n&&n.classList.remove("search-is-focused")})))})(),(()=>{const e=document.querySelectorAll(".navigator-table tr, .navigator-list .list-item"),t=document.querySelector(".actions-wrapper"),n=document.querySelectorAll(".action-select, #action-toggle, #files-action-toggle, #folders-action-toggle, .actions .clear a");setTimeout(()=>{n.forEach(e=>{if(e.checked){const t=e.closest(".list-item");t&&t.classList.add("selected")}}),Array.from(e).some(e=>e.classList.contains("selected"))&&t&&t.classList.add("action-selected")},100),n.forEach(n=>{n.addEventListener("change",function(){const n=this.closest(".list-item");n&&(this.checked?n.classList.add("selected"):n.classList.remove("selected")),setTimeout(()=>{const n=Array.from(e).some(e=>e.classList.contains("selected"));t&&(n?t.classList.add("action-selected"):t.classList.remove("action-selected"))},0)})})})(),(()=>{const e=document.querySelector(".js-actions-menu");if(!e)return;const t=e.querySelector(".filer-dropdown-menu"),n=document.querySelector('.actions select[name="action"]'),r=n?.querySelectorAll("option")||[],i=document.querySelector('.actions button[type="submit"]'),o=document.querySelector(".js-action-delete"),s=document.querySelector(".js-action-copy"),a=document.querySelector(".js-action-move"),l="delete_files_or_folders",c="copy_files_and_folders",u="move_files_and_folders",d=document.querySelectorAll(".navigator-table tr, .navigator-list .list-item"),f=(e,t)=>{t&&r.forEach(r=>{r.value===e&&(t.style.display="",t.addEventListener("click",t=>{if(t.preventDefault(),Array.from(d).some(e=>e.classList.contains("selected"))&&n&&i){n.value=e;const t=n.querySelector(`option[value="${e}"]`);t&&(t.selected=!0),i.click()}}))})};f(l,o),f(c,s),f(u,a),r.forEach((e,n)=>{if(0!==n){const n=document.createElement("li"),r=document.createElement("a");r.href="#",r.textContent=e.textContent,e.value!==l&&e.value!==c&&e.value!==u||r.classList.add("hidden"),n.appendChild(r),t&&t.appendChild(n)}}),t&&t.addEventListener("click",e=>{if("A"===e.target.tagName){const r=e.target.closest("li"),o=Array.from(t.querySelectorAll("li")).indexOf(r)+1;if(e.preventDefault(),n&&i){const e=n.querySelectorAll("option");e[o]&&(n.value=e[o].value,e[o].selected=!0),i.click()}}}),e.addEventListener("click",e=>{Array.from(d).some(e=>e.classList.contains("selected"))||(e.preventDefault(),e.stopPropagation())})})(),(()=>{const e=document.querySelector(".navigator-top-nav");if(!e)return;const t=document.querySelector(".breadcrumbs-container");if(!t)return;const n=t.querySelector(".navigator-breadcrumbs"),r=t.querySelector(".filer-dropdown-container"),i=document.querySelector(".filter-files-container"),o=document.querySelector(".actions-wrapper"),s=document.querySelector(".navigator-button-wrapper"),a=n?.offsetWidth||0,l=r?.offsetWidth||0,c=i?.offsetWidth||0,u=o?.offsetWidth||0,d=s?.offsetWidth||0,f=window.getComputedStyle(e),p=parseInt(f.paddingLeft,10)+parseInt(f.paddingRight,10);let h=e.offsetWidth;const v=80+a+l+c+u+d+p,m="breadcrumb-min-width",y=()=>{h{h=e.offsetWidth,y()})})(),(()=>{const e=document.querySelectorAll(".navigator-list .list-item input.action-select"),t=".navigator-list .navigator-folders-body .list-item input.action-select",n=".navigator-list .navigator-files-body .list-item input.action-select",r=document.querySelector("#files-action-toggle"),i=document.querySelector("#folders-action-toggle");i&&i.addEventListener("click",function(){const e=document.querySelectorAll(t);this.checked?e.forEach(e=>{e.checked||e.click()}):e.forEach(e=>{e.checked&&e.click()})}),r&&r.addEventListener("click",function(){const e=document.querySelectorAll(n);this.checked?e.forEach(e=>{e.checked||e.click()}):e.forEach(e=>{e.checked&&e.click()})}),e.forEach(e=>{e.addEventListener("click",function(){const e=document.querySelectorAll(n),o=document.querySelectorAll(t);if(this.checked){const t=Array.from(e).every(e=>e.checked),n=Array.from(o).every(e=>e.checked);t&&r&&(r.checked=!0),n&&i&&(i.checked=!0)}else{const t=Array.from(e).some(e=>!e.checked),n=Array.from(o).some(e=>!e.checked);t&&r&&(r.checked=!1),n&&i&&(i.checked=!1)}})});const o=document.querySelector(".navigator .actions .clear a");o&&o.addEventListener("click",()=>{i&&(i.checked=!1),r&&(r.checked=!1)})})(),document.querySelectorAll(".js-copy-url").forEach(e=>{e.addEventListener("click",function(e){const t=new URL(this.dataset.url,document.location.href),n=this.dataset.msg||"URL copied to clipboard",r=document.createElement("template");e.preventDefault(),document.querySelectorAll(".info.filer-tooltip").forEach(e=>{e.remove()}),navigator.clipboard.writeText(t.href),r.innerHTML=`
${n}
`,this.classList.add("filer-tooltip-wrapper"),this.appendChild(r.content.firstChild);const i=this;setTimeout(()=>{const e=i.querySelector(".info");e&&e.remove()},1200)})}),(new r.A).initialize(),new s})})()})(); \ No newline at end of file diff --git a/filer/static/filer/js/dist/filer-base.bundle.js.LICENSE.txt b/filer/static/filer/js/dist/filer-base.bundle.js.LICENSE.txt new file mode 100644 index 000000000..ce72ecda9 --- /dev/null +++ b/filer/static/filer/js/dist/filer-base.bundle.js.LICENSE.txt @@ -0,0 +1,12 @@ +/*! +* Mediator.js Library v0.11.0 +* https://github.com/ajacksified/Mediator.js +* +* Copyright 2018, Jack Lawson +* MIT Licensed (http://www.opensource.org/licenses/mit-license.php) +* +* For more information: http://thejacklawson.com/2011/06/mediators-for-modularized-asynchronous-programming-in-javascript/index.html +* Project on GitHub: https://github.com/ajacksified/Mediator.js +* +* Last update: 22 Mar 2018 +*/ diff --git a/filer/static/filer/js/widgets/admin-file-widget.js b/filer/static/filer/js/widgets/admin-file-widget.js new file mode 100644 index 000000000..3e0c38f19 --- /dev/null +++ b/filer/static/filer/js/widgets/admin-file-widget.js @@ -0,0 +1,30 @@ +// Admin File Widget JavaScript +'use strict'; + +document.addEventListener('DOMContentLoaded', () => { + // Find all file widgets and clean up "add new" buttons + const cleanupAddButtons = () => { + document.querySelectorAll('.filer-widget').forEach((widget) => { + const hiddenInput = widget.querySelector('input[type="text"][id]'); + if (hiddenInput) { + const widgetId = hiddenInput.id; + const addButton = document.querySelector(`#add_${widgetId}`); + if (addButton) { + addButton.remove(); + } + } + }); + }; + + cleanupAddButtons(); + + // Also handle dynamically added widgets (e.g., in inline formsets) + const observer = new MutationObserver(() => { + cleanupAddButtons(); + }); + + observer.observe(document.body, { + childList: true, + subtree: true + }); +}); diff --git a/filer/static/filer/js/widgets/admin-folder-widget.js b/filer/static/filer/js/widgets/admin-folder-widget.js new file mode 100644 index 000000000..14c5d2206 --- /dev/null +++ b/filer/static/filer/js/widgets/admin-folder-widget.js @@ -0,0 +1,64 @@ +// Admin Folder Widget JavaScript +'use strict'; + +document.addEventListener('DOMContentLoaded', () => { + const initFolderWidget = (widget) => { + const clearButton = widget.querySelector('.filerClearer'); + const input = widget.querySelector('input[type="text"]'); + const folderName = widget.querySelector('.description_text'); + const thumbnailImg = widget.querySelector('.thumbnail_img'); + const addFolderButton = widget.querySelector('.related-lookup'); + + if (!clearButton || !input) { + return; + } + + // Avoid duplicate initialization + if (clearButton.dataset.initialized) { + return; + } + clearButton.dataset.initialized = 'true'; + + clearButton.addEventListener('click', (e) => { + e.preventDefault(); + + if (folderName) { + folderName.textContent = ''; + } + if (input) { + input.removeAttribute('value'); + input.value = ''; + } + if (thumbnailImg) { + thumbnailImg.classList.add('hidden'); + } + clearButton.classList.add('hidden'); + if (addFolderButton) { + addFolderButton.classList.remove('hidden'); + } + }); + }; + + // Initialize all folder widgets + document.querySelectorAll('.filer-dropzone-folder').forEach(initFolderWidget); + + // Handle dynamically added widgets (e.g., in inline formsets) + const observer = new MutationObserver((mutations) => { + mutations.forEach((mutation) => { + mutation.addedNodes.forEach((node) => { + if (node.nodeType === 1) { // Element node + if (node.classList?.contains('filer-dropzone-folder')) { + initFolderWidget(node); + } + // Also check child nodes + node.querySelectorAll?.('.filer-dropzone-folder').forEach(initFolderWidget); + } + }); + }); + }); + + observer.observe(document.body, { + childList: true, + subtree: true + }); +}); diff --git a/filer/templates/admin/filer/actions.html b/filer/templates/admin/filer/actions.html index f99c06459..a0b01fbd7 100644 --- a/filer/templates/admin/filer/actions.html +++ b/filer/templates/admin/filer/actions.html @@ -1,25 +1,19 @@ {% load i18n %} -
-
-
- {% for field in action_form %} - {% if field.label %} - - {% endif %} - {{ field }} - {% endfor %} - - {% if actions_selection_counter %} - -
- {{ selection_note }} - {% if paginator.count != paginated_items.object_list|length %} - - - {% endif %} -
- {% endif %} -
-
+ diff --git a/filer/templates/admin/filer/base_site.html b/filer/templates/admin/filer/base_site.html index 0217933b8..2a66e751d 100644 --- a/filer/templates/admin/filer/base_site.html +++ b/filer/templates/admin/filer/base_site.html @@ -1,10 +1,17 @@ {% extends "admin/base_site.html" %} -{% load i18n filermedia %} +{% load i18n static filer_admin_tags %} + {% block extrastyle %} - - - - - + {{ block.super }} + + {% icon_css_library %} {% endblock %} +{% block extrahead %} + {{ block.super }} + + {# upload stuff #} + {{ media.js }} + + +{% endblock %} diff --git a/filer/templates/admin/filer/breadcrumbs.html b/filer/templates/admin/filer/breadcrumbs.html index a74b6e4bf..a8dceac9d 100644 --- a/filer/templates/admin/filer/breadcrumbs.html +++ b/filer/templates/admin/filer/breadcrumbs.html @@ -1,41 +1,24 @@ -{% load i18n %} +{% load i18n filer_admin_tags %} + diff --git a/filer/templates/admin/filer/change_form.html b/filer/templates/admin/filer/change_form.html index db9d83ded..34aeb85b7 100644 --- a/filer/templates/admin/filer/change_form.html +++ b/filer/templates/admin/filer/change_form.html @@ -1,78 +1,36 @@ {% extends "admin/change_form.html" %} -{% load i18n admin_modify filermedia filer_admin_tags %} - -{% block extrahead %}{{ block.super }} - -{% endblock %} - -{% block pretitle %} -{% if is_popup %} - -{% endif %} -{% endblock %} +{% load i18n admin_modify static filer_admin_tags %} {% block breadcrumbs %} -{% with original as instance %} -{% include "admin/filer/breadcrumbs.html" %} -{% endwith %} + {% with original as instance %} + {% include "admin/filer/breadcrumbs.html" %} + {% endwith %} {% endblock %} {% block extrastyle %} - - - - - + {{ block.super }} + + {% icon_css_library %} {% endblock %} -{% block coltype %}colMS row{% endblock %} {% block after_field_sets %} - {% if is_popup and select_folder %}{% endif %} -{% endblock %} - -{% block field_sets %} - {% for fieldset in adminform %} - {% include "admin/filer/fieldset.html" %} - {% endfor %} -{% endblock %} - - -{% block content %} -
- {{block.super}} -
-{% endblock %} - -{% block object-tools %} -{% if change %}{% if not is_popup %} - -{% endif %}{% endif %} + {% filer_admin_context_hidden_formfields %} {% endblock %} {% block sidebar %} - {% with original.duplicates as duplicates %} - {% if duplicates %} - - {% endif %} - {% endwith %} -{% endblock %} - -{% block submit_buttons_bottom %} - {% if not original|is_restricted_for_user:user %} - {% submit_row %} - {% endif %} + {% block file_sidebar %} + {% with original.duplicates as duplicates %} + {% if duplicates %} +
+

{% translate "Duplicates" %}

+ +
+ {% endif %} + {% endwith %} + {% endblock %} {% endblock %} diff --git a/filer/templates/admin/filer/delete_confirmation.html b/filer/templates/admin/filer/delete_confirmation.html index 77e28c488..635fbfb05 100644 --- a/filer/templates/admin/filer/delete_confirmation.html +++ b/filer/templates/admin/filer/delete_confirmation.html @@ -1,37 +1,10 @@ -{% extends "admin/filer/base_site.html" %} -{% load i18n %} -{% load admin_urls %} +{% extends "admin/delete_confirmation.html" %} +{% load i18n static %} -{% block breadcrumbs %} -{% include "admin/filer/breadcrumbs.html" with instance=object breadcrumbs_action="Delete" %} +{% block extrastyle %}{{ block.super }} + {% endblock %} -{% block content %} -{% if perms_lacking or protected %} - {% if perms_lacking %} -

{% blocktrans with escaped_object=object %}Deleting the {{ object_name }} '{{ escaped_object }}' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:{% endblocktrans %}

-
    - {% for obj in perms_lacking %} -
  • {{ obj }}
  • - {% endfor %} -
- {% endif %} - {% if protected %} -

{% blocktrans with escaped_object=object %}Deleting the {{ object_name }} '{{ escaped_object }}' would require deleting the following protected related objects:{% endblocktrans %}

-
    - {% for obj in protected %} -
  • {{ obj }}
  • - {% endfor %} -
- {% endif %} -{% else %} -

{% blocktrans with escaped_object=object %}Are you sure you want to delete the {{ object_name }} "{{ escaped_object }}"? All of the following related items will be deleted:{% endblocktrans %}

-
    {{ deleted_objects|unordered_list }}
-
{% csrf_token %} -
- - -
-
-{% endif %} +{% block breadcrumbs %} + {% include "admin/filer/breadcrumbs.html" with instance=object breadcrumbs_action="Delete" %} {% endblock %} diff --git a/filer/templates/admin/filer/delete_selected_files_confirmation.html b/filer/templates/admin/filer/delete_selected_files_confirmation.html index b7d96df2f..5c9da677e 100644 --- a/filer/templates/admin/filer/delete_selected_files_confirmation.html +++ b/filer/templates/admin/filer/delete_selected_files_confirmation.html @@ -1,4 +1,4 @@ -{% extends "admin/filer/base_site.html" %} +{% extends "admin/delete_confirmation.html" %} {% load i18n %} {% block breadcrumbs %} @@ -6,44 +6,46 @@ {% endblock %} {% block content %} -{% if perms_lacking or protected %} - {% if perms_lacking %} -

{% blocktrans %}Deleting the selected files and/or folders would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:{% endblocktrans %}

-
    - {% for obj in perms_lacking %} -
  • {{ obj }}
  • + {% if perms_lacking or protected %} + {% if perms_lacking %} +

    {% blocktrans %}Deleting the selected files and/or folders would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:{% endblocktrans %}

    +
      + {% for obj in perms_lacking %} +
    • {{ obj }}
    • + {% endfor %} +
    + {% endif %} + {% if protected %} +

    {% blocktrans %}Deleting the selected files and/or folders would require deleting the following protected related objects:{% endblocktrans %}

    +
      + {% for obj in protected %} +
    • {{ obj }}
    • + {% endfor %} +
    + {% endif %} + {% else %} +

    {% blocktrans %}Are you sure you want to delete the selected files and/or folders? All of the following objects and their related items will be deleted:{% endblocktrans %}

    + {% for deletable_object in deletable_objects %} +
      {{ deletable_object|unordered_list }}
    {% endfor %} -
+
+ {% csrf_token %} +
+ {% for f in files_queryset %} + + {% endfor %} + {% for f in folders_queryset %} + + {% endfor %} + {% if is_popup %} + + {% if select_folder %}{% endif %} + {% endif %} + + + {% translate "No, take me back" %} + +
+
{% endif %} - {% if protected %} -

{% blocktrans %}Deleting the selected files and/or folders would require deleting the following protected related objects:{% endblocktrans %}

-
    - {% for obj in protected %} -
  • {{ obj }}
  • - {% endfor %} -
- {% endif %} -{% else %} -

{% blocktrans %}Are you sure you want to delete the selected files and/or folders? All of the following objects and their related items will be deleted:{% endblocktrans %}

- {% for deletable_object in deletable_objects %} -
    {{ deletable_object|unordered_list }}
- {% endfor %} -
{% csrf_token %} -
- {% for f in files_queryset %} - - {% endfor %} - {% for f in folders_queryset %} - - {% endfor %} - {% if is_popup %} - - {% if select_folder %}{% endif %} - {% endif %} - - - -
-
-{% endif %} {% endblock %} diff --git a/filer/templates/admin/filer/dismiss_popup.html b/filer/templates/admin/filer/dismiss_popup.html new file mode 100644 index 000000000..af648bc66 --- /dev/null +++ b/filer/templates/admin/filer/dismiss_popup.html @@ -0,0 +1,8 @@ +{% extends "admin/filer/base_site.html" %} + +{% block extrahead %} + {{ block.super }} + +{% endblock %} diff --git a/filer/templates/admin/filer/file/change_form.html b/filer/templates/admin/filer/file/change_form.html new file mode 100644 index 000000000..601ed99c3 --- /dev/null +++ b/filer/templates/admin/filer/file/change_form.html @@ -0,0 +1,30 @@ +{% extends "admin/filer/change_form.html" %} +{% load i18n admin_modify static %} + +{% block extrahead %} + {{ block.super }} + + {# upload stuff #} + + +{% endblock %} + + +{% block object-tools %} + {% if change and not is_popup %} + + {% endif %} + {% include "admin/filer/tools/detail_info.html" %} +{% endblock %} + +{% block submit_buttons_bottom %} + {% if not is_readonly_file %} + {% submit_row %} + {% endif %} +{% endblock %} + diff --git a/filer/templates/admin/filer/file/popup_response.html b/filer/templates/admin/filer/file/popup_response.html new file mode 100644 index 000000000..625659f3d --- /dev/null +++ b/filer/templates/admin/filer/file/popup_response.html @@ -0,0 +1,10 @@ +{% extends "admin/filer/base_site.html" %} +{% load static %} + +{% block extrahead %} + {{ block.super }} + +{% endblock %} diff --git a/filer/templates/admin/filer/folder/change_form.html b/filer/templates/admin/filer/folder/change_form.html index 1550af60a..7d850eb47 100644 --- a/filer/templates/admin/filer/folder/change_form.html +++ b/filer/templates/admin/filer/folder/change_form.html @@ -1,36 +1,41 @@ -{% extends "admin/filer/change_form.html" %} -{% load i18n admin_modify filermedia filer_admin_tags %} +{% extends "admin/change_form.html" %} +{% load i18n admin_modify static filer_admin_tags %} -{% block extrahead %} - {{ block.super }} - +{% block breadcrumbs %} + {% endblock %} {% block coltype %}{% if is_popup %}colM{% else %}colMS{% endif %}{% endblock %} {% block object-tools %} -{% if change %}{% if not is_popup %} - -{% endif %}{% endif %} + {% if change and not is_popup %} + + {% endif %} {% endblock %} {% block after_field_sets %} -{% if is_popup and select_folder %}{% endif %} + {% filer_admin_context_hidden_formfields %} {% endblock %} -{% block sidebar %}{% endblock %} - -{% block submit_buttons_bottom %} - {% if not original or not original|is_restricted_for_user:user %} - {% submit_row %} +{% block sidebar %} + {% if not is_popup %} + {% endif %} {% endblock %} diff --git a/filer/templates/admin/filer/folder/choose_copy_destination.html b/filer/templates/admin/filer/folder/choose_copy_destination.html index 17e11b592..38437b9de 100644 --- a/filer/templates/admin/filer/folder/choose_copy_destination.html +++ b/filer/templates/admin/filer/folder/choose_copy_destination.html @@ -1,30 +1,58 @@ {% extends "admin/filer/base_site.html" %} -{% load i18n filer_admin_tags %} +{% load i18n static filer_admin_tags %} {% block breadcrumbs %} -{% include "admin/filer/breadcrumbs.html" %} + {% include "admin/filer/breadcrumbs.html" %} +{% endblock %} + +{% block extrastyle %} + {{ block.super }} + + {% endblock %} {% block extrahead %} {{ block.super }} + {% endblock %} + {% block content %} -{% if not to_copy %} -

{% blocktrans %}There are no files and/or folders available to copy.{% endblocktrans %}

-{% else %} -

{% blocktrans %}The following files and/or folders will be copied to a destination folder (retaining their tree structure):{% endblocktrans %}

-
    {{ to_copy|unordered_list }}
-
{% csrf_token %} -
- {% for f in files_queryset %}{% endfor %} - {% for f in folders_queryset %}{% endfor %} - - - {% include 'admin/filer/folder/destination_field.html' %} - {{ copy_form.as_p_with_help }} -
-
+ {% if perms_lacking %} +

{% blocktrans %}Your account doesn't have permissions to copy all of the selected files and/or folders.{% endblocktrans %}

+ - -{% endif %} + {% else %} + {% if not to_copy %} +

{% blocktrans %}There are no files and/or folders available to copy.{% endblocktrans %}

+ + {% else %} +

{% blocktrans %}The following files and/or folders will be copied to a destination folder (retaining their tree structure):{% endblocktrans %}

+
    {{ to_copy|unordered_list }}
+
+ {% csrf_token %} +
+ {% for f in files_queryset %} + + {% endfor %} + {% for f in folders_queryset %} + + {% endfor %} + + + + {% include "admin/filer/folder/destination_tree_field.html" %} + + {{ copy_form.as_p }} + + +
+
+ {% endif %} + {% endif %} {% endblock %} diff --git a/filer/templates/admin/filer/folder/choose_images_resize_options.html b/filer/templates/admin/filer/folder/choose_images_resize_options.html index de1e3d607..a47df078a 100644 --- a/filer/templates/admin/filer/folder/choose_images_resize_options.html +++ b/filer/templates/admin/filer/folder/choose_images_resize_options.html @@ -1,35 +1,45 @@ {% extends "admin/base_site.html" %} -{% load i18n filer_admin_tags %} +{% load i18n static %} {% block breadcrumbs %} -{% include "admin/filer/breadcrumbs.html" %} + {% include "admin/filer/breadcrumbs.html" %} +{% endblock %} + +{% block extrastyle %} + {{ block.super }} + {% endblock %} {% block content %} -{% if not to_resize %} -

{% blocktrans %}There are no images available to resize.{% endblocktrans %}

-{% else %} -

{% blocktrans %}The following images will be resized:{% endblocktrans %}

-
    {{ to_resize|unordered_list }}
-
{% csrf_token %} -
- {% for f in files_queryset %} - - {% endfor %} - {% for f in folders_queryset %} - - {% endfor %} - - - {% if cmsplugin_enabled %} -

{% blocktrans %}Choose an existing thumbnail option or enter resize parameters:{% endblocktrans %}

+ {% if perms_lacking %} +

{% blocktrans %}Your account doesn't have permissions to resize all of the selected images.{% endblocktrans %}

{% else %} -

{% blocktrans %}Choose resize parameters:{% endblocktrans %}

- {% endif %} - {{ resize_form.as_p_with_help }} -

{% blocktrans %}Warning: Images will be resized in-place and originals will be lost. Maybe first make a copy of them to retain the originals.{% endblocktrans %}

-

-
-
-{% endif %} + {% if not to_resize %} +

{% blocktrans %}There are no images available to resize.{% endblocktrans %}

+ {% else %} +

{% blocktrans %}The following images will be resized:{% endblocktrans %}

+
    {{ to_resize|unordered_list }}
+
{% csrf_token %} +
+ {% for f in files_queryset %} + + {% endfor %} + {% for f in folders_queryset %} + + {% endfor %} + + +

{% blocktrans %}Choose an existing thumbnail option or enter resize parameters:{% endblocktrans %}

+ {% for fieldset in resize_form.admin_form %} + {% include "admin/includes/fieldset.html" %} + {% endfor %} +

{% blocktrans %}Warning: Images will be resized in-place and originals will be lost. Maybe first make a copy of them to retain the originals.{% endblocktrans %}

+ +
+ +
+
+
+ {% endif %} + {% endif %} {% endblock %} diff --git a/filer/templates/admin/filer/folder/choose_move_destination.html b/filer/templates/admin/filer/folder/choose_move_destination.html index 37fdfc2f3..93b875368 100644 --- a/filer/templates/admin/filer/folder/choose_move_destination.html +++ b/filer/templates/admin/filer/folder/choose_move_destination.html @@ -1,27 +1,55 @@ {% extends "admin/filer/base_site.html" %} -{% load i18n filer_admin_tags %} +{% load i18n static filer_admin_tags %} {% block breadcrumbs %} -{% include "admin/filer/breadcrumbs.html" %} + {% include "admin/filer/breadcrumbs.html" %} +{% endblock %} + +{% block extrastyle %} + {{ block.super }} + + +{% endblock %} + +{% block extrahead %} + {{ block.super }} + {% endblock %} {% block content %} -{% if not to_move %} -

{% blocktrans %}There are no files and/or folders available to move.{% endblocktrans %}

-{% else %} -

{% blocktrans %}The following files and/or folders will be moved to a destination folder (retaining their tree structure):{% endblocktrans %}

-
    {{ to_move|unordered_list }}
-
{% csrf_token %} -
- {% for f in files_queryset %}{% endfor %} - {% for f in folders_queryset %}{% endfor %} - - - {% include 'admin/filer/folder/destination_field.html' %} -
- + {% if perms_lacking %} +

{% blocktrans %}Your account doesn't have permissions to move all of the selected files and/or folders.{% endblocktrans %}

+ -
- -{% endif %} + {% else %} + {% if not to_move %} +

{% blocktrans %}There are no files and/or folders available to move.{% endblocktrans %}

+ + {% else %} +

{% blocktrans %}The following files and/or folders will be moved to a destination folder (retaining their tree structure):{% endblocktrans %}

+
    {{ to_move|unordered_list }}
+
{% csrf_token %} +
+ {% for f in files_queryset %} + + {% endfor %} + {% for f in folders_queryset %} + + {% endfor %} + + + + {% include "admin/filer/folder/destination_tree_field.html" %} + + +
+
+ {% endif %} + {% endif %} {% endblock %} diff --git a/filer/templates/admin/filer/folder/choose_rename_format.html b/filer/templates/admin/filer/folder/choose_rename_format.html index 8785c10b8..fae8ea1b7 100644 --- a/filer/templates/admin/filer/folder/choose_rename_format.html +++ b/filer/templates/admin/filer/folder/choose_rename_format.html @@ -1,53 +1,65 @@ {% extends "admin/base_site.html" %} -{% load i18n filer_admin_tags %} +{% load i18n static %} {% block breadcrumbs %} -{% include "admin/filer/breadcrumbs.html" %} + {% include "admin/filer/breadcrumbs.html" %} +{% endblock %} + +{% block extrastyle %} + {{ block.super }} + {% endblock %} {% block content %} -{% if not to_rename %} -

{% blocktrans %}There are no files available to rename.{% endblocktrans %}

-{% else %} -

{% blocktrans %}The following files will be renamed (they will stay in their folders and keep original filename, only displayed filename will be changed):{% endblocktrans %}

-
    {{ to_rename|unordered_list }}
-
{% csrf_token %} -
- {% for f in files_queryset %} - - {% endfor %} - {% for f in folders_queryset %} - - {% endfor %} - - - {{ rename_form.as_p_with_help }} -
-

Rename format is in Python % operator format using dictionary of possible values:

-
-
original_filename
-
original_basename
-
Original filename without possible file extension.
-
original_extension
-
current_filename
-
current_basename
-
Current filename without possible file extension.
-
current_extension
-
current_folder
-
Name of the folder the file is currently in.
-
counter
-
Renaming sequence counter in the current folder (1-based).
-
global_counter
-
Renaming squence counter for all files currently renaming (1-based).
-
-

Examples:

-
    -
  • Prefix %(current_filename)s
  • -
  • Image %(counter)03d
  • -
-
-

-
-
-{% endif %} + {% if perms_lacking %} +

{% blocktrans %}Your account doesn't have permissions to rename all of the selected files.{% endblocktrans %}

+ {% else %} + {% if not to_rename %} +

{% blocktrans %}There are no files available to rename.{% endblocktrans %}

+ {% else %} +

{% blocktrans %}The following files will be renamed (they will stay in their folders and keep original filename, only displayed filename will be changed):{% endblocktrans %}

+
    {{ to_rename|unordered_list }}
+
+ {% csrf_token %} +
+ {% for f in files_queryset %} + + {% endfor %} + {% for f in folders_queryset %} + + {% endfor %} + + + {{ rename_form.as_p }} +
+

Rename format is in Python % operator format using dictionary of possible values:

+
+
original_filename
+
original_basename
+
Original filename without possible file extension.
+
original_extension
+
current_filename
+
current_basename
+
Current filename without possible file extension.
+
current_extension
+
current_folder
+
Name of the folder the file is currently in.
+
counter
+
Renaming sequence counter in the current folder (1-based).
+
global_counter
+
Renaming squence counter for all files currently renaming (1-based).
+
+

Examples:

+
    +
  • Prefix %(current_filename)s
  • +
  • Image %(counter)03d
  • +
+
+

+ +

+
+
+ {% endif %} + {% endif %} {% endblock %} diff --git a/filer/templates/admin/filer/folder/destination_tree_field.html b/filer/templates/admin/filer/folder/destination_tree_field.html new file mode 100644 index 000000000..beb9a7ba7 --- /dev/null +++ b/filer/templates/admin/filer/folder/destination_tree_field.html @@ -0,0 +1,220 @@ +{% load i18n %} +

+ + {% trans "Select a folder below." %} + +

+
+ + + + + diff --git a/filer/templates/admin/filer/folder/directory_listing.html b/filer/templates/admin/filer/folder/directory_listing.html index d13f0aefb..c4a336a04 100644 --- a/filer/templates/admin/filer/folder/directory_listing.html +++ b/filer/templates/admin/filer/folder/directory_listing.html @@ -1,142 +1,267 @@ {% extends "admin/filer/base_site.html" %} -{% load filer_admin_tags filermedia i18n %} +{% load i18n static filer_admin_tags %} -{% block extrahead %} - {{ block.super }} - {# upload stuff #} - {{ media.js }} - - - - - - - - - {% if action_form %} - {% if actions_on_top or actions_on_bottom %} - - {% endif %} - {% endif %} -{% endblock %} - -{% block coltype %}colMS row{% endblock %} -{% block bodyclass %}change-list filebrowser{% endblock %} +{% block coltype %}{% endblock %} +{% block bodyclass %}{{ block.super }} change-list filebrowser{% endblock %} {% block extrastyle %} {{ block.super }} - {{ media.css }} + {{ media.css }} {% if action_form %} {% url 'admin:jsi18n' as jsi18nurl %} {% endif %} - {% if query.pop %} - {% endif %} - {% if not actions_on_top and not actions_on_bottom %} - {% endif %} {% endblock %} {% block breadcrumbs %} - {% with folder as instance %} - {% include "admin/filer/breadcrumbs.html" %} - {% endwith %} + {% if not is_popup %} + + {% endif %} {% endblock %} - {% block sidebar %} - + {% include "admin/filer/tools/clipboard/clipboard.html" %} {% endblock %} +{% block content_title %} +

 

+{% endblock %} -{% block content_title %}{% endblock %} -{% block content %} -
-
    - {% if not folder|is_restricted_for_user:user and folder.can_have_subfolders %} - {%if is_popup and folder.is_root %} - {%else%} -
  • - {% trans "New Folder" %} -
  • - {% endif %} - {% endif %} -
  • - {% trans 'Upload' %} -
  • - {% include 'admin/filer/tools/upload_button_js.html' %} -
- -
- {% include "admin/filer/tools/search_form.html" %} - - {% if not folder.is_root %} -
+
+ {% block filer-tools %} + - {% endif %} - {% endif %} - -
{% csrf_token %} - {% if is_popup %}{% endif %} - {% if action_form and actions_on_top and paginator.count and not select_folder and not is_popup %}{% filer_actions %}{% endif %} - {% include "admin/filer/folder/directory_table.html" %} - {% if action_form and actions_on_bottom and paginator.count and not select_folder and not is_popup %}{% filer_actions %}{% endif %} -
- +
+
+
+ {% include "admin/filer/tools/search_form.html" %} +
-
- {% endblock %} diff --git a/filer/templates/admin/filer/folder/directory_table_list.html b/filer/templates/admin/filer/folder/directory_table_list.html new file mode 100644 index 000000000..54647e5fa --- /dev/null +++ b/filer/templates/admin/filer/folder/directory_table_list.html @@ -0,0 +1,256 @@ +{% load i18n l10n admin_list filer_tags filer_admin_tags static thumbnail %} +
+ diff --git a/filer/templates/admin/filer/folder/directory_thumbnail_list.html b/filer/templates/admin/filer/folder/directory_thumbnail_list.html new file mode 100644 index 000000000..b7a3fe91f --- /dev/null +++ b/filer/templates/admin/filer/folder/directory_thumbnail_list.html @@ -0,0 +1,228 @@ +{% load i18n l10n admin_list filer_tags filer_admin_tags static thumbnail %} +
+ diff --git a/filer/templates/admin/filer/folder/legacy_listing.html b/filer/templates/admin/filer/folder/legacy_listing.html new file mode 100644 index 000000000..50cc1af34 --- /dev/null +++ b/filer/templates/admin/filer/folder/legacy_listing.html @@ -0,0 +1,267 @@ +{% extends "admin/filer/base_site.html" %} +{# Used for django < 5.2 with lagacy object-tools blocks #} +{# Customized templates will need to be updated for django >= 5.2 #} +{# The object-tools block has been renamed filer-tools for django >= 5.2 #} + +{% load i18n static filer_admin_tags %} + +{% block coltype %}{% endblock %} +{% block bodyclass %}{{ block.super }} change-list filebrowser{% endblock %} + +{% block extrastyle %} + {{ block.super }} + + {{ media.css }} + {% if action_form %} + {% url 'admin:jsi18n' as jsi18nurl %} + + {% endif %} + {% if query.pop %} + + {% endif %} +{% endblock %} + +{% block breadcrumbs %} + {% if not is_popup %} + + {% endif %} +{% endblock %} + +{% block sidebar %} + {% include "admin/filer/tools/clipboard/clipboard.html" %} +{% endblock %} + +{% block content_title %} +

 

+{% endblock %} + +{% block content %} + +
+ {% include "admin/filer/tools/search_form.html" %} + +
+{% endblock %} \ No newline at end of file diff --git a/filer/templates/admin/filer/folder/list_type_switcher.html b/filer/templates/admin/filer/folder/list_type_switcher.html new file mode 100644 index 000000000..ebf95c4e4 --- /dev/null +++ b/filer/templates/admin/filer/folder/list_type_switcher.html @@ -0,0 +1 @@ + diff --git a/filer/templates/admin/filer/folder/new_folder_form.html b/filer/templates/admin/filer/folder/new_folder_form.html index eb0e8dc1a..f9ff43b7d 100644 --- a/filer/templates/admin/filer/folder/new_folder_form.html +++ b/filer/templates/admin/filer/folder/new_folder_form.html @@ -1,37 +1,38 @@ {% extends "admin/change_form.html" %} -{% load i18n %} +{% load i18n filer_admin_tags %} + +{% block title %}{% translate "Add new" %} {% translate "folder" %} | {{ site_title|default:_('Django site admin') }}{% endblock %} + {% block content %} -

{% trans "Add new" %} {% trans "folder" %}

-
-
- {% csrf_token %} -
- - {% if select_folder %}{% endif %} - {% if new_folder_form.errors %} -

- {% blocktrans count new_folder_form.errors|length as counter %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktrans %} -

- {{ new_folder_form.non_field_errors }} - {% endif %} -
-
- {{ new_folder_form.errors.name.as_ul }} -
- {% for field in new_folder_form %} - {{ field }} - {% endfor %} -
+

{% translate "Add new" %} {% translate "folder" %}

+
+ + {% csrf_token %} +
+ {% filer_admin_context_hidden_formfields %} + {% if new_folder_form.errors %} +

+ {% blocktrans count new_folder_form.errors|length as counter %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktrans %} +

+ {{ new_folder_form.non_field_errors }} + {% endif %} +
+
+ {{ new_folder_form.errors.name.as_ul }} +
+ {% for field in new_folder_form %} + {{ field }} + {% endfor %} +
+
+
+
+ +
+
-
-
- -
- -
-
-
- - -
+ +
{% endblock %} diff --git a/filer/templates/admin/filer/image/change_form.html b/filer/templates/admin/filer/image/change_form.html index 1065b4178..2c564487a 100644 --- a/filer/templates/admin/filer/image/change_form.html +++ b/filer/templates/admin/filer/image/change_form.html @@ -1,35 +1,22 @@ {% extends "admin/filer/change_form.html" %} -{% load i18n admin_modify filer_admin_tags %} +{% load i18n admin_modify static %} -{% block object-tools %} -{% if change %}{% if not is_popup %} - -{% endif %}{% endif %} -{% endblock %} +{% block extrahead %} + {{ block.super }} -{% block coltype %}colMS row{% endblock %} -{% block field_sets %} - {% for fieldset in adminform %} - {% include "admin/filer/fieldset.html" %} - {% endfor %} + {# upload stuff #} + + {% endblock %} -{% block content %} - {{block.super}} +{% block object-tools %} + {% if change and not is_popup %} + + {% endif %} + {% include "admin/filer/tools/detail_info.html" %} {% endblock %} - - -{%block sidebar %} - -{%endblock%} diff --git a/filer/templates/admin/filer/image/expand.html b/filer/templates/admin/filer/image/expand.html new file mode 100644 index 000000000..891ae07d0 --- /dev/null +++ b/filer/templates/admin/filer/image/expand.html @@ -0,0 +1,28 @@ + + + + + + + + + diff --git a/filer/templates/admin/filer/submit_line.html b/filer/templates/admin/filer/submit_line.html index db27b0d58..04f9428e4 100644 --- a/filer/templates/admin/filer/submit_line.html +++ b/filer/templates/admin/filer/submit_line.html @@ -1,8 +1,8 @@ {% load i18n admin_urls %}
- {% if show_delete_link %}{% trans "Delete" %}{% endif %} + {% if show_delete_link and original.pk %}{% trans "Delete" %}{% endif %} {% if show_save_as_new %}{%endif%} {% if show_save_and_add_another %}{% endif %} {% if show_save_and_continue %}{% endif %} {% if show_save %}{% endif %} -
\ No newline at end of file +
diff --git a/filer/templates/admin/filer/templatetags/file_icon.html b/filer/templates/admin/filer/templatetags/file_icon.html new file mode 100644 index 000000000..39a5f4430 --- /dev/null +++ b/filer/templates/admin/filer/templatetags/file_icon.html @@ -0,0 +1,38 @@ +{% load i18n %} +{% if sidebar_image_ratio %} +
+{% endif %} +{% if download_url %} + {% if mime_maintype == 'audio' %} + + {% elif mime_maintype == 'video' %} + + {% else %} + {{ alt_text }} + {% endif %} +{% else %} + {{ alt_text }} +{% endif %} +{% if sidebar_image_ratio %} +
+ +
+
+{% endif %} diff --git a/filer/templates/admin/filer/tools/clipboard/clipboard.html b/filer/templates/admin/filer/tools/clipboard/clipboard.html index 0c72f0bb0..4dce738b1 100644 --- a/filer/templates/admin/filer/tools/clipboard/clipboard.html +++ b/filer/templates/admin/filer/tools/clipboard/clipboard.html @@ -1,65 +1,55 @@ -{% load thumbnail i18n filer_admin_tags %} +{% load i18n filer_admin_tags %} -{% with user_clipboard as clipboard %} -
- - - - - - - + + + + {% if clipboard.files.count %} + {% with clipboard.files.all as items %} + {% include "admin/filer/tools/clipboard/clipboard_item_rows.html" %} + {% endwith %} + {% else %} + + + + {% endif %} + +

{% trans "Clipboard" %}

-
-
+{% for clipboard in user.filer_clipboards.all %} + - -{% endwith %} + {% endcomment %} +
{% trans "the clipboard is empty" %}
+
+{% endfor %} diff --git a/filer/templates/admin/filer/tools/clipboard/clipboard_item_rows.html b/filer/templates/admin/filer/tools/clipboard/clipboard_item_rows.html index 471439b98..9d46e7fbe 100644 --- a/filer/templates/admin/filer/tools/clipboard/clipboard_item_rows.html +++ b/filer/templates/admin/filer/tools/clipboard/clipboard_item_rows.html @@ -1,13 +1,19 @@ -{% load thumbnail i18n %}{% if items %} -{% for generic_item in items %}{% with generic_item as item %} - -
{{ item.default_alt_text }}
- {{ item.label }} - - -{% endwith %}{% endfor %}{% else %} - - - {% trans "upload failed" %} - - {% endif %} \ No newline at end of file +{% load i18n %} + +{% if items %} + {% for generic_item in items %} + {% with generic_item as item %} + + {{ item.default_alt_text }} + {{ item.label }} + + + {% endwith %} + {% endfor %} +{% else %} + + + {% translate "upload failed" %} + + +{% endif %} diff --git a/filer/templates/admin/filer/tools/detail_info.html b/filer/templates/admin/filer/tools/detail_info.html new file mode 100644 index 000000000..1e18f34ea --- /dev/null +++ b/filer/templates/admin/filer/tools/detail_info.html @@ -0,0 +1,55 @@ +{% load filer_admin_tags i18n static %} +
+
+
+
+ {% file_icon original detail=True %} +
+ {% if original.file.exists %} + +   + {% translate "Download" %} + + {% if expand_image_url %} + + {% translate "Expand" %}  + + + {% endif %} + {% else %} + {% translate "File is missing" %} + {% endif %} +
+
+
+
+ {% if original.file_type or original.modified_at or original.uploaded_at or original.width or original.height or original.size %} +
+ {% if original.file_type %} +
{% translate "Type" %}
+
{{ original.extension|upper }} {{ original.file_type }} ({{ original.mime_type }})
+ {% endif %} + {% if original.width or original.height %} +
{% translate "Size" %}
+
{{ original.width|floatformat }}x{{ original.height|floatformat }} px
+ {% endif %} + {% if original.size %} +
{% translate "File-size" %}
+
{{ original.size|filesizeformat }}
+ {% endif %} + {% if original.modified_at %} +
{% translate "Modified" %}
+
{{ original.modified_at }}
+ {% endif %} + {% if original.uploaded_at %} +
{% translate "Created" %}
+
{{ original.uploaded_at }}
+ {% endif %} + {% if original.owner %} +
{% translate "Owner" %}
+
{{ original.owner }}
+ {% endif %} +
+ {% endif %} +
+
diff --git a/filer/templates/admin/filer/tools/search_form.html b/filer/templates/admin/filer/tools/search_form.html index 0fdd405aa..cf3f98976 100644 --- a/filer/templates/admin/filer/tools/search_form.html +++ b/filer/templates/admin/filer/tools/search_form.html @@ -1,43 +1,9 @@ -{% load filermedia filer_admin_tags %} -{% load i18n %} -
-
- +{% load i18n static filer_admin_tags %} + +{% if show_result_count %} +
+ ({% translate "found" %} {% blocktrans count folder_children|length as counter %}{{ counter }} folder{% plural %}{{ counter }} folders{% endblocktrans %} {% translate "and" %} + {% blocktrans count folder_files|length as counter %}{{ counter }} file{% plural %}{{ counter }} files{% endblocktrans %}) + {% translate "cancel search" %}
-
-
- +{% endif %} diff --git a/filer/templates/admin/filer/trash/file_row.html b/filer/templates/admin/filer/trash/file_row.html index bdc21dcd0..a8c712209 100644 --- a/filer/templates/admin/filer/trash/file_row.html +++ b/filer/templates/admin/filer/trash/file_row.html @@ -12,5 +12,5 @@ {% trans "Owner" %}: {% firstof file.owner.email file.owner.username "n/a" %} - {% client_timezone file.deleted_at %} + {{ file.deleted_at }} diff --git a/filer/templates/admin/filer/trash/subfolder_row.html b/filer/templates/admin/filer/trash/subfolder_row.html index 90ef43900..a01a496b2 100644 --- a/filer/templates/admin/filer/trash/subfolder_row.html +++ b/filer/templates/admin/filer/trash/subfolder_row.html @@ -11,5 +11,5 @@
{% trans "Owner" %}: {% firstof subfolder.owner.email subfolder.owner.username "n/a" %}
- {% client_timezone subfolder.deleted_at %} + {{ subfolder.deleted_at }} diff --git a/filer/templates/admin/filer/widgets/admin_file.html b/filer/templates/admin/filer/widgets/admin_file.html index d84586994..65f4d9994 100644 --- a/filer/templates/admin/filer/widgets/admin_file.html +++ b/filer/templates/admin/filer/widgets/admin_file.html @@ -1,40 +1,62 @@ -{% comment "Template for file widget" %} - Changes made here should also be considered for the customizable version - admin_file_custom.html. -{% endcomment %} -{% load i18n filer_admin_tags %}{% spaceless %} -{% if object %} - {% if object.icons.32 %} - {{ object.label }} -  {{ object.label }} - {% else %} - - {% trans 'file missing' %} - -  {% trans 'file missing' %} - {% endif %} -{% else %} - - {% trans 'no file selected' %} - -   -{% endif %} - - {% trans 'Lookup' %} - - -
-{{ hidden_input }} - +{% load i18n filer_admin_tags static %} + +{% spaceless %} +
+
+ + + +
+
+
+ {% translate "or drop your file here" %} +
+ + + {% if object %} + {% if object.file.exists %} + {% file_icon object detail="thumbnail" %} +  {{ object.label }} + {% else %} + {% file_icon object %} +  {% translate 'File is missing' %} + {% endif %} + {% else %} + +   + {% endif %} + + + + + + + + + + + {% translate 'Choose File' %} + + + +
+ + +
+
+
{% endspaceless %} diff --git a/filer/templates/admin/filer/widgets/admin_folder.html b/filer/templates/admin/filer/widgets/admin_folder.html index f7b782b1f..836da2c60 100644 --- a/filer/templates/admin/filer/widgets/admin_folder.html +++ b/filer/templates/admin/filer/widgets/admin_folder.html @@ -1,22 +1,24 @@ -{% load i18n filer_admin_tags filermedia %}{% spaceless %} -{% trans 'no folder selected' %} {% if object %}{{ object.pretty_logical_path }}{% else %}{% trans 'none selected' %}{% endif %} - - {% trans 'Lookup' %} - - -
-{{ hidden_input }} - +{% load i18n filer_admin_tags static %} + +{% spaceless %} +
+ + +   + {% trans "Choose Folder" %} + + + + + {% if object %} + {{ object.pretty_logical_path }} + {% endif %} + + + + + + + +
{% endspaceless %} diff --git a/filer/templatetags/filer_admin_tags.py b/filer/templatetags/filer_admin_tags.py index 8dd08a542..c62b5c906 100644 --- a/filer/templatetags/filer_admin_tags.py +++ b/filer/templatetags/filer_admin_tags.py @@ -1,13 +1,33 @@ -from django.conf import settings +from math import ceil + +from django.contrib.staticfiles.storage import staticfiles_storage +from django.core.files.storage import FileSystemStorage from django.template import Library -from packaging.version import parse -import django -import pytz -import datetime -import filer +from django.templatetags.static import static +from django.urls import reverse +from django.utils.html import escapejs, format_html_join +from django.utils.safestring import mark_safe +from django.utils.translation import gettext_lazy as _ + +from easy_thumbnails.engine import NoSourceGenerator +from easy_thumbnails.exceptions import InvalidImageFormatError +from easy_thumbnails.files import get_thumbnailer +from easy_thumbnails.options import ThumbnailOptions + +from filer import settings +from filer.admin.tools import admin_url_params, admin_url_params_encoded +from filer.models.imagemodels import BaseImage +from filer.settings import ( + DEFERRED_THUMBNAIL_SIZES, FILER_MAX_SVG_THUMBNAIL_SIZE, FILER_TABLE_ICON_SIZE, FILER_THUMBNAIL_ICON_SIZE, +) +import filer.models + register = Library() +assignment_tag = getattr(register, 'assignment_tag', register.simple_tag) + + def filer_actions(context): """ Track the number of times the action field has been rendered on the page, @@ -15,53 +35,200 @@ def filer_actions(context): """ context['action_index'] = context.get('action_index', -1) + 1 return context -filer_actions = register.inclusion_tag("admin/filer/actions.html", takes_context=True)(filer_actions) -if parse(django.get_version()) < parse('1.4'): - ADMIN_ICON_BASE = "%sadmin/img/admin/" % settings.STATIC_URL -else: - ADMIN_ICON_BASE = "%sadmin/img/" % settings.STATIC_URL -ADMIN_CSS_BASE = "%sadmin/css/" % settings.STATIC_URL -ADMIN_JS_BASE = "%sadmin/js/" % settings.STATIC_URL +filer_actions = register.inclusion_tag( + "admin/filer/actions.html", takes_context=True)(filer_actions) -@register.simple_tag -def admin_icon_base(): - return ADMIN_ICON_BASE -@register.simple_tag -def admin_css_base(): - return ADMIN_CSS_BASE +@register.inclusion_tag( + 'admin/filer/folder/list_type_switcher.html', + takes_context=True, +) +def filer_folder_list_type_switcher(context): + choice_list = settings.FILER_FOLDER_ADMIN_LIST_TYPE_CHOICES + current_list_type = context['list_type'] + # This solution is user-friendly when there's only 2 choices + # If there will be more list types then please change this switcher to more + # proper widget (like for e.g. select list) + next_list_type = next( + iter(choice_list[choice_list.index(current_list_type) + 1:]), + choice_list[0], + ) -@register.simple_tag -def admin_js_base(): - return ADMIN_JS_BASE + context['url'] = admin_url_params_encoded( + context['request'], + params={'_list_type': next_list_type}, + ) + context['tooltip_text'] = settings.FILER_FOLDER_ADMIN_LIST_TYPE_SWITCHER_SETTINGS[next_list_type]['tooltip_text'] + context['icon'] = settings.FILER_FOLDER_ADMIN_LIST_TYPE_SWITCHER_SETTINGS[next_list_type]['icon'] + return context + + +@register.simple_tag(takes_context=True) +def filer_admin_context_url_params(context, first_separator='?'): + return admin_url_params_encoded( + context['request'], first_separator=first_separator) + + +@register.simple_tag(takes_context=True) +def filer_admin_context_hidden_formfields(context): + request = context.get('request') + return format_html_join( + '\n', + '', + admin_url_params(request).items(), + ) + + +@assignment_tag(takes_context=True) +def filer_has_permission(context, item, action): + """Does the current user (taken from the request in the context) have + permission to do the given action on the given item. -@register.inclusion_tag('admin/filer/submit_line.html', takes_context=True) -def submit_row(context): - """ - Displays the row of buttons for delete and save. """ - opts = context['opts'] - change = context['change'] - is_popup = context['is_popup'] - save_as = context['save_as'] - ctx = { - 'opts': opts, - 'obj': context.get('original'), - 'show_delete_link': not is_popup and context['has_delete_permission'] and change and context.get('show_delete', True), - 'show_save_as_new': not is_popup and change and save_as, - 'show_save_and_add_another': context['has_add_permission'] and not is_popup and (not save_as or context['add']), - 'show_save_and_continue': not is_popup and context['has_change_permission'], - 'is_popup': is_popup, - 'show_save': True, - 'preserved_filters': context.get('preserved_filters'), + permission_method_name = f'has_{action}_permission' + permission_method = getattr(item, permission_method_name, None) + request = context.get('request') + + if not permission_method or not request: + return False + # Call the permission method. + # This amounts to calling `item.has_X_permission(request)` + return permission_method(request) + + +def file_icon_context(file, detail, width, height): + mime_maintype, mime_subtype = file.mime_maintype, file.mime_subtype + context = { + 'mime_maintype': mime_maintype, + 'mime_type': file.mime_type, + } + height, width, context = get_aspect_ratio_and_download_url(context, detail, file, height, width) + # returned context if icon is not available + not_available_context = { + 'icon_url': staticfiles_storage.url('filer/icons/file-missing.svg'), + 'alt_text': _("File is missing"), + 'width': width, + 'height': width, # The icon is a square } - if context.get('original') is not None: - ctx['original'] = context['original'] - return ctx + # Check if file exists for performance reasons (only on FileSystemStorage) + if file.file and isinstance(file.file.source_storage, FileSystemStorage) and not file.file.exists(): + return not_available_context + + add_styles = {} + if isinstance(file, BaseImage): + thumbnailer = get_thumbnailer(file) + + # SVG files may contain multiple vector graphics, and width and height are not available for them. If file does + # not have width or height just ignore the thumbnail icon. Otherwise, continue with the standard procedure. + if file.width == 0.0 or file.height == 0.0: + icon_url = staticfiles_storage.url('filer/icons/file-unknown.svg') + else: + if detail: + opts = {'size': (width, height), 'upscale': True} + else: + opts = {'size': (width, height), 'crop': True} + thumbnail_options = ThumbnailOptions(opts) + # Optimize directory listing: + if width == height and width in DEFERRED_THUMBNAIL_SIZES and hasattr(file, "thumbnail_name"): + # Get name of thumbnail from easy-thumbnail + configured_name = thumbnailer.get_thumbnail_name(thumbnail_options, transparent=file._transparent) + # If the name was annotated: Thumbnail exists and we can use it + if configured_name == file.thumbnail_name: + icon_url = file.file.thumbnail_storage.url(configured_name) + if mime_subtype != 'svg+xml' and file.thumbnailx2_name: + context['highres_url'] = file.file.thumbnail_storage.url(file.thumbnailx2_name) + elif mime_subtype == 'svg+xml': + if file.size < FILER_MAX_SVG_THUMBNAIL_SIZE: + icon_url = file.url + else: + # Only display a generic image icon + # Better solution: Render a bitmap thumbnail from SVG + icon_url = staticfiles_storage.url('filer/icons/file-picture.svg') + add_styles = { + "object-fit": "cover", # Mimic the behavior of the thumbnail + } + else: # Probably does not exist, defer creation + icon_url = reverse("admin:filer_file_fileicon", args=(file.pk, width)) + context['alt_text'] = file.default_alt_text + else: + # Try creating thumbnails / take existing ones + try: + icon_url = thumbnailer.get_thumbnail(thumbnail_options).url + context['alt_text'] = file.default_alt_text + if mime_subtype != 'svg+xml': + thumbnail_options['size'] = 2 * width, 2 * height + context['highres_url'] = thumbnailer.get_thumbnail(thumbnail_options).url + except (InvalidImageFormatError, NoSourceGenerator): + # This is caught by file.exists() for file storage systems + # For remote storage systems we catch the error to avoid second trip + # to the storage system + return not_available_context + elif mime_maintype in ['audio', 'font', 'video']: + icon_url = staticfiles_storage.url(f'filer/icons/file-{mime_maintype}.svg') + height = width # icon is a square + elif mime_maintype == 'application' and mime_subtype in ['zip', 'pdf']: + icon_url = staticfiles_storage.url(f'filer/icons/file-{mime_subtype}.svg') + height = width # icon is a square + else: + icon_url = staticfiles_storage.url('filer/icons/file-unknown.svg') + height = width # icon is a square + context.update(width=width, height=height, icon_url=icon_url) + if add_styles: + styles = "; ".join(f"{k}: {v}" for k, v in add_styles.items()) + context.update(add_styles=f'style="{styles}"') + return context +def get_aspect_ratio_and_download_url(context, detail, file, height, width): + # Get download_url and aspect ratio right for detail view + if detail: + context['download_url'] = file.url + if isinstance(file, BaseImage): + # only check for file width, if the file + # is actually an image and not on other files + # because they don't really have width or height + if file.width: + width, height = 210, ceil(210 / file.width * file.height) + context['sidebar_image_ratio'] = '%.6f' % (file.width / 210) + return height, width, context + + +@register.inclusion_tag('admin/filer/templatetags/file_icon.html') +def file_icon(file, detail=False, size=None): + """ + This templatetag returns a rendered ` + to be used for rendering thumbnails of files in the directory listing or in the corresponding detail + views for that image. + """ + if size: + width, height = (int(s) for s in size.split('x')) + elif detail == "thumbnail": + width, height = FILER_THUMBNAIL_ICON_SIZE, FILER_THUMBNAIL_ICON_SIZE + elif detail is True: + width, height = 2 * FILER_TABLE_ICON_SIZE, 2 * FILER_TABLE_ICON_SIZE + else: + width, height = FILER_TABLE_ICON_SIZE, FILER_TABLE_ICON_SIZE + return file_icon_context(file, detail is True, width, height) + + +@register.simple_tag +def file_icon_url(file): + # Cache since it is called repeatedly by templates + if not hasattr(file, "_file_icon_url_cache"): + context = file_icon_context(file, False, 2 * FILER_TABLE_ICON_SIZE, 2 * FILER_TABLE_ICON_SIZE) + file._file_icon_url_cache = escapejs(context.get('highres_url', context['icon_url'])) + return file._file_icon_url_cache + + +@register.simple_tag +def icon_css_library(): + html = "" + for lib in settings.ICON_CSS_LIB: + html += f'' + return mark_safe(html) + @register.simple_tag(takes_context=True) def get_popup_params(context, sep='?'): @@ -78,26 +245,9 @@ def get_popup_params(context, sep='?'): params += '¤t_site=%s' % current_site if file_type: params += '&file_type=%s' % file_type - return params -@register.filter -def is_restricted_for_user(filer_obj, user): - return (filer_obj.is_readonly_for_user(user) or - filer_obj.is_restricted_for_user(user)) - - -@register.filter -def is_readonly_for_user(filer_obj, user): - return filer_obj.is_readonly_for_user(user) - - -@register.filter -def can_change_folder(folder, user): - return folder.has_change_permission(user) - - @register.filter def pretty_display(filer_obj): if isinstance(filer_obj, filer.models.Folder): @@ -112,24 +262,3 @@ def pretty_display(filer_obj): .get_ancestors(include_self=True) .values_list('name', flat=True)) + [name]) return '' - - -def _build_timezone_dict(): - offset_with_timezone = {} - for zone in pytz.common_timezones: - timezone_obj = pytz.timezone(zone) - zone_offset = datetime.datetime.now(timezone_obj).strftime("%z") - offset_with_timezone[zone_offset] = timezone_obj - return offset_with_timezone - -_OFFSETS_WITH_TIMEZONES = _build_timezone_dict() - -@register.simple_tag(takes_context=True) -def client_timezone(context, date): - gmt_offset = context.get('request').COOKIES.get('gmt_offset', None) - if not gmt_offset: - return date - client_timezone = _OFFSETS_WITH_TIMEZONES.get(gmt_offset, None) - if not client_timezone: - return date - return date.astimezone(client_timezone) diff --git a/filer/templatetags/filer_image_tags.py b/filer/templatetags/filer_image_tags.py index 78a58d716..5588521f1 100644 --- a/filer/templatetags/filer_image_tags.py +++ b/filer/templatetags/filer_image_tags.py @@ -1,12 +1,17 @@ -#-*- coding: utf-8 -*- -from django.template import Library import re +from django.template import Library + + register = Library() RE_SIZE = re.compile(r'(\d+)x(\d+)$') +def percentage(part, whole): + return 100 * float(part) / float(whole) + + def _recalculate_size(size, index, divisor=0, padding=0, keep_aspect_ratio=False): new_one = size[index] @@ -15,8 +20,8 @@ def _recalculate_size(size, index, divisor=0, padding=0, if padding: new_one = new_one - padding if keep_aspect_ratio: - new_two = int(float(new_one) * \ - float(size[int(not index)]) / size[index]) + new_two = int( + float(new_one) * float(size[int(not index)]) / size[index]) else: new_two = int(size[int(not index)]) @@ -56,6 +61,8 @@ def extra_padding_x(original_size, padding): Reduce the width of `original_size` by `padding` """ return _resize(original_size, 0, padding=padding) + + extra_padding_x = register.filter(extra_padding_x) @@ -65,6 +72,8 @@ def extra_padding_x_keep_ratio(original_size, padding): ratio. """ return _resize(original_size, 0, padding=padding, keep_aspect_ratio=True) + + extra_padding_x_keep_ratio = register.filter(extra_padding_x_keep_ratio) @@ -73,6 +82,8 @@ def extra_padding_y(original_size, padding): Reduce the height of `original_size` by `padding` """ return _resize(original_size, 1, padding=padding) + + extra_padding_y = register.filter(extra_padding_y) @@ -82,16 +93,22 @@ def extra_padding_y_keep_ratio(original_size, padding): ratio. """ return _resize(original_size, 1, padding=padding, keep_aspect_ratio=True) + + extra_padding_y_keep_ratio = register.filter(extra_padding_y_keep_ratio) def divide_x_by(original_size, divisor): return _resize(original_size, 0, divisor=divisor) + + devide_x_by = register.filter(divide_x_by) def divide_y_by(original_size, divisor): return _resize(original_size, 1, divisor=divisor) + + devide_y_by = register.filter(divide_y_by) @@ -99,4 +116,24 @@ def divide_xy_by(original_size, divisor): size = divide_x_by(original_size, divisor=divisor) size = divide_y_by(size, divisor=divisor) return size + + divide_xy_by = register.filter(divide_xy_by) + + +def get_css_position(image): + if not image or not image.subject_location: + return '50% 50%' + + x, y = image.subject_location.split(',') + width = image.width + height = image.height + + coords = '{}% {}%'.format( + percentage(x, width), + percentage(y, height) + ) + return coords + + +get_css_position = register.filter(get_css_position) diff --git a/filer/templatetags/filer_tags.py b/filer/templatetags/filer_tags.py index f481c50e0..faaba6109 100644 --- a/filer/templatetags/filer_tags.py +++ b/filer/templatetags/filer_tags.py @@ -1,7 +1,8 @@ -#-*- coding: utf-8 -*- -from django.template import Library import math +from django.template import Library + + register = Library() # The templatetag below is copied from sorl.thumbnail @@ -49,6 +50,7 @@ def filesize(bytes, format='auto1024'): elif format not in ('auto1024', 'auto1000', 'auto1024long', 'auto1000long'): return bytes + # Check for valid bytes try: bytes = int(bytes) @@ -82,12 +84,12 @@ def filesize(bytes, format='auto1024'): unit = filesize_long_formats.get(unit, '') if base == 1024 and unit: unit = '%sbi' % unit[:2] - unit = '%sbyte%s' % (unit, bytes != '1' and 's' or '') + unit = '{}byte{}'.format(unit, bytes != '1' and 's' or '') else: - unit = '%s%s' % (base == 1024 and unit.upper() or unit, + unit = '{}{}'.format(base == 1024 and unit.upper() or unit, base == 1024 and 'iB' or 'B') - return '%s %s' % (bytes, unit) + return f'{bytes} {unit}' if bytes == 0: return bytes @@ -99,4 +101,6 @@ def filesize(bytes, format='auto1024'): elif format_len == 3: bytes = bytes >> (10 * (base - 1)) return bytes / 1024.0 + + register.filter(filesize) diff --git a/filer/templatetags/filermedia.py b/filer/templatetags/filermedia.py index 84a7f60f7..92f86360a 100644 --- a/filer/templatetags/filermedia.py +++ b/filer/templatetags/filermedia.py @@ -4,6 +4,7 @@ register = Library() +@register.simple_tag def filer_staticmedia_prefix(): """ Returns the string contained in the setting FILER_STATICMEDIA_PREFIX. @@ -13,4 +14,4 @@ def filer_staticmedia_prefix(): except ImportError: return '' return settings.FILER_STATICMEDIA_PREFIX -filer_staticmedia_prefix = register.simple_tag(filer_staticmedia_prefix) + diff --git a/filer/test_settings.py b/filer/test_settings.py index a31aa84cc..6d7bfcd19 100644 --- a/filer/test_settings.py +++ b/filer/test_settings.py @@ -60,6 +60,12 @@ CACHE_BACKEND = 'locmem:///' +FILER_FILE_MODELS = ( + 'filer.Image', + 'filer.Archive', + 'filer.File', +) + SECRET_KEY = 'secret' TEST_RUNNER = 'django.test.runner.DiscoverRunner' diff --git a/filer/tests/admin.py b/filer/tests/admin.py index 398bb7e29..120e507e8 100644 --- a/filer/tests/admin.py +++ b/filer/tests/admin.py @@ -23,9 +23,9 @@ from filer.tests.helpers import ( get_user_message, create_superuser, create_folder_structure, create_image, move_action, - move_to_clipboard_action, paste_clipboard_to_folder, get_dir_listing_url, + get_dir_listing_url, filer_obj_as_checkox, get_make_root_folder_url, enable_restriction, - move_single_file_to_clipboard_action, SettingsOverride + SettingsOverride ) from filer.utils.checktrees import TreeChecker from filer import settings as filer_settings @@ -246,57 +246,20 @@ def test_file_upload_no_duplicate_files(self, extra_headers={}): self.assertEqual(Clipboard.objects.count(), 1) clip = Clipboard.objects.get(id=1) # there is(or should be) just one clipboard self.assertEqual(clip.files.count(), 1) - # upload the same file again. This must fail since the - # clipboard can't contain two files with the same name + # upload the same file again with a fresh file handle. + # The stale clipboard entry should be replaced, not rejected. + file_obj2 = dj_files.File(open(self.filename, 'rb')) response = self.client.post( reverse('admin:filer-ajax_upload'), { 'Filename': self.image_name, - 'Filedata': file_obj, + 'Filedata': file_obj2, 'jsessionid': self.client.session.session_key, }, **extra_headers ) self.assertEqual(Image.objects.count(), 1) - self.assertIn('error', response.content.decode()) - errormsg = ClipboardAdmin.messages['already-exists'].format(self.image_name) - self.assertIn(errormsg, response.content.decode()) + self.assertNotIn('error', response.content.decode()) self.assertEqual(clip.files.count(), 1) - def test_paste_from_clipboard_no_duplicate_files(self): - first_folder = Folder.objects.create( - name='first', site=Site.objects.get(id=1)) - - def upload(): - file_obj = dj_files.File(open(self.filename, 'rb')) - response = self.client.post( - reverse('admin:filer-ajax_upload'), - {'Filename': self.image_name, 'Filedata': file_obj, - 'jsessionid': self.client.session.session_key, }) - return Image.objects.all().order_by('-id')[0] - - uploaded_image = upload() - self.assertEqual(uploaded_image.original_filename, self.image_name) - - def paste(uploaded_image): - # current user should have one clipboard created - clipboard = self.superuser.filer_clipboard - response = self.client.post( - reverse('admin:filer-paste_clipboard_to_folder'), - {'folder_id': first_folder.pk, - 'clipboard_id': clipboard.pk}) - return Image.objects.get(pk=uploaded_image.pk) - - pasted_image = paste(uploaded_image) - self.assertEqual(pasted_image.folder.pk, first_folder.pk) - # upload and paste the same image again - second_upload = upload() - # second paste failed due to name conflict - second_pasted_image = paste(second_upload) - clipboard = self.superuser.filer_clipboard - # file should remain in clipboard and should not be located in - # destination folder - self.assertEqual(clipboard.files.count(), 1) - self.assertEqual(second_pasted_image.folder, None) - def test_filer_ajax_upload_file(self): self.assertEqual(Image.objects.count(), 0) file_obj = dj_files.File(open(self.filename, 'rb')) @@ -477,24 +440,6 @@ def test_validate_no_duplicate_folders_on_move(self): bar = Folder.objects.get(pk=bar.pk) self.assertEqual(bar.parent.pk, root.pk) - def test_move_to_clipboard_action(self): - # TODO: Test recursive (files and folders tree) move - - self.assertEqual(self.src_folder.files.count(), 1) - self.assertEqual(self.dst_folder.files.count(), 0) - url = get_dir_listing_url(self.src_folder) - response = move_to_clipboard_action( - self.client, self.src_folder, [self.image_obj]) - self.assertEqual(self.src_folder.files.count(), 0) - self.assertEqual(self.dst_folder.files.count(), 0) - clipboard = Clipboard.objects.get(user=self.superuser) - self.assertEqual(clipboard.files.count(), 1) - request = HttpRequest() - tools.move_files_from_clipboard_to_folder( - request, clipboard, self.src_folder) - tools.discard_clipboard(clipboard) - self.assertEqual(clipboard.files.count(), 0) - self.assertEqual(self.src_folder.files.count(), 1) def test_files_set_public_action(self): return @@ -863,129 +808,7 @@ def test_move_site_folder_to_core_destination_folder(self): self.client, folders['bar'], f1, [folders['baz1']]) assert Folder.objects.filter(parent=f1).count() == 0 f1.delete(to_trash=False) - return folders, files - - def _get_clipboard_files(self): - clipboard, _ = Clipboard.objects.get_or_create( - user=self.user) - return clipboard.files - - def test_move_to_clipboard_from_root(self): - file_foo = File.objects.create( - original_filename='foo', folder=None, - file=dj_files.base.ContentFile(b'some data', name='data.bin')) - self.assertEqual( - self._get_clipboard_files().count(), 0) - - move_to_clipboard_action(self.client, 'unfiled', [file_foo]) - self.assertEqual( - self._get_clipboard_files().count(), 1) - - file_bar = File.objects.create( - original_filename='bar', folder=None, - file=dj_files.base.ContentFile(b'some data', name='data.bin')) - move_single_file_to_clipboard_action( - self.client, 'unfiled', [file_bar]) - self.assertEqual( - self._get_clipboard_files().count(), 2) - - def test_move_to_clipboard_from_site_folders(self): - foo = Folder.objects.create(name='foo', site=Site.objects.get(id=1)) - file_foo = File.objects.create( - original_filename='foo', folder=foo, - file=dj_files.base.ContentFile(b'some data', name='data.bin')) - self.assertEqual( - self._get_clipboard_files().count(), 0) - - move_to_clipboard_action(self.client, None, [foo]) - self.assertEqual( - self._get_clipboard_files().count(), 0) - - file_bar = File.objects.create( - original_filename='bar', folder=foo, - file=dj_files.base.ContentFile(b'some data', name='data.bin')) - move_to_clipboard_action(self.client, foo, [file_bar]) - self.assertEqual( - self._get_clipboard_files().count(), 1) - - file_baz = File.objects.create( - original_filename='baz', folder=foo, - file=dj_files.base.ContentFile(b'some data', name='data.bin')) - move_single_file_to_clipboard_action( - self.client, foo, [file_baz]) - self.assertEqual( - self._get_clipboard_files().count(), 2) - - def test_move_to_clipboard_from_core_folders(self): - foo = Folder.objects.create(name='foo', - folder_type=Folder.CORE_FOLDER) - file_foo = File.objects.create( - original_filename='foo_file', folder=foo, - file=dj_files.base.ContentFile(b'some data', name='data.bin')) - self.assertEqual( - self._get_clipboard_files().count(), 0) - response, _ = move_to_clipboard_action(self.client, None, [foo]) - self.assertEqual( - self._get_clipboard_files().count(), 0) - response, _ = move_to_clipboard_action(self.client, foo, [file_foo]) - # actions are not available if current view is core folder - self.assertEqual( - self._get_clipboard_files().count(), 0) - - response = move_single_file_to_clipboard_action( - self.client, foo, [file_foo]) - self.assertEqual( - self._get_clipboard_files().count(), 0) - - def test_move_from_clipboard_to_root(self): - bar_file = File.objects.create( - original_filename='bar_file', - file=dj_files.base.ContentFile(b'some data', name='data.bin')) - clipboard, _ = Clipboard.objects.get_or_create( - user=self.user) - clipboard.append_file(bar_file) - self.assertEqual( - self._get_clipboard_files().count(), 1) - response = paste_clipboard_to_folder( - self.client, None, clipboard) - self.assertEqual(response.status_code, 403) - self.assertEqual( - self._get_clipboard_files().count(), 1) - - def test_move_from_clipboard_to_core_folders(self): - bar_file = File.objects.create( - original_filename='bar_file', - file=dj_files.base.ContentFile(b'some data', name='data.bin')) - core_folder = Folder.objects.create( - name='foo', folder_type=Folder.CORE_FOLDER) - clipboard, _ = Clipboard.objects.get_or_create( - user=self.user) - clipboard.append_file(bar_file) - self.assertEqual( - self._get_clipboard_files().count(), 1) - response = paste_clipboard_to_folder( - self.client, core_folder, clipboard) - self.assertEqual(response.status_code, 403) - self.assertEqual( - self._get_clipboard_files().count(), 1) - def test_move_from_clipboard_to_site_folders(self): - bar_file = File.objects.create( - original_filename='bar_file', - file=dj_files.base.ContentFile(b'some data', name='data.bin')) - site_folder = Folder.objects.create( - name='foo', site=Site.objects.get(id=1)) - clipboard, _ = Clipboard.objects.get_or_create( - user=self.user) - clipboard.append_file(bar_file) - self.assertEqual( - self._get_clipboard_files().count(), 1) - response = paste_clipboard_to_folder( - self.client, site_folder, clipboard) - self.assertEqual(response.status_code, 302) - self.assertEqual( - self._get_clipboard_files().count(), 0) - self.assertEqual(len(site_folder.files), 1) def test_message_error_move_root_folder(self): site = Site.objects.get(id=1) @@ -1099,7 +922,6 @@ def test_copy_site_folder_to_core_destination_folder(self): messages = [str(m) for m in response.context['messages']] assert any("The selected destination was not valid" in m for m in messages),\ "Warning message not found in wrong copy response" - return folders, files def test_file_from_core_folder_is_unchangeable(self): f1 = Folder.objects.create(name='foo', folder_type=Folder.CORE_FOLDER) @@ -1317,38 +1139,6 @@ def request_move_root_folder(self): bar = Folder.objects.create(name='bar', site=site) return move_action(self.client, foo_root, bar, [foo]) - def test_move_to_clipboard_from_site_folders_for_site_admins(self): - self._make_user_site_admin() - self_cls = TestFolderTypePermissionLayerForRegularUser - super(self_cls, self).test_move_to_clipboard_from_site_folders() - - def test_move_to_clipboard_from_site_folders(self): - foo = Folder.objects.create(name='foo', site=Site.objects.get(id=1)) - file_foo = File.objects.create( - original_filename='foo', folder=foo, - file=dj_files.base.ContentFile(b'some data', name='data.bin')) - self.assertEqual( - self._get_clipboard_files().count(), 0) - - move_to_clipboard_action(self.client, None, [foo]) - self.assertEqual( - self._get_clipboard_files().count(), 0) - - file_bar = File.objects.create( - original_filename='bar', folder=foo, - file=dj_files.base.ContentFile(b'some data', name='data.bin')) - move_to_clipboard_action(self.client, foo, [file_bar]) - self.assertEqual( - self._get_clipboard_files().count(), 1) - - file_baz = File.objects.create( - original_filename='baz', folder=foo, - file=dj_files.base.ContentFile(b'some data', name='data.bin')) - move_single_file_to_clipboard_action( - self.client, foo, [file_baz]) - self.assertEqual( - self._get_clipboard_files().count(), 2) - def test_error_unallowed_restriction_change(self): self._make_user_site_admin() site = Site.objects.get(id=1) @@ -1917,49 +1707,6 @@ def test_make_subfolder_in_restricted(self): response = self.client.post(get_make_root_folder_url(), post_data) self.assertEqual(response.status_code, 403) - def test_move_from_clipboard_in_restricted(self): - bar_file = File.objects.create( - original_filename='bar_file', - file=dj_files.base.ContentFile(b'some data', name='data.bin')) - clipboard, _ = Clipboard.objects.get_or_create(user=self.user) - clipboard.append_file(bar_file) - response = paste_clipboard_to_folder( - self.client, self.folders['foo'], clipboard) - self.assertEqual(response.status_code, 403) - - def test_move_from_restricted_to_clipboard(self): - clipboard, _ = Clipboard.objects.get_or_create(user=self.user) - self.assertEqual(clipboard.files.count(), 0) - self.assertEqual(clipboard.clipboarditem_set.count(), 0) - - response, url = move_to_clipboard_action( - self.client, self.folders['foo'], [self.files['foo_file']]) - - clipboard, _ = Clipboard.objects.get_or_create(user=self.user) - self.assertEqual(clipboard.files.count(), 0) - self.assertEqual(clipboard.clipboarditem_set.count(), 0) - self.assertEqual( - File.objects.filter(folder=self.folders['foo']).count(), 2) - - response = move_single_file_to_clipboard_action( - self.client, self.folders['foo'], [self.files['foo_file']]) - - clipboard, _ = Clipboard.objects.get_or_create(user=self.user) - self.assertEqual(clipboard.files.count(), 0) - self.assertEqual(clipboard.clipboarditem_set.count(), 0) - self.assertEqual( - File.objects.filter(folder=self.folders['foo']).count(), 2) - - def test_move_restricted_to_clipboard(self): - bar = Folder.objects.create( - name='bar', site=self.site) - bar_file = File.objects.create( - original_filename='bar_file', restricted=True, - file=dj_files.base.ContentFile(b'some data', name='data.bin'), folder=bar) - response = move_single_file_to_clipboard_action( - self.client, bar, [bar_file]) - self.assertEqual(response.status_code, 403) - def test_move_in_restricted(self): bar = Folder.objects.create(name='bar', site=self.site) bar_subfolder = Folder.objects.create( @@ -2232,18 +1979,6 @@ def test_extract_files_shared_folder(self): [filer_obj_as_checkox(bar_zippy)]}) assert Folder.objects.get(id=self.bar.id).files.count() == 1 - def test_move_to_clipboard_from_shared_folder(self): - bar_file = File.objects.create( - original_filename='bar_file.txt', folder=self.bar, - file=dj_files.base.ContentFile(b'file', name='file.bin')) - response = move_to_clipboard_action( - self.client, self.bar, [bar_file]) - self.assertEqual(Clipboard.objects.all().get().files.count(), 0) - move_single_file_to_clipboard_action( - self.client, self.bar, [bar_file]) - self.assertEqual(Clipboard.objects.all().get().files.count(), 0) - - class TestSharedFolderFunctionality(TestCase): """ * only root folders can be shared diff --git a/filer/tests/foo_file.jpg b/filer/tests/foo_file.jpg new file mode 100644 index 000000000..9e4936f71 Binary files /dev/null and b/filer/tests/foo_file.jpg differ diff --git a/filer/thumbnail_processors.py b/filer/thumbnail_processors.py index a06b4ef73..04fc43789 100644 --- a/filer/thumbnail_processors.py +++ b/filer/thumbnail_processors.py @@ -1,16 +1,18 @@ -#-*- coding: utf-8 -*- import re + +from easy_thumbnails import processors + +from .settings import FILER_SUBJECT_LOCATION_IMAGE_DEBUG, FILER_WHITESPACE_COLOR + + try: - from PIL import Image - from PIL import ImageDraw + from PIL import Image, ImageDraw except ImportError: try: import Image import ImageDraw except ImportError: raise ImportError("The Python Imaging Library was not found.") -from easy_thumbnails import processors -from filer.settings import FILER_SUBJECT_LOCATION_IMAGE_DEBUG RE_SUBJECT_LOCATION = re.compile(r'^(\d+),(\d+)$') @@ -30,12 +32,13 @@ def normalize_subject_location(subject_location): def scale_and_crop_with_subject_location(im, size, subject_location=False, - crop=False, upscale=False, **kwargs): + zoom=None, crop=False, upscale=False, + **kwargs): """ Like ``easy_thumbnails.processors.scale_and_crop``, but will use the coordinates in ``subject_location`` to make sure that that part of the image is in the center or at least somewhere on the cropped image. - Please not that this does *not* work correctly if the image has been + Please note that this does *not* work correctly if the image has been resized by a previous processor (e.g ``autocrop``). ``crop`` needs to be set for this to work, but any special cropping @@ -44,15 +47,15 @@ def scale_and_crop_with_subject_location(im, size, subject_location=False, subject_location = normalize_subject_location(subject_location) if not (subject_location and crop): # use the normal scale_and_crop - return processors.scale_and_crop(im, size, crop=crop, + return processors.scale_and_crop(im, size, zoom=zoom, crop=crop, upscale=upscale, **kwargs) # for here on we have a subject_location and cropping is on # --snip-- this is a copy and paste of the first few # lines of ``scale_and_crop`` - source_x, source_y = [float(v) for v in im.size] - target_x, target_y = [float(v) for v in size] + source_x, source_y = (float(v) for v in im.size) + target_x, target_y = (float(v) for v in size) if crop or not target_x or not target_y: scale = max(target_x / source_x, target_y / source_y) @@ -65,16 +68,27 @@ def scale_and_crop_with_subject_location(im, size, subject_location=False, elif not target_y: target_y = source_y * scale + if zoom: + if not crop: + target_x = round(source_x * scale) + target_y = round(source_y * scale) + scale *= (100 + int(zoom)) / 100.0 + if scale < 1.0 or (scale > 1.0 and upscale): - im = im.resize((int(source_x * scale), int(source_y * scale)), - resample=Image.ANTIALIAS) + try: + im = im.resize((int(source_x * scale), int(source_y * scale)), + resample=Image.LANCZOS) + except AttributeError: # pragma: no cover + im = im.resize((int(source_x * scale), int(source_y * scale)), + resample=Image.ANTIALIAS) + # --endsnip-- begin real code # =============================== # subject location aware cropping # =============================== # res_x, res_y: the resolution of the possibly already resized image - res_x, res_y = [float(v) for v in im.size] + res_x, res_y = (float(v) for v in im.size) # subj_x, subj_y: the position of the subject (maybe already re-scaled) subj_x = res_x * float(subject_location[0]) / source_x @@ -110,10 +124,37 @@ def scale_and_crop_with_subject_location(im, size, subject_location=False, if ex or ey: crop_box = ((int(tex), int(tey), int(tfx), int(tfy))) if FILER_SUBJECT_LOCATION_IMAGE_DEBUG: - # draw elipse on focal point for Debugging + # draw ellipse on focal point for Debugging draw = ImageDraw.Draw(im) esize = 10 draw.ellipse(((subj_x - esize, subj_y - esize), (subj_x + esize, subj_y + esize)), outline="#FF0000") im = im.crop(crop_box) return im + + +def whitespace(image, size, whitespace=False, whitespace_color=None, **kwargs): + if not whitespace: + return image + + if whitespace_color is None: + whitespace_color = FILER_WHITESPACE_COLOR + if whitespace_color is None: + whitespace_color = '#fff' + + old_image = image + source_x, source_y = image.size + target_x, target_y = size + + image = Image.new('RGBA', (target_x, target_y), whitespace_color) + if source_x < target_x and source_y < target_y: # whitespace all around + image.paste(old_image, ( + (target_x - source_x) / 2, (target_y - source_y) / 2)) + elif source_x < target_x: # whitespace on top and bottom only + image.paste(old_image, ((target_x - source_x) / 2, 0)) + elif source_y < target_y: # whitespace on sides only + image.paste(old_image, (0, (target_y - source_y) / 2)) + else: # no whitespace needed + image = old_image + + return image diff --git a/filer/urls.py b/filer/urls.py new file mode 100644 index 000000000..f8fccf4a1 --- /dev/null +++ b/filer/urls.py @@ -0,0 +1,13 @@ +from django.urls import path + +from . import settings as filer_settings +from . import views + + +urlpatterns = [ + path( + filer_settings.FILER_CANONICAL_URL + '//', + views.canonical, + name='canonical' + ), +] diff --git a/filer/utils/cdn.py b/filer/utils/cdn.py index cdcbcba81..cd4086b3d 100644 --- a/filer/utils/cdn.py +++ b/filer/utils/cdn.py @@ -12,6 +12,9 @@ def get_cdn_url(file_obj, url): if cdn_domain is None: return url + if file_obj.modified_at is None: + return url + invalidated_at = file_obj.modified_at + datetime.timedelta( seconds=filer_settings.CDN_INVALIDATION_TIME) # django uses django.utils.timezone.now() to set value for diff --git a/filer/utils/compatibility.py b/filer/utils/compatibility.py new file mode 100644 index 000000000..0c7fd5290 --- /dev/null +++ b/filer/utils/compatibility.py @@ -0,0 +1,33 @@ +from django.utils.functional import keep_lazy +from django.utils.text import Truncator, format_lazy + + +def string_concat(*strings): + return format_lazy('{}' * len(strings), *strings) + + +def truncate_words(s, num, end_text='...'): + # truncate_words was removed in Django 1.5. + truncate = end_text and ' %s' % end_text or '' + return Truncator(s).words(num, truncate=truncate) + + +truncate_words = keep_lazy(truncate_words, str) + + +def get_delete_permission(opts): + from django.contrib.auth import get_permission_codename + return '{}.{}'.format(opts.app_label, get_permission_codename('delete', opts)) + + +try: + from PIL import ExifTags as PILExifTags + from PIL import Image as PILImage + from PIL import ImageDraw as PILImageDraw +except ImportError: + try: + import ExifTags as PILExifTags # noqa + import Image as PILImage # noqa + import ImageDraw as PILImageDraw # noqa + except ImportError: + raise ImportError("The Python Imaging Library was not found.") diff --git a/filer/utils/filer_easy_thumbnails.py b/filer/utils/filer_easy_thumbnails.py index 2ee1f7d0d..00b2f4b43 100644 --- a/filer/utils/filer_easy_thumbnails.py +++ b/filer/utils/filer_easy_thumbnails.py @@ -1,8 +1,9 @@ -#-*- coding: utf-8 -*- -from easy_thumbnails.files import Thumbnailer import os import re +from easy_thumbnails.files import Thumbnailer + + # match the source filename using `__` as the seperator. ``opts_and_ext`` is non # greedy so it should match the last occurence of `__`. # in ``ThumbnailerNameMixin.get_thumbnail_name`` we ensure that there is no `__` @@ -17,20 +18,24 @@ def thumbnail_to_original_filename(thumbnail_name): return None -class ThumbnailerNameMixin(object): +class ThumbnailerNameMixin: thumbnail_basedir = '' thumbnail_subdir = '' thumbnail_prefix = '' - def get_thumbnail_name(self, thumbnail_options, transparent=False, - high_resolution=False): + def get_thumbnail_name(self, thumbnail_options, transparent=False): """ A version of ``Thumbnailer.get_thumbnail_name`` that produces a reproducible thumbnail name that can be converted back to the original filename. """ path, source_filename = os.path.split(self.name) - if transparent: + source_extension = os.path.splitext(source_filename)[1][1:].lower() + preserve_extensions = self.thumbnail_preserve_extensions + if preserve_extensions is True or source_extension == 'svg' or \ + isinstance(preserve_extensions, (list, tuple)) and source_extension in preserve_extensions: + extension = source_extension + elif transparent: extension = self.thumbnail_transparency_extension else: extension = self.thumbnail_extension @@ -38,35 +43,36 @@ def get_thumbnail_name(self, thumbnail_options, transparent=False, thumbnail_options = thumbnail_options.copy() size = tuple(thumbnail_options.pop('size')) + initial_opts = ['{}x{}'.format(*size)] quality = thumbnail_options.pop('quality', self.thumbnail_quality) - initial_opts = ['%sx%s' % size, 'q%s' % quality] + if extension == 'jpg': + initial_opts.append(f'q{quality}') + elif extension == 'svg': + thumbnail_options.pop('subsampling', None) + thumbnail_options.pop('upscale', None) opts = list(thumbnail_options.items()) opts.sort() # Sort the options so the file name is consistent. - opts = ['%s' % (v is not True and '%s-%s' % (k, v) or k) + opts = ['{}'.format(v is not True and f'{k}-{v}' or k) for k, v in opts if v] - all_opts = '_'.join(initial_opts + opts) basedir = self.thumbnail_basedir subdir = self.thumbnail_subdir - #make sure our magic delimiter is not used in all_opts + # make sure our magic delimiter is not used in all_opts all_opts = all_opts.replace('__', '_') - if high_resolution: - all_opts += '@2x' - filename = '%s__%s.%s' % (source_filename, all_opts, extension) + filename = f'{source_filename}__{all_opts}.{extension}' return os.path.join(basedir, path, subdir, filename) -class ActionThumbnailerMixin(object): +class ActionThumbnailerMixin: thumbnail_basedir = '' thumbnail_subdir = '' thumbnail_prefix = '' - def get_thumbnail_name(self, thumbnail_options, transparent=False, - high_resolution=False): + def get_thumbnail_name(self, thumbnail_options, transparent=False): """ A version of ``Thumbnailer.get_thumbnail_name`` that returns the original filename to resize. @@ -85,7 +91,7 @@ def thumbnail_exists(self, thumbnail_name): class FilerThumbnailer(ThumbnailerNameMixin, Thumbnailer): def __init__(self, *args, **kwargs): self.thumbnail_basedir = kwargs.pop('thumbnail_basedir', '') - super(FilerThumbnailer, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) class FilerActionThumbnailer(ActionThumbnailerMixin, Thumbnailer): diff --git a/filer/utils/files.py b/filer/utils/files.py index 74d1c9d3e..07c3cb74f 100644 --- a/filer/utils/files.py +++ b/filer/utils/files.py @@ -1,53 +1,171 @@ -#-*- coding: utf-8 -*- -import os import mimetypes +import os +import uuid +from django.http.multipartparser import ChunkIter, SkipFile, StopFutureHandlers, StopUpload, exhaust +from django.template.defaultfilters import slugify as slugify_django +from django.utils.encoding import force_str from django.utils.text import get_valid_filename as get_valid_filename_django -from django.template.defaultfilters import slugify -from django.core.files.uploadedfile import SimpleUploadedFile - -from filer.settings import FILER_FILE_MODELS -from filer.utils.loader import load_object -from filer.utils.is_ajax import is_ajax -import filetype - class UploadException(Exception): pass def handle_upload(request): - if not request.method == "POST": - raise UploadException("AJAX request not valid: must be POST") - if is_ajax(request): + if not request.method == 'POST': + raise UploadException("XMLHttpRequest not valid: must be POST") + if request.headers.get('x-requested-with') == 'XMLHttpRequest': # the file is stored raw in the request is_raw = True filename = request.GET.get('qqfile', False) or request.GET.get('filename', False) or '' - if hasattr(request, 'body'): - # raw_post_data was depreciated in django 1.4: - # https://docs.djangoproject.com/en/dev/releases/1.4/#httprequest-raw-post-data-renamed-to-httprequest-body - data = request.body - elif hasattr(request, 'raw_post_data'): - # fallback for django 1.3 - data = request.raw_post_data + + try: + content_length = int(request.headers['content-length']) + except (IndexError, TypeError, ValueError): + content_length = None + + if content_length < 0: + # This means we shouldn't continue...raise an error. + raise UploadException("Invalid content length: %r" % content_length) + + mime_type = mimetypes.guess_type(filename)[0] or 'application/octet-stream' + + upload_handlers = request.upload_handlers + for handler in upload_handlers: + handler.handle_raw_input(request, + request.META, + content_length, + None, + None) + pass + + # For compatibility with low-level network APIs (with 32-bit integers), + # the chunk size should be < 2^31, but still divisible by 4. + possible_sizes = [x.chunk_size for x in upload_handlers if x.chunk_size] + chunk_size = min([2 ** 31 - 4] + possible_sizes) + + stream = ChunkIter(request, chunk_size) + counters = [0] * len(upload_handlers) + + try: + for handler in upload_handlers: + try: + handler.new_file(None, filename, + None, content_length, None) + except StopFutureHandlers: + break + + for chunk in stream: + for i, handler in enumerate(upload_handlers): + chunk_length = len(chunk) + chunk = handler.receive_data_chunk(chunk, + counters[i]) + counters[i] += chunk_length + if chunk is None: + # If the chunk received by the handler is None, then don't continue. + break + + except SkipFile: + # Just use up the rest of this file... + exhaust(stream) + except StopUpload as e: + if not e.connection_reset: + exhaust(request) else: - raise UploadException("Request is not valid: there is no request body.") - mime_type = mimetypes.guess_type(filename)[0] or "text/plain" - upload = SimpleUploadedFile(name=filename, content=data, content_type=mime_type) + # Make sure that the request data is all fed + exhaust(request) + + # Signal that the upload has completed. + for handler in upload_handlers: + retval = handler.upload_complete() + if retval: + break + + for i, handler in enumerate(upload_handlers): + file_obj = handler.file_complete(counters[i]) + if file_obj: + upload = file_obj + break else: if len(request.FILES) == 1: - # FILES is a dictionary in Django but Ajax Upload gives the uploaded file an - # ID based on a random number, so it cannot be guessed here in the code. - # Rather than editing Ajax Upload to pass the ID in the querystring, note that - # each upload is a separate request so FILES should only have one entry. - # Thus, we can just grab the first (and only) value in the dict. - is_raw = False - upload = list(request.FILES.values())[0] - filename = upload.name + upload, filename, is_raw, mime_type = handle_request_files_upload(request) + else: + raise UploadException("XMLHttpRequest request not valid: Bad Upload") + return upload, filename, is_raw, mime_type + + +def handle_request_files_upload(request): + """ + Handle request.FILES if len(request.FILES) == 1. + Returns tuple(upload, filename, is_raw, mime_type) where upload is file itself. + """ + # FILES is a dictionary in Django but Ajax Upload gives the uploaded file + # an ID based on a random number, so it cannot be guessed here in the code. + # Rather than editing Ajax Upload to pass the ID in the querystring, + # note that each upload is a separate request so FILES should only + # have one entry. + # Thus, we can just grab the first (and only) value in the dict. + is_raw = False + upload = list(request.FILES.values())[0] + filename = upload.name + _, iext = os.path.splitext(filename) + mime_type = upload.content_type.lower() + extensions = mimetypes.guess_all_extensions(mime_type) + if mime_type != 'application/octet-stream' and extensions and iext.lower() not in extensions: + # The browser's content type doesn't match the file extension. + # Check if the file extension has its own known MIME type (e.g. + # browser sends image/webp for a .jpg file, or application/x-zip-compressed + # for a .zip file). + guessed_type = mimetypes.guess_type(filename)[0] + if guessed_type: + # Extension has a known type – use it instead of rejecting. + mime_type = guessed_type + elif iext: + # Extension exists but is not recognized by Python's mimetypes + # (e.g. .jfif). Trust the browser's content type rather than + # rejecting the upload. + pass else: - raise UploadException("AJAX request not valid: Bad Upload") - return upload, filename, is_raw + # No file extension at all – trust the browser's content type. + pass + elif not extensions and mime_type != 'application/octet-stream': + # Browser sent an unrecognized MIME type; try to guess from filename + guessed_type = mimetypes.guess_type(filename)[0] + if guessed_type: + mime_type = guessed_type + return upload, filename, is_raw, mime_type + + +def slugify(string): + return slugify_django(force_str(string)) + + +def _ensure_safe_length(filename, max_length=155, random_suffix_length=16): + """ + Ensures that the filename does not exceed the maximum allowed length. + If it does, the function truncates the filename and appends a random hexadecimal + suffix of length `random_suffix_length` to ensure uniqueness and compliance with + database constraints - even after markers for a thumbnail are added. + + Parameters: + filename (str): The filename to check. + max_length (int): The maximum allowed length for the filename. + random_suffix_length (int): The length of the random suffix to append. + + Returns: + str: The safe filename. + + + Reference issue: https://github.com/django-cms/django-filer/issues/1270 + """ + + if len(filename) <= max_length: + return filename + + keep_length = max_length - random_suffix_length + random_suffix = uuid.uuid4().hex[:random_suffix_length] + return filename[:keep_length] + random_suffix def get_valid_filename(s): @@ -55,42 +173,61 @@ def get_valid_filename(s): like the regular get_valid_filename, but also slugifies away umlauts and stuff. """ - if not s: - return '' s = get_valid_filename_django(s) filename, ext = os.path.splitext(s) filename = slugify(filename) ext = slugify(ext) if ext: - return "%s.%s" % (filename, ext) + valid_filename = "{}.{}".format(filename, ext) else: - return "%s" % (filename,) + valid_filename = "{}".format(filename) + + # Ensure the filename meets the maximum length requirements. + return _ensure_safe_length(valid_filename) + +# PBS-specific: file type matching and filename utilities def matching_file_subtypes(filename, file_pointer, request): """ Returns a list of valid subtypes for a given file. """ - types = list(map(load_object, FILER_FILE_MODELS)) + from ..settings import FILER_FILE_MODELS + from .loader import load_model + + # If request/mime_type is None, try to guess from filename + mime_type = request + if mime_type is None and filename: + import mimetypes + mime_type = mimetypes.guess_type(filename)[0] + + types = [] + for model_path in FILER_FILE_MODELS: + types.append(load_model(model_path)) def _match_subtype(subtype): - is_match = subtype.matches_file_type(filename, file_pointer, request) - return is_match + return subtype.matches_file_type(filename, file_pointer, mime_type) type_matches = list(filter(_match_subtype, types)) return type_matches def truncate_filename(upload, maxlen=None): """ - Return truncated filename - Pre-extension filename will be less than or equals maxlen(if passed) + Return truncated filename. + Pre-extension filename will be less than or equals maxlen (if passed). """ + try: + import filetype as filetype_lib + except ImportError: + filetype_lib = None + title, extension = os.path.splitext(upload.name) if not extension.lstrip('.'): - guessed = filetype.guess_extension(upload) or '' - # filetype reads bytes from the upload; seek back for later use - if hasattr(upload, 'seek'): - upload.seek(0) + guessed = '' + if filetype_lib is not None: + guessed = filetype_lib.guess_extension(upload) or '' + if hasattr(upload, 'seek'): + upload.seek(0) else: guessed = '' filename = '{title}.{ext}'.format(title=title[:maxlen], diff --git a/filer/utils/generate_filename.py b/filer/utils/generate_filename.py index 14b6f8874..5d107ce35 100644 --- a/filer/utils/generate_filename.py +++ b/filer/utils/generate_filename.py @@ -1,20 +1,28 @@ -import datetime import os -import filer - -from filer.utils.files import get_valid_filename +import uuid from django.core.exceptions import ObjectDoesNotExist from django.core.files.uploadedfile import UploadedFile -from django.utils.encoding import smart_str +from django.utils.encoding import force_str +from django.utils.timezone import now + +import filer + +from .files import get_valid_filename def by_date(instance, filename): - datepart = str(datetime.datetime.now().strftime(smart_str("%Y/%m/%d"))) + datepart = force_str(now().strftime("%Y/%m/%d")) return os.path.join(datepart, get_valid_filename(filename)) -class prefixed_factory(object): +def randomized(instance, filename): + uuid_str = str(uuid.uuid4()) + return os.path.join(uuid_str[0:2], uuid_str[2:4], uuid_str, + get_valid_filename(filename)) + + +class prefixed_factory: def __init__(self, upload_to, prefix): self.upload_to = upload_to self.prefix = prefix @@ -29,6 +37,8 @@ def __call__(self, instance, filename): return os.path.join(self.prefix, upload_to_str) +# PBS-specific: path-based filename generation + def _is_in_memory(file_): return isinstance(file_, UploadedFile) @@ -61,8 +71,6 @@ def by_path(instance, filename): def get_trash_path(instance): path = [filer.settings.FILER_TRASH_PREFIX] - # enforce uniqueness by using file's pk path.append("%s" % instance.pk) - # add folder path path.append(instance.pretty_logical_path.strip('/')) return os.path.join(*path) diff --git a/filer/utils/is_ajax.py b/filer/utils/is_ajax.py deleted file mode 100644 index 63166d793..000000000 --- a/filer/utils/is_ajax.py +++ /dev/null @@ -1,3 +0,0 @@ -def is_ajax(request): - """Checks if a request is ajax.""" - return request.headers.get('x-requested-with') == 'XMLHttpRequest' diff --git a/filer/utils/loader.py b/filer/utils/loader.py index 89a841ae3..b75f8f4d6 100644 --- a/filer/utils/loader.py +++ b/filer/utils/loader.py @@ -1,4 +1,3 @@ -#-*- coding: utf-8 -*- """ This function is snatched from https://github.com/ojii/django-load/blob/3058ab9d9d4875589638cc45e84b59e7e1d7c9c3/django_load/core.py#L49 @@ -8,6 +7,7 @@ or method. """ + from importlib import import_module @@ -30,13 +30,20 @@ def load_object(import_path): return import_path if '.' not in import_path: raise TypeError( - "'import_path' argument to 'django_load.core.load_object' " +\ - "must contain at least one dot.") + "'import_path' argument to 'django_load.core.load_object' must " + "contain at least one dot.") module_name, object_name = import_path.rsplit('.', 1) module = import_module(module_name) return getattr(module, object_name) +def load_model(model_name): + from django.apps import apps + + model_name_tuple = model_name.split('.') + return apps.get_model(*model_name_tuple) + + def storage_factory(klass, location, base_url): """ This factory returns an instance of the storage class provided. diff --git a/filer/utils/model_label.py b/filer/utils/model_label.py index f488cf67f..93cc66809 100644 --- a/filer/utils/model_label.py +++ b/filer/utils/model_label.py @@ -1,15 +1,17 @@ def get_model_label(model): """ Take a model class or model label and return its model label. + >>> get_model_label(MyModel) "myapp.MyModel" + >>> get_model_label("myapp.MyModel") "myapp.MyModel" """ if isinstance(model, str): return model else: - return "%s.%s" % ( + return "{}.{}".format( model._meta.app_label, model.__name__ ) diff --git a/filer/utils/pil_exif.py b/filer/utils/pil_exif.py index 0d0077b77..f0280e4aa 100644 --- a/filer/utils/pil_exif.py +++ b/filer/utils/pil_exif.py @@ -1,35 +1,29 @@ -#-*- coding: utf-8 -*- -try: - from PIL import Image - from PIL import ExifTags -except ImportError: - try: - import Image - import ExifTags - except ImportError: - raise ImportError("The Python Imaging Library was not found.") +from django.core.files.storage import default_storage as storage + +from ..utils.compatibility import PILExifTags, PILImage def get_exif(im): try: exif_raw = im._getexif() or {} - except: + except Exception: + # Not available? Return empty dict return {} ret = {} for tag, value in list(exif_raw.items()): - decoded = ExifTags.TAGS.get(tag, tag) + decoded = PILExifTags.TAGS.get(tag, tag) ret[decoded] = value return ret def get_exif_for_file(file_obj): - im = Image.open(file_obj, 'r') + im = PILImage.open(storage.open(file_obj.name), 'r') return get_exif(im) def get_subject_location(exif_data): try: r = (int(exif_data['SubjectLocation'][0]), int(exif_data['SubjectLocation'][1]),) - except: + except KeyError: r = None return r diff --git a/filer/utils/recursive_dictionary.py b/filer/utils/recursive_dictionary.py index cd49eaa3b..01ad34be0 100644 --- a/filer/utils/recursive_dictionary.py +++ b/filer/utils/recursive_dictionary.py @@ -1,5 +1,3 @@ -#-*- coding: utf-8 -*- - # https://gist.github.com/114831 # recursive_dictionary.py # Created 2009-05-20 by Jannis Andrija Schnitzer. @@ -24,8 +22,10 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. + __author__ = 'jannis@itisme.org (Jannis Andrija Schnitzer)' + class RecursiveDictionary(dict): """RecursiveDictionary provides the methods rec_update and iter_rec_update that can be used to update member dictionaries rather than overwriting @@ -41,11 +41,11 @@ def rec_update(self, other, **third): {'foo': {'baz': 36, 'bar': 42}} """ try: - iterator = list(other.items()) + iterator = other.items() except AttributeError: iterator = other self.iter_rec_update(iterator) - self.iter_rec_update(list(third.items())) + self.iter_rec_update(third.items()) def iter_rec_update(self, iterator): for (key, value) in iterator: @@ -65,7 +65,7 @@ class RecursiveDictionaryWithExcludes(RecursiveDictionary): """ def __init__(self, *args, **kwargs): self.rec_excluded_keys = kwargs.pop('rec_excluded_keys', ()) - super(RecursiveDictionaryWithExcludes, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) def iter_rec_update(self, iterator): for (key, value) in iterator: @@ -76,4 +76,4 @@ def iter_rec_update(self, iterator): rec_excluded_keys=self.rec_excluded_keys) self[key].rec_update(value) else: - self[key] = value \ No newline at end of file + self[key] = value diff --git a/filer/validation.py b/filer/validation.py new file mode 100644 index 000000000..4a34d85d1 --- /dev/null +++ b/filer/validation.py @@ -0,0 +1,115 @@ +import typing + +from django.apps import apps +from django.contrib.auth import get_user_model +from django.core.exceptions import ValidationError +from django.utils.translation import gettext as _ + + +User = get_user_model() # Needed for typing + + +class FileValidationError(ValidationError): + pass + + +def deny(file_name: str, file: typing.IO, owner: User, mime_type: str) -> None: + file_type = file_name.rsplit(".")[-1] + if file_type == file_name: + raise FileValidationError( + _('File "{file_name}": Upload denied by site security policy').format(file_name=file_name) + ) + raise FileValidationError( + _('File "{file_name}": {file_type} upload denied by site security policy').format( + file_name=file_name, + file_type=file_type.upper() + ) + ) + + +def deny_html(file_name: str, file: typing.IO, owner: User, mime_type: str) -> None: + """Simple validator that denies all files. Separate for HTML since .html and .htm are both + common suffixes for text/html files.""" + raise FileValidationError( + _('File "{file_name}": HTML upload denied by site security policy').format(file_name=file_name) + ) + + +TRIGGER_XSS_THREAD = ( + # Part 1: Event attributes that take js code as values + # See https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/Events + b"onbegin=", b"onend=", b"onrepeat=", + b"onabort=", b"onerror=", b"onresize=", b"onscroll=", b"onunload=", + b"oncopy=", b"oncut=", b"onpaste=", + b"oncancel=", b"oncanplay=", b"oncanplaythrough=", b"onchange=", b"onclick=", b"onclose=", b"oncuechange=", b"ondblclick=", + b"ondrag=", b"ondragend=", b"ondragenter=", b"ondragleave=", b"ondragover=", b"ondragstart=", b"ondrop=", + b"ondurationchange=", b"onemptied=", b"onended=", b"onerror=", b"onfocus=", b"oninput=", b"oninvalid=", + b"onkeydown=", b"onkeypress=", b"onkeyup=", b"onload=", b"onloadeddata=", b"onloadedmetadata=", b"onloadstart=", + b"onmousedown=", b"onmouseenter=", b"onmouseleave=", b"onmousemove=", b"onmouseout=", b"onmouseover=", b"onmouseup=", + b"onmousewheel=", b"onpause=", b"onplay=", b"onplaying=", b"onprogress=", b"onratechange=", b"onreset=", b"onresize=", + b"onscroll=", b"onseeked=", b"onseeking=", b"onselect=", b"onshow=", b"onstalled=", b"onsubmit=", b"onsuspend=", + b"ontimeupdate=", b"ontoggle==", b"onvolumechange==", b"onwaiting=", + b"onactivate=", b"onfocusin=", b"onfocusout=", +) + ( + # Part 2: + # Reject base64 obfuscated content + b";base64,", +) + ( + # Part 3: Obvious scripts + # Reject direct tags or javascript: uri + b" None: + """SVG files must not contain script tags or javascript hrefs. + This might be too strict but avoids parsing the xml""" + content = file.read().lower() + if any(map(lambda x: x in content, TRIGGER_XSS_THREAD)): + # If any element of TRIGGER_XSS_THREAD is found in file, raise FileValidationError + raise FileValidationError( + _('File "{file_name}": Rejected due to potential cross site scripting vulnerability') + .format(file_name=file_name) + ) + + +def sanitize_svg(file_name: str, file: typing.IO, owner: User, mime_type: str) -> None: + from easy_thumbnails.VIL.Image import Image + from reportlab.graphics import renderSVG + from svglib.svglib import svg2rlg + drawing = svg2rlg(file) + if not drawing: + raise FileValidationError( + _('File "{file_name}": SVG file format not recognized') + .format(file_name=file_name) + ) + image = Image(size=(drawing.width, drawing.height)) + renderSVG.draw(drawing, image.canvas) + xml = image.canvas.svg.toxml(encoding="UTF-8") # Removes non-graphic nodes -> sanitation + file.seek(0) # Rewind file + file.write(xml) # write to binary file with utf-8 encoding + + +def validate_upload(file_name: str, file: typing.IO, owner: User, mime_type: str) -> None: + """Actual validation: Call all validators for the given mime type. The app config reads + the validators from the settings and replaces dotted paths by callables.""" + + config = apps.get_app_config("filer") + + # First, check white list if provided + if config.MIME_TYPE_WHITELIST: + # FILER_MIME_TYPE_WHITELIST restricts the allowed mime types to, e.g., "image/*" or "text/plain" + for allowed_mime_type in config.MIME_TYPE_WHITELIST: + if mime_type == allowed_mime_type: + break + elif "/" in allowed_mime_type and [mime_type.split("/")[0], "*"] == allowed_mime_type.split("/", 1): + break + else: + # No match found <=> no break in for loop? Deny file + deny(file_name, file, owner, mime_type) + + # Second, check upload validators + if mime_type in config.FILE_VALIDATORS: + for validator in config.FILE_VALIDATORS[mime_type]: + validator(file_name, file, owner, mime_type) diff --git a/filer/views.py b/filer/views.py index 9bf2a04a6..8e23fe03b 100755 --- a/filer/views.py +++ b/filer/views.py @@ -1,4 +1,9 @@ -#-*- coding: utf-8 -*- +from django.http import Http404 +from django.shortcuts import get_object_or_404, redirect + + +# --- PBS-specific view helpers --- + def popup_status(request): return ('_popup' in request.GET or '_popup' in request.POST or 'pop' in request.GET or 'pop' in request.POST) @@ -21,12 +26,14 @@ def selectfolder_param(request, separator="&"): else: return "" + def current_site_param(request, separator="&"): current_site = get_param_from_request(request, 'current_site') if current_site: return '%scurrent_site=%s' % (separator, current_site) return "" + def file_type_param(request, separator="&"): param = get_param_from_request(request, 'file_type') if param: @@ -36,3 +43,16 @@ def file_type_param(request, separator="&"): def get_param_from_request(request, param, default=None): return request.POST.get(param) or request.GET.get(param) or default + + +# --- Upstream canonical view --- + +def canonical(request, uploaded_at, file_id): + """ + Redirect to the current url of a public file + """ + from .models import File + filer_file = get_object_or_404(File, pk=file_id, is_public=True) + if (not filer_file.file or int(uploaded_at) != filer_file.canonical_time): + raise Http404('No %s matches the given query.' % File._meta.object_name) + return redirect(filer_file.url) diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..30d500838 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1492 @@ +{ + "name": "django-filer", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "django-filer", + "version": "1.0.0", + "dependencies": { + "dropzone": "^5.9.3", + "mediator-js": "^0.11.0" + }, + "devDependencies": { + "webpack": "^5.90.0", + "webpack-cli": "^5.1.4" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz", + "integrity": "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.32", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.32.tgz", + "integrity": "sha512-wbPvpyjJPC0zdfdKXxqEL3Ea+bOMD/87X4lftiJkkaBiuG6ALQy1SLmEd7BSmVCuwCQsBrCamgBoLyfFDD1EPg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001793", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", + "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/dropzone": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/dropzone/-/dropzone-5.9.3.tgz", + "integrity": "sha512-Azk8kD/2/nJIuVPK+zQ9sjKMRIpRvNyqn9XwbBHNq+iNuSccbJS6hwm1Woy0pMST0erSo0u4j+KJaodndDk4vA==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.363", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.363.tgz", + "integrity": "sha512-VjUKPyWzGnT1fujlkEGC/BvN70Hh70KXtAqcmniXviYlJC/ivcT+BWGPyxWVbJZLfvtKR6dqg1L7T7pgAMBtWA==", + "dev": true, + "license": "ISC" + }, + "node_modules/enhanced-resolve": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.22.0.tgz", + "integrity": "sha512-xYcDWrpELkFzz9SpZ3PlI6Eu6eD93Yf0WLDRxikGhWJ3MAir2SNZTIVCVZqZ/NUyx8AdMc2gT9C0gPiw18kG+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/envinfo": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.21.0.tgz", + "integrity": "sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==", + "dev": true, + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-runner": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", + "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mediator-js": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/mediator-js/-/mediator-js-0.11.0.tgz", + "integrity": "sha512-ehVcM3bSkr79E5yXUIyOPxw9xqhmvtTMkws5+lT8vl52awVkL/8rfDd8njmVxNldGmqKvFWSOvfppxG2AHM0TQ==", + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.46", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.46.tgz", + "integrity": "sha512-GYVXHE2KnrzAfsAjl4uP++evGFCrAU1jta4ubEjIG7YWt/64Gqv66a30yKwWczVjA6j3bM4nBwH7Pk1JmDHaxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser": { + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.48.0.tgz", + "integrity": "sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.6.1.tgz", + "integrity": "sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@minify-html/node": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "@swc/html": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "cssnano": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "html-minifier-terser": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "postcss": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/watchpack": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.107.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.107.2.tgz", + "integrity": "sha512-v7RhXaJbpMlV0D7hC7lb2EbnxkoeUqf9qhKr6lozx3Q48pmFrqqNRmZFUEGmi7pSwm6fCQ2H1IjvCkHqdpVdjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.16.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.22.0", + "es-module-lexer": "^2.1.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "loader-runner": "^4.3.2", + "mime-db": "^1.54.0", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.5.0", + "watchpack": "^2.5.1", + "webpack-sources": "^3.5.0" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.0.tgz", + "integrity": "sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..e151a660a --- /dev/null +++ b/package.json @@ -0,0 +1,18 @@ +{ + "name": "django-filer", + "version": "1.0.0", + "private": true, + "scripts": { + "build": "webpack --mode production", + "build:dev": "webpack --mode development" + }, + "devDependencies": { + "webpack": "^5.90.0", + "webpack-cli": "^5.1.4" + }, + "dependencies": { + "dropzone": "^5.9.3", + "mediator-js": "^0.11.0" + } +} + diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 000000000..e134e5911 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,109 @@ +[build-system] +requires = ["setuptools>=45", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "django-filer" +dynamic = ["version"] +authors = [ + {name = "Divio AG", email = "info@divio.ch"}, +] +maintainers = [ + {name = "Django CMS Association and contributors", email = "info@django-cms.org"}, + {name = "PBS"}, +] +description = "A file management application for django that makes handling of files and images a breeze." +readme = "README.rst" +license = {text = "BSD-3-Clause"} +requires-python = ">=3.10" +dependencies = [ + "django>=5.1,<5.2", + "django-mptt>=0.6,<1.0", + "django-polymorphic>=4.0.0,<5.0", + "django-js-asset>=2.0.0,<3.0", + "easy-thumbnails[svg]>=2,<3.0", + "Unidecode>=0.04,<1.2", + "filetype", + "pytz", + + # Pin svglib to a version below 1.6.0. + # The latest version (1.6.0) adds pycairo as a dependency, + # which requires system-level libraries and fails to install in the container. + # This can be removed once the issue is resolved. + # See: https://github.com/deeplook/svglib/issues/421 + "svglib~=1.5.1", +] +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Environment :: Web Environment", + "Intended Audience :: Developers", + "License :: OSI Approved :: BSD License", + "Operating System :: OS Independent", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Framework :: Django", + "Framework :: Django :: 5.1", + "Topic :: Internet :: WWW/HTTP", + "Topic :: Internet :: WWW/HTTP :: Dynamic Content", + "Topic :: Software Development", + "Topic :: Software Development :: Libraries", +] + +[project.optional-dependencies] +s3 = [ + "boto3>=1.26,<2.0", + "django-storages>=1.13,<2.0", +] +heif = ["pillow-heif"] + +[project.urls] +Homepage = "https://github.com/pbs/django-filer" + +[tool.setuptools] +include-package-data = true +zip-safe = false + +[tool.setuptools.packages.find] +where = ["."] +include = ["filer*", "LICENSE"] + +[tool.setuptools.package-data] +"*" = [ + "templates/**/*.html", + "static/**/*", + "locale/**/*", + "*.po", + "*.mo", +] + +[tool.setuptools.dynamic] +version = {attr = "filer.__version__"} + +[tool.flake8] +max-line-length = 119 +exclude = [ + "*.egg-info", + ".eggs", + ".env", + ".git", + ".settings", + ".tox", + ".venv", + "build", + "data", + "dist", + "docs", + "*migrations*", + "tmp", + "node_modules", +] +ignore = ["E251", "E128", "E501", "W503"] + +[tool.ruff] +src = ["filer"] +exclude = ["*/migrations/*"] +line-length = 119 diff --git a/pytest.ini b/pytest.ini index 39dca3f80..1ddb7e95a 100644 --- a/pytest.ini +++ b/pytest.ini @@ -2,4 +2,5 @@ python_files = *.py python_classes = Test* *Tests *TestCase python_functions = test_* +testpaths = filer/tests diff --git a/setup.py b/setup.py deleted file mode 100644 index 1bf58f772..000000000 --- a/setup.py +++ /dev/null @@ -1,68 +0,0 @@ -import os - -from setuptools import setup, find_packages - -try: - from setuptest import test -except ImportError: - from setuptools.command.test import test - -version = __import__('filer').__version__ - - -def read(fname): - """read the contents of a text file""" - return open(os.path.join(os.path.dirname(__file__), fname)).read() - -setup( - name='django-filer', - version=version, - url='http://github.com/stefanfoulis/django-filer', - license='BSD', - platforms=['OS Independent'], - description='A file management application for django that makes handling of files and images a breeze.', - long_description=read('README.rst'), - author='Stefan Foulis', - author_email='stefan.foulis@gmail.com', - packages=find_packages(), - python_requires='>=3.10', - install_requires=( - 'django>=5.1,<5.2', - 'django-mptt>=0.6,<1.0', # the exact version depends on Django - 'django_polymorphic>=4.0.0,<5.0', - 'django-js-asset>=2.0.0,<3.0', - 'easy-thumbnails>=2,<3.0', - 'Unidecode>=0.04,<1.2', - 'filetype', - 'pytz', - ), - extras_require={ - 's3': [ - 'boto3>=1.26,<2.0', - 'django-storages>=1.13,<2.0', - ], - }, - include_package_data=True, - zip_safe=False, - classifiers=[ - 'Development Status :: 4 - Beta', - 'Framework :: Django', - 'Framework :: Django :: 5.1', - 'Intended Audience :: Developers', - 'License :: OSI Approved :: BSD License', - 'Operating System :: OS Independent', - 'Programming Language :: Python', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.10', - 'Programming Language :: Python :: 3.11', - 'Programming Language :: Python :: 3.12', - 'Programming Language :: Python :: 3.13', - 'Topic :: Internet :: WWW/HTTP', - ], - cmdclass={'test': test}, - test_suite='setuptest.setuptest.SetupTestSuite', - tests_require=( - 'django-setuptest>=0.1.1', - 'argparse', # apparently needed by django-setuptest on python 2.6 - ), -) diff --git a/test_image_upload.py b/test_image_upload.py new file mode 100644 index 000000000..0c1f4cdac --- /dev/null +++ b/test_image_upload.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python3 +"""Test uploading images through the full ajax_upload flow to find what fails.""" +import os +os.environ['DJANGO_SETTINGS_MODULE'] = 'test_settings' +import django; django.setup() +from django.conf import settings; settings.ALLOWED_HOSTS = ['*'] + +from django.core.management import call_command +call_command('migrate', '--run-syncdb', verbosity=0) + +from django.contrib.auth.models import User +from django.core.files.uploadedfile import SimpleUploadedFile +from django.test.client import Client +from django.urls import reverse +from filer.models.filemodels import File +from filer.models.foldermodels import Folder +from filer.models.clipboardmodels import Clipboard, ClipboardItem +from PIL import Image as PILImage +import io, json + +user = User.objects.filter(username='imgtest').first() +if not user: + user = User.objects.create_superuser('imgtest', 'a@a.com', 'secret') + +folder, _ = Folder.objects.get_or_create(name='img_test', owner=user) + +client = Client() +client.login(username='imgtest', password='secret') + +def test_upload(name, data, content_type): + """Test uploading through ajax_upload endpoint.""" + ClipboardItem.objects.filter(clipboard__user=user).delete() + upload = SimpleUploadedFile(name, data, content_type=content_type) + url = reverse('admin:filer-ajax_upload', kwargs={'folder_id': folder.pk}) + response = client.post(url, {'file': upload}) + result = json.loads(response.content.decode()) + success = 'file_id' in result + return success, result + +# Test 1: Normal JPEG +print("=" * 60) +print("Test 1: Standard JPEG image") +buf = io.BytesIO() +img = PILImage.new('RGB', (800, 600), color='red') +img.save(buf, format='JPEG') +ok, res = test_upload('test1.jpg', buf.getvalue(), 'image/jpeg') +print(f" Result: {'PASS' if ok else 'FAIL'} - {res}") + +# Test 2: WebP image saved as .jpg +print("\nTest 2: WebP image saved with .jpg extension") +buf = io.BytesIO() +img = PILImage.new('RGB', (800, 600), color='blue') +img.save(buf, format='WEBP') +ok, res = test_upload('test2.jpg', buf.getvalue(), 'image/webp') +print(f" Result: {'PASS' if ok else 'FAIL'} - {res}") + +# Test 3: WebP image with .webp extension +print("\nTest 3: WebP image with proper .webp extension") +buf = io.BytesIO() +img = PILImage.new('RGB', (800, 600), color='green') +img.save(buf, format='WEBP') +ok, res = test_upload('test3.webp', buf.getvalue(), 'image/webp') +print(f" Result: {'PASS' if ok else 'FAIL'} - {res}") + +# Test 4: JPEG image with no extension +print("\nTest 4: JPEG image with no extension") +buf = io.BytesIO() +img = PILImage.new('RGB', (800, 600), color='yellow') +img.save(buf, format='JPEG') +ok, res = test_upload('image_no_ext', buf.getvalue(), 'image/jpeg') +print(f" Result: {'PASS' if ok else 'FAIL'} - {res}") + +# Test 5: Large JPEG image (high resolution) +print("\nTest 5: Large JPEG (4000x3000)") +buf = io.BytesIO() +img = PILImage.new('RGB', (4000, 3000), color='purple') +img.save(buf, format='JPEG') +ok, res = test_upload('test5_large.jpg', buf.getvalue(), 'image/jpeg') +print(f" Result: {'PASS' if ok else 'FAIL'} - {res}") + +# Test 6: JPEG with long filename +print("\nTest 6: JPEG with very long filename") +buf = io.BytesIO() +img = PILImage.new('RGB', (800, 600), color='orange') +img.save(buf, format='JPEG') +long_name = 'a' * 200 + '.jpg' +ok, res = test_upload(long_name, buf.getvalue(), 'image/jpeg') +print(f" Result: {'PASS' if ok else 'FAIL'} - {res}") + +# Test 7: JPEG with EXIF data +print("\nTest 7: JPEG with EXIF orientation data") +buf = io.BytesIO() +img = PILImage.new('RGB', (800, 600), color='cyan') +try: + import piexif + exif_dict = {"0th": {piexif.ImageIFD.Orientation: 6}} + exif_bytes = piexif.dump(exif_dict) + img.save(buf, format='JPEG', exif=exif_bytes) +except ImportError: + print(" (piexif not available, using plain JPEG)") + img.save(buf, format='JPEG') +ok, res = test_upload('test7_exif.jpg', buf.getvalue(), 'image/jpeg') +print(f" Result: {'PASS' if ok else 'FAIL'} - {res}") + +# Test 8: image/jpg non-standard MIME type +print("\nTest 8: Non-standard image/jpg MIME type") +buf = io.BytesIO() +img = PILImage.new('RGB', (800, 600), color='pink') +img.save(buf, format='JPEG') +ok, res = test_upload('test8.jpg', buf.getvalue(), 'image/jpg') +print(f" Result: {'PASS' if ok else 'FAIL'} - {res}") + +# Test 9: JFIF extension +print("\nTest 9: JPEG with .jfif extension") +buf = io.BytesIO() +img = PILImage.new('RGB', (800, 600), color='brown') +img.save(buf, format='JPEG') +ok, res = test_upload('test9.jfif', buf.getvalue(), 'image/jpeg') +print(f" Result: {'PASS' if ok else 'FAIL'} - {res}") + diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 000000000..3967e7552 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,15 @@ +const path = require('path'); + +module.exports = { + entry: { + 'filer-base.bundle': './filer/static/filer/js/base.js', + }, + output: { + filename: '[name].js', + path: path.resolve(__dirname, 'filer/static/filer/js/dist'), + }, + resolve: { + modules: ['node_modules'], + }, +}; +