diff --git a/.env.dev b/.env.dev index 7037b1dbd..5b6865600 100644 --- a/.env.dev +++ b/.env.dev @@ -10,5 +10,4 @@ PYTHONDONTWRITEBYTECODE=true WEBPACK_DEVSERVER_PORT=8080 MUSIC_DIRECTORY_PATH=/music BROWSABLE_API_ENABLED=True -CACHEOPS_ENABLED=False FORWARDED_PROTO=http diff --git a/.gitignore b/.gitignore index 2582cc534..d5870db7e 100644 --- a/.gitignore +++ b/.gitignore @@ -91,3 +91,5 @@ data/ po/*.po docs/swagger _build +front/src/translations.json +front/locales/en_US/LC_MESSAGES/app.po diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 684e3233a..57e258e93 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -4,7 +4,8 @@ variables: IMAGE_LATEST: $IMAGE_NAME:latest PIP_CACHE_DIR: "$CI_PROJECT_DIR/pip-cache" PYTHONDONTWRITEBYTECODE: "true" - + REVIEW_DOMAIN: preview.funkwhale.audio + REVIEW_INSTANCE_URL: https://demo.funkwhale.audio stages: - review @@ -19,37 +20,42 @@ review_front: when: manual allow_failure: true before_script: + - curl -L -o /usr/local/bin/jq https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64 + - chmod +x /usr/local/bin/jq - cd front script: - yarn install + - yarn run i18n-compile # this is to ensure we don't have any errors in the output, # cf https://code.eliotberriot.com/funkwhale/funkwhale/issues/169 - INSTANCE_URL=$REVIEW_INSTANCE_URL yarn run build | tee /dev/stderr | (! grep -i 'ERROR in') - - mkdir -p /static/front/$CI_BUILD_REF_SLUG - - cp -r dist/* /static/front/$CI_BUILD_REF_SLUG + - mkdir -p /static/front/$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG + - cp -r dist/* /static/front/$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG cache: - key: "$CI_PROJECT_ID__front_dependencies" + key: "funkwhale__front_dependencies" paths: - front/node_modules - front/yarn.lock environment: - name: review/front-$CI_BUILD_REF_NAME - url: http://front-$CI_BUILD_REF_SLUG.$REVIEW_DOMAIN + name: review/front/$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG + url: http://front-$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG.$REVIEW_DOMAIN on_stop: stop_front_review only: - - branches@funkwhale/funkwhale + - branches tags: - funkwhale-review stop_front_review: stage: review script: - - rm -rf /static/front/$CI_BUILD_REF_SLUG/ + - rm -rf /static/front/$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG/ variables: GIT_STRATEGY: none when: manual + only: + - branches environment: - name: review/front-$CI_BUILD_REF_NAME + name: review/front/$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG action: stop tags: - funkwhale-review @@ -63,33 +69,38 @@ review_docs: BUILD_PATH: "../public" before_script: - cd docs + - apt-get update + - apt-get install -y graphviz + - pip install sphinx + cache: key: "$CI_PROJECT_ID__sphinx" paths: - "$PIP_CACHE_DIR" script: - - pip install sphinx - ./build_docs.sh - - mkdir -p /static/docs/$CI_BUILD_REF_SLUG - - cp -r $CI_PROJECT_DIR/public/* /static/docs/$CI_BUILD_REF_SLUG + - mkdir -p /static/docs/$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG + - cp -r $CI_PROJECT_DIR/public/* /static/docs/$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG environment: - name: review/docs-$CI_BUILD_REF_NAME - url: http://docs-$CI_BUILD_REF_SLUG.$REVIEW_DOMAIN + name: review/docs/$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG + url: http://docs-$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG.$REVIEW_DOMAIN on_stop: stop_docs_review only: - - branches@funkwhale/funkwhale + - branches tags: - funkwhale-review stop_docs_review: stage: review script: - - rm -rf /static/docs/$CI_BUILD_REF_SLUG/ + - rm -rf /static/docs/$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG/ variables: GIT_STRATEGY: none when: manual + only: + - branches environment: - name: review/docs-$CI_BUILD_REF_NAME + name: review/docs/$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG action: stop tags: - funkwhale-review @@ -132,9 +143,9 @@ test_api: DJANGO_ALLOWED_HOSTS: "localhost" DATABASE_URL: "postgresql://postgres@postgres/postgres" FUNKWHALE_URL: "https://funkwhale.ci" - CACHEOPS_ENABLED: "false" DJANGO_SETTINGS_MODULE: config.settings.local - + only: + - branches before_script: - cd api - pip install -r requirements/base.txt @@ -151,12 +162,13 @@ test_front: image: node:9 before_script: - cd front - + only: + - branches script: - yarn install - yarn run unit cache: - key: "$CI_PROJECT_ID__front_dependencies" + key: "funkwhale__front_dependencies" paths: - front/node_modules - front/yarn.lock @@ -172,17 +184,18 @@ build_front: stage: build image: node:9 before_script: + - curl -L -o /usr/local/bin/jq https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64 + - chmod +x /usr/local/bin/jq - cd front - script: - yarn install - - yarn run i18n-extract - yarn run i18n-compile # this is to ensure we don't have any errors in the output, # cf https://code.eliotberriot.com/funkwhale/funkwhale/issues/169 - yarn run build | tee /dev/stderr | (! grep -i 'ERROR in') + - chmod -R 750 dist cache: - key: "$CI_PROJECT_ID__front_dependencies" + key: "funkwhale__front_dependencies" paths: - front/node_modules - front/yarn.lock @@ -205,8 +218,10 @@ pages: BUILD_PATH: "../public" before_script: - cd docs - script: + - apt-get update + - apt-get install -y graphviz - pip install sphinx + script: - ./build_docs.sh cache: key: "$CI_PROJECT_ID__sphinx" @@ -243,7 +258,9 @@ build_api: name: "api_${CI_COMMIT_REF_NAME}" paths: - api - script: echo Done! + script: + - chmod -R 750 api + - echo Done! only: - tags@funkwhale/funkwhale - master@funkwhale/funkwhale diff --git a/CHANGELOG b/CHANGELOG index 3c26a5e92..e5c811fc8 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -4,12 +4,245 @@ Changelog You can subscribe to release announcements by: - Following `funkwhale@mastodon.eliotberriot.com `_ on Mastodon -- Subscribing to the following Atom feed: https://code.eliotberriot.com/funkwhale/funkwhale/commits/develop?format=atom&search=tag +- Subscribing to the following Atom feed: https://code.eliotberriot.com/funkwhale/funkwhale/commits/develop?format=atom&search=Merge+tag This changelog is viewable on the web at https://docs.funkwhale.audio/changelog.html. .. towncrier +0.16 (unreleased) +----------------- + +Upgrade instructions are available at +https://docs.funkwhale.audio/upgrading.html + +Features: + +- Complete redesign of the library home and playlist pages (#284) +- Expose ActivityPub actors for users (#317) +- Implemented a basic but functionnal Github-like search on federated tracks + list (#344) +- Internationalized interface as well as translations for Arabic, French, + Esperanto, Italian, Occitan, Polish, Portuguese and Swedish (#161, #167) +- Users can now upload an avatar in their settings page (#257) + + +Enhancements: + +- Added feedback when creating/updating radio (#302) +- Apply restrictions to username characters during signup +- Autoselect best language based on browser configuration (#386) +- Can now order tracks on federated track list (#326) +- Can now relaunch pending import jobs from the web interface (#323) +- Ensure we do not display pagination on single pages (#334) +- Ensure we have sane defaults for MEDIA_ROOT, STATIC_ROOT and + MUSIC_DIRECTORY_PATH in the deployment .env file (#350) +- Make some space for the volume slider to allow precise control (#318) +- Removed django-cacheops dependency +- Store track artist and album artist separately (#237) Better handling of + tracks with a different artist than the album artist +- The navigation bar of Library is now fixed (#375) +- Use thumbnails for avatars and covers to reduce bandwidth + + +Bugfixes: + +- Ensure 750 permissions on CI artifacts (#332) +- Ensure images are not cropped in queue (#337) +- Ensure we do not import artists with empty names (#351) +- Fix notifications not closing when clicking on the cross (#366) +- Fix the most annoying offset in the whole fediverse (#369) +- Fixed persistent message in playlist modal (#304) +- Fixed unfiltered results in favorites API (#384) +- Raise a warning instead of crashing when getting a broken path in file import + (#138) +- Remove parallelization of uploads during import to avoid crashing small + servers (#382) +- Subsonic API login is now case insensitive (#339) +- Validate Date header in HTTP Signatures (#328) + + +Documentation: + +- Added troubleshotting and technical overview documentation (#256) +- Arch Linux installation steps +- Document that users can use Ultrasonic on Android (#316) +- Fixed a couple of typos +- Some cosmetic improvements to the doc + + +i18n: + +- Arabic translation (!302) +- Polish translation (!304) + + +Library home and playlist page overhaul +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The library home page have been completely redesigned to include: + +- other users activity (listenings, playlists and favorites) +- recently imported albums + +We think this new version showcases more music in a more useful way, let us know +what you think about it! + +The playlist page have been updated as well. + + +Internationalized interface +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +After months of work, we're proud to announce our interface is now ready +for internationalization. + +Translators have already started the work of translating Funkwhale in 8 different languages, +and we're ready to add more as needed. + +You can easily get involved at https://translate.funkwhale.audio/engage/funkwhale/ + + +Better handling of tracks with a different artist than the album artist +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Some tracks involve a different artist than the album artist (e.g. a featuring) +and Funkwhale has been known to do weird things when importing such tracks, resulting +in albums that contained a single track, for instance. + +The situation should be improved with this release, as Funkwhale is now able to +store separately the track and album artist, and display it properly in the interface. + + +Users now have an ActivityPub Actor [Manual action required] +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the process of implementing federation for user activity such as listening +history, we are now making user profiles (a.k.a. ActivityPub actors) available through federation. + +This does not means the federation is working, but this is a needed step to implement it. + +Those profiles will be created automatically for new users, but you have to run a command +to create them for existing users. + +On docker setups:: + + docker-compose run --rm api python manage.py script create_actors --no-input + +On non-docker setups:: + + python manage.py script create_actors --no-input + +This should only take a few seconds to run. It is safe to interrupt the process or rerun it multiple times. + + +Image thumbnails [Manual action required] +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +To reduce bandwidth usage on slow or limited connexions and improve performance +in general, we now use smaller images in the front-end. For instance, if you have +an album cover with a 1000x1000 pixel size, we will create smaller +versions of this image (50x50, 200x200, 400x400) and reference those resized version +when we don't actually need the original image. + +Thumbnail will be created automatically for new objects, however, you have +to launch a manual command to deal with existing ones. + +On docker setups:: + + docker-compose run --rm api python manage.py script create_image_variations --no-input + +On non-docker setups:: + + python manage.py script create_image_variations --no-input + +This should be quite fast but may take up to a few minutes depending on the number +of albums you have in database. It is safe to interrupt the process or rerun it multiple times. + + +Improved search on federated tracks list +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Having a powerful but easy-to-use search is important but difficult to achieve, especially +if you do not want to have a real complex search interface. + +Github does a pretty good job with that, using a structured but simple query system +(See https://help.github.com/articles/searching-issues-and-pull-requests/#search-only-issues-or-pull-requests). + +This release implements a limited but working subset of this query system. You can use it only on the federated +tracks list (/manage/federation/tracks) at the moment, but depending on feedback it will be rolled-out on other pages as well. + +This is the type of query you can run: + +- ``hello world``: search for "hello" and "world" in all the available fields +- ``hello in:artist`` search for results where artist name is "hello" +- ``spring in:artist,album`` search for results where artist name or album title contain "spring" +- ``artist:hello`` search for results where artist name equals "hello" +- ``artist:"System of a Down" domain:instance.funkwhale`` search for results where artist name equals "System of a Down" and inside "instance.funkwhale" library + + +Ensure MEDIA_ROOT, STATIC_ROOT and MUSIC_DIRECTORY_* are set explicitely [Manual action required] +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In our default .env file, MEDIA_ROOT and STATIC_ROOT were commented by default, causing +some deployment issues on non-docker setups when people forgot to uncomment them. + +From now on, those variables are uncommented, and will also be used on docker setups +to mount the volumes automatically in the docker-compose.yml file. This has been a source +of headache as well in some deployments, where you had to update both the .env file and +the compose file. + +This also applies to in-place paths (MUSIC_DIRECTORY_PATH and MUSIC_DIRECTORY_SERVE_PATH), +whose values are now used directly to set up the proper Docker volumes. + +This will only affect new deployments though. If you want to benefit from this on an +existing instance, do a backup of your ``.env`` and ``docker-compose.yml`` files and apply the following changes: + +- Ensure ``MEDIA_ROOT`` is uncommented in your .env file and match the absolute path where media files are stored + on your host (``/srv/funkwhale/data/media`` by default) +- Ensure ``STATIC_ROOT`` is uncommented in your .env file and match the absolute path where static files are stored + on your host (``/srv/funkwhale/data/static`` by default) +- If you use in-place import: + - Ensure MUSIC_DIRECTORY_PATH is uncommented and set to ``/music`` + - Ensure MUSIC_DIRECTORY_SERVE_PATH is uncommented and set to the absolute path on your host were your music files + are stored (``/srv/funkwhale/data/music`` by default) +- Edit your docker-compose.yml file to reflect the changes: + - Search for volumes (there should be two occurences) that contains ``/app/funkwhale_api/media`` on the right side, and + replace the whole line with ``- "${MEDIA_ROOT}:${MEDIA_ROOT}"`` + - Search for a volume that contains ``/app/staticfiles`` on the right side, and + replace the whole line with ``- "${STATIC_ROOT}:${STATIC_ROOT}"`` + - If you use in-place import, search for volumes (there should be two occurences) that contains ``/music:ro`` on the right side, and + replace the whole line with ``- "${MUSIC_DIRECTORY_SERVE_PATH}:${MUSIC_DIRECTORY_PATH}:ro"`` + +In the end, the ``volumes`` directives of your containers should look like that:: + + ... + celeryworker + volumes: + - "${MUSIC_DIRECTORY_SERVE_PATH}:${MUSIC_DIRECTORY_PATH}:ro" + - "${MEDIA_ROOT}:${MEDIA_ROOT}" + ... + api: + volumes: + - "${MUSIC_DIRECTORY_SERVE_PATH}:${MUSIC_DIRECTORY_PATH}:ro" + - "${MEDIA_ROOT}:${MEDIA_ROOT}" + - "${STATIC_ROOT}:${STATIC_ROOT}" + - ./front/dist:/frontend + ... + + +Removed Cacheops dependency +--------------------------- + +We removed one of our dependency named django-cacheops. It was unly used in a few places, +and not playing nice with other dependencies. + +You can safely remove this dependency in your environment with ``pip uninstall django-cacheops`` if you're +not using docker. + +You can also safely remove any ``CACHEOPS_ENABLED`` setting from your environment file. + + 0.15 (2018-06-24) ----------------- @@ -1346,7 +1579,7 @@ Basic transcoding is now available to/from the following formats : ogg and mp3. This relies internally on FFMPEG and can put some load on your server. It's definitely recommended you setup some caching for the transcoded files -at your webserver level. Check the the exemple nginx file at deploy/nginx.conf +at your webserver level. Check the the exemple nginx file at deploy/nginx.conf for an implementation. On the frontend, usage of transcoding should be transparent in the player. diff --git a/CONTRIBUTING b/CONTRIBUTING index 6fb76a56c..18d877b66 100644 --- a/CONTRIBUTING +++ b/CONTRIBUTING @@ -1,5 +1,5 @@ Contribute to Funkwhale development -================================== +=================================== First of all, thank you for your interest in the project! We really appreciate the fact that you're about to take some time to read this @@ -82,7 +82,7 @@ Visit https://code.eliotberriot.com/funkwhale/funkwhale and clone the repository A note about branches ^^^^^^^^^^^^^^^^^^^^^ -Next release development occurs on the "develop" branch, and releases are made on the "master" branch. Therefor, when submitting Merge Requests, ensure you are merging on the develop branch. +Next release development occurs on the "develop" branch, and releases are made on the "master" branch. Therefore, when submitting Merge Requests, ensure you are merging on the develop branch. Working with docker @@ -111,7 +111,7 @@ Create it like this:: Create docker network -^^^^^^^^^^^^^^^^^^^^ +^^^^^^^^^^^^^^^^^^^^^ Create the federation network:: @@ -280,7 +280,7 @@ Typical workflow for a contribution 3. Create a dedicated branch for your work ``42-awesome-fix``. It is good practice to prefix your branch name with the ID of the issue you are solving. 4. Work on your stuff 5. Commit small, atomic changes to make it easier to review your contribution -6. Add a changelog fragment to summarize your changes: ``echo "Implemented awesome stuff (#42)" > changes/changelog.d/42.feature"`` +6. Add a changelog fragment to summarize your changes: ``echo "Implemented awesome stuff (#42)" > changes/changelog.d/42.feature`` 7. Push your branch 8. Create your merge request 9. Take a step back and enjoy, we're really grateful you did all of this and took the time to contribute! @@ -289,8 +289,9 @@ Typical workflow for a contribution Internationalization -------------------- +We're using https://github.com/Polyconseil/vue-gettext to manage i18n in the project. When working on the front-end, any end-user string should be translated -using either ```` or the ``$t('yourstring')`` +using either ``yourstring`` or ``$gettext('yourstring')`` function. Extraction is done by calling ``yarn run i18n-extract``, which diff --git a/README.rst b/README.rst index ef3998d11..d882a35c8 100644 --- a/README.rst +++ b/README.rst @@ -14,8 +14,8 @@ Getting help We offer various Matrix.org rooms to discuss about Funkwhale: -- `#funkwhale:matrix.org `_ for general questions about funkwhale -- `#funkwhale-dev:matrix.org `_ for development-focused discussion +- `#funkwhale:matrix.org `_ for general questions about funkwhale +- `#funkwhale-dev:matrix.org `_ for development-focused discussion Please join those rooms if you have any questions! @@ -26,4 +26,9 @@ Contribute ---------- Contribution guidelines as well as development installation instructions -are outlined in `CONTRIBUTING `_ +are outlined in `CONTRIBUTING `_. + +Translate +^^^^^^^^^ + +Translators willing to help can refer to `TRANSLATORS `_ for instructions. diff --git a/TRANSLATORS.rst b/TRANSLATORS.rst new file mode 100644 index 000000000..f20150995 --- /dev/null +++ b/TRANSLATORS.rst @@ -0,0 +1,28 @@ +Translating Funkwhale +===================== + +Thank you for reading this! If you want to help translate Funkwhale, +you found the proper place :) + +Translation is done via our own Weblate instance at https://translate.funkwhale.audio/projects/funkwhale/front/. + +You can signup/login using your Gitlab account (from https://code.eliotberriot.com). + +Translation workflow +-------------------- + +Once you're logged-in on the Weblate instance, you can suggest translations. Your suggestions will then be reviewer +by the project maintainer or other translators to ensure consistency. + +Guidelines +---------- + +Respecting those guidelines is mandatory if you want your translation to be included: + +- Use gender-neutral language and wording + +Requesting a new language +------------------------- + +If you'd like to see a new language in Funkwhale, please open an issue here: +https://code.eliotberriot.com/funkwhale/funkwhale/issues diff --git a/api/config/settings/common.py b/api/config/settings/common.py index b74c2bdfe..013c7ae43 100644 --- a/api/config/settings/common.py +++ b/api/config/settings/common.py @@ -92,8 +92,8 @@ THIRD_PARTY_APPS = ( "rest_auth.registration", "dynamic_preferences", "django_filters", - "cacheops", "django_cleanup", + "versatileimagefield", ) @@ -302,6 +302,7 @@ SESSION_COOKIE_HTTPONLY = False ACCOUNT_AUTHENTICATION_METHOD = "username_email" ACCOUNT_EMAIL_REQUIRED = True ACCOUNT_EMAIL_VERIFICATION = "mandatory" +ACCOUNT_USERNAME_VALIDATORS = "funkwhale_api.users.serializers.username_validators" # Custom user app defaults # Select the correct user model @@ -420,15 +421,6 @@ PROTECT_FILES_PATH = env("PROTECT_FILES_PATH", default="/_protected") # use this setting to tweak for how long you want to cache # musicbrainz results. (value is in seconds) MUSICBRAINZ_CACHE_DURATION = env.int("MUSICBRAINZ_CACHE_DURATION", default=300) -CACHEOPS_REDIS = env("CACHE_URL", default=CACHE_DEFAULT) -CACHEOPS_ENABLED = env.bool("CACHEOPS_ENABLED", default=True) -CACHEOPS = { - "music.artist": {"ops": "all", "timeout": 60 * 60}, - "music.album": {"ops": "all", "timeout": 60 * 60}, - "music.track": {"ops": "all", "timeout": 60 * 60}, - "music.trackfile": {"ops": "all", "timeout": 60 * 60}, - "taggit.tag": {"ops": "all", "timeout": 60 * 60}, -} # Custom Admin URL, use {% url 'admin:index' %} ADMIN_URL = env("DJANGO_ADMIN_URL", default="^api/admin/") @@ -441,6 +433,7 @@ PLAYLISTS_MAX_TRACKS = env.int("PLAYLISTS_MAX_TRACKS", default=250) ACCOUNT_USERNAME_BLACKLIST = [ "funkwhale", "library", + "instance", "test", "status", "root", @@ -449,6 +442,11 @@ ACCOUNT_USERNAME_BLACKLIST = [ "superuser", "staff", "service", + "me", + "ghost", + "_", + "hello", + "contact", ] + env.list("ACCOUNT_USERNAME_BLACKLIST", default=[]) EXTERNAL_REQUESTS_VERIFY_SSL = env.bool("EXTERNAL_REQUESTS_VERIFY_SSL", default=True) @@ -465,3 +463,13 @@ MUSIC_DIRECTORY_SERVE_PATH = env( USERS_INVITATION_EXPIRATION_DAYS = env.int( "USERS_INVITATION_EXPIRATION_DAYS", default=14 ) + +VERSATILEIMAGEFIELD_RENDITION_KEY_SETS = { + "square": [ + ("original", "url"), + ("square_crop", "crop__400x400"), + ("medium_square_crop", "crop__200x200"), + ("small_square_crop", "crop__50x50"), + ] +} +VERSATILEIMAGEFIELD_SETTINGS = {"create_images_on_demand": False} diff --git a/api/config/settings/local.py b/api/config/settings/local.py index 9f0119cee..b8df4bdb7 100644 --- a/api/config/settings/local.py +++ b/api/config/settings/local.py @@ -39,6 +39,7 @@ DEBUG_TOOLBAR_CONFIG = { "DISABLE_PANELS": ["debug_toolbar.panels.redirects.RedirectsPanel"], "SHOW_TEMPLATE_CONTEXT": True, "SHOW_TOOLBAR_CALLBACK": lambda request: True, + "JQUERY_URL": "", } # django-extensions diff --git a/api/config/settings/production.py b/api/config/settings/production.py index 72b08aa3c..26def9fd0 100644 --- a/api/config/settings/production.py +++ b/api/config/settings/production.py @@ -51,12 +51,6 @@ CSRF_TRUSTED_ORIGINS = ALLOWED_HOSTS # END SITE CONFIGURATION -# STORAGE CONFIGURATION -# ------------------------------------------------------------------------------ -# Uploaded Media Files -# ------------------------ -DEFAULT_FILE_STORAGE = "django.core.files.storage.FileSystemStorage" - # Static Assets # ------------------------ STATICFILES_STORAGE = "django.contrib.staticfiles.storage.StaticFilesStorage" diff --git a/api/demo/demo-user.py b/api/demo/demo-user.py deleted file mode 100644 index 94757d2fa..000000000 --- a/api/demo/demo-user.py +++ /dev/null @@ -1,7 +0,0 @@ -from funkwhale_api.users.models import User - - -u = User.objects.create(email="demo@demo.com", username="demo", is_staff=True) -u.set_password("demo") -u.subsonic_api_token = "demo" -u.save() diff --git a/api/demo/load-demo-data.sh b/api/demo/load-demo-data.sh deleted file mode 100755 index fab0de8b3..000000000 --- a/api/demo/load-demo-data.sh +++ /dev/null @@ -1,13 +0,0 @@ -#! /bin/bash - -echo "Loading demo data..." - -python manage.py migrate --noinput - -echo "Creating demo user..." - -cat demo/demo-user.py | python manage.py shell -i python - -echo "Importing demo tracks..." - -python manage.py import_files "/music/**/*.ogg" --recursive --noinput --username demo diff --git a/api/funkwhale_api/__init__.py b/api/funkwhale_api/__init__.py index fd35fd34d..7c2275033 100644 --- a/api/funkwhale_api/__init__.py +++ b/api/funkwhale_api/__init__.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -__version__ = "0.15" +__version__ = "0.16" __version_info__ = tuple( [ int(num) if num.isdigit() else num diff --git a/api/funkwhale_api/common/fields.py b/api/funkwhale_api/common/fields.py index 890aee425..a0f10efe3 100644 --- a/api/funkwhale_api/common/fields.py +++ b/api/funkwhale_api/common/fields.py @@ -1,7 +1,7 @@ import django_filters from django.db import models -from funkwhale_api.music import utils +from . import search PRIVACY_LEVEL_CHOICES = [ ("me", "Only me"), @@ -34,5 +34,17 @@ class SearchFilter(django_filters.CharFilter): def filter(self, qs, value): if not value: return qs - query = utils.get_query(value, self.search_fields) + query = search.get_query(value, self.search_fields) return qs.filter(query) + + +class SmartSearchFilter(django_filters.CharFilter): + def __init__(self, *args, **kwargs): + self.config = kwargs.pop("config") + super().__init__(*args, **kwargs) + + def filter(self, qs, value): + if not value: + return qs + cleaned = self.config.clean(value) + return search.apply(qs, cleaned) diff --git a/api/funkwhale_api/common/management/commands/script.py b/api/funkwhale_api/common/management/commands/script.py index b46a4327b..7f8d5c15d 100644 --- a/api/funkwhale_api/common/management/commands/script.py +++ b/api/funkwhale_api/common/management/commands/script.py @@ -19,7 +19,7 @@ class Command(BaseCommand): def handle(self, *args, **options): name = options["script_name"] if not name: - self.show_help() + return self.show_help() available_scripts = self.get_scripts() try: @@ -50,7 +50,7 @@ class Command(BaseCommand): self.stdout.write(self.style.SUCCESS(name)) self.stdout.write("") for line in script["help"].splitlines(): - self.stdout.write("     {}".format(line)) + self.stdout.write(" {}".format(line)) self.stdout.write("") def get_scripts(self): diff --git a/api/funkwhale_api/common/preferences.py b/api/funkwhale_api/common/preferences.py index acda9a90c..527d00c04 100644 --- a/api/funkwhale_api/common/preferences.py +++ b/api/funkwhale_api/common/preferences.py @@ -14,6 +14,11 @@ def get(pref): return manager[pref] +def set(pref, value): + manager = global_preferences_registry.manager() + manager[pref] = value + + class StringListSerializer(serializers.BaseSerializer): separator = "," sort = True diff --git a/api/funkwhale_api/common/scripts/__init__.py b/api/funkwhale_api/common/scripts/__init__.py index e69de29bb..769fd00e4 100644 --- a/api/funkwhale_api/common/scripts/__init__.py +++ b/api/funkwhale_api/common/scripts/__init__.py @@ -0,0 +1,12 @@ +from . import create_actors +from . import create_image_variations +from . import django_permissions_to_user_permissions +from . import test + + +__all__ = [ + "create_actors", + "create_image_variations", + "django_permissions_to_user_permissions", + "test", +] diff --git a/api/funkwhale_api/common/scripts/create_actors.py b/api/funkwhale_api/common/scripts/create_actors.py new file mode 100644 index 000000000..93100540f --- /dev/null +++ b/api/funkwhale_api/common/scripts/create_actors.py @@ -0,0 +1,23 @@ +""" +Compute different sizes of image used for Album covers and User avatars +""" +from django.db.utils import IntegrityError + +from funkwhale_api.users.models import User, create_actor + + +def main(command, **kwargs): + qs = User.objects.filter(actor__isnull=True).order_by("username") + total = len(qs) + command.stdout.write("{} users found without actors".format(total)) + for i, user in enumerate(qs): + command.stdout.write( + "{}/{} creating actor for {}".format(i + 1, total, user.username) + ) + try: + user.actor = create_actor(user) + except IntegrityError as e: + # somehow, an actor with the the url exists in the database + command.stderr.write("Error while creating actor: {}".format(str(e))) + continue + user.save(update_fields=["actor"]) diff --git a/api/funkwhale_api/common/scripts/create_image_variations.py b/api/funkwhale_api/common/scripts/create_image_variations.py new file mode 100644 index 000000000..5e941ce1f --- /dev/null +++ b/api/funkwhale_api/common/scripts/create_image_variations.py @@ -0,0 +1,30 @@ +""" +Compute different sizes of image used for Album covers and User avatars +""" + +from versatileimagefield.image_warmer import VersatileImageFieldWarmer + +from funkwhale_api.music.models import Album +from funkwhale_api.users.models import User + + +MODELS = [(Album, "cover", "square"), (User, "avatar", "square")] + + +def main(command, **kwargs): + for model, attribute, key_set in MODELS: + qs = model.objects.exclude(**{"{}__isnull".format(attribute): True}) + qs = qs.exclude(**{attribute: ""}) + warmer = VersatileImageFieldWarmer( + instance_or_queryset=qs, + rendition_key_set=key_set, + image_attr=attribute, + verbose=True, + ) + command.stdout.write( + "Creating images for {} / {}".format(model.__name__, attribute) + ) + num_created, failed_to_create = warmer.warm() + command.stdout.write( + " {} created, {} in error".format(num_created, len(failed_to_create)) + ) diff --git a/api/funkwhale_api/common/search.py b/api/funkwhale_api/common/search.py new file mode 100644 index 000000000..5fc6f6804 --- /dev/null +++ b/api/funkwhale_api/common/search.py @@ -0,0 +1,130 @@ +import re + +from django.db.models import Q + + +QUERY_REGEX = re.compile('(((?P\w+):)?(?P"[^"]+"|[\S]+))') + + +def parse_query(query): + """ + Given a search query such as "hello is:issue status:opened", + returns a list of dictionnaries discribing each query token + """ + matches = [m.groupdict() for m in QUERY_REGEX.finditer(query.lower())] + for m in matches: + if m["value"].startswith('"') and m["value"].endswith('"'): + m["value"] = m["value"][1:-1] + return matches + + +def normalize_query( + query_string, + findterms=re.compile(r'"([^"]+)"|(\S+)').findall, + normspace=re.compile(r"\s{2,}").sub, +): + """ Splits the query string in invidual keywords, getting rid of unecessary spaces + and grouping quoted words together. + Example: + + >>> normalize_query(' some random words "with quotes " and spaces') + ['some', 'random', 'words', 'with quotes', 'and', 'spaces'] + + """ + return [normspace(" ", (t[0] or t[1]).strip()) for t in findterms(query_string)] + + +def get_query(query_string, search_fields): + """ Returns a query, that is a combination of Q objects. That combination + aims to search keywords within a model by testing the given search fields. + + """ + query = None # Query to search for every search term + terms = normalize_query(query_string) + for term in terms: + or_query = None # Query to search for a given term in each field + for field_name in search_fields: + q = Q(**{"%s__icontains" % field_name: term}) + if or_query is None: + or_query = q + else: + or_query = or_query | q + if query is None: + query = or_query + else: + query = query & or_query + return query + + +def filter_tokens(tokens, valid): + return [t for t in tokens if t["key"] in valid] + + +def apply(qs, config_data): + for k in ["filter_query", "search_query"]: + q = config_data.get(k) + if q: + qs = qs.filter(q) + return qs + + +class SearchConfig: + def __init__(self, search_fields={}, filter_fields={}, types=[]): + self.filter_fields = filter_fields + self.search_fields = search_fields + self.types = types + + def clean(self, query): + tokens = parse_query(query) + cleaned_data = {} + + cleaned_data["types"] = self.clean_types(filter_tokens(tokens, ["is"])) + cleaned_data["search_query"] = self.clean_search_query( + filter_tokens(tokens, [None, "in"]) + ) + unhandled_tokens = [t for t in tokens if t["key"] not in [None, "is", "in"]] + cleaned_data["filter_query"] = self.clean_filter_query(unhandled_tokens) + return cleaned_data + + def clean_search_query(self, tokens): + if not self.search_fields or not tokens: + return + + fields_subset = { + f for t in filter_tokens(tokens, ["in"]) for f in t["value"].split(",") + } or set(self.search_fields.keys()) + fields_subset = set(self.search_fields.keys()) & fields_subset + to_fields = [self.search_fields[k]["to"] for k in fields_subset] + query_string = " ".join([t["value"] for t in filter_tokens(tokens, [None])]) + return get_query(query_string, sorted(to_fields)) + + def clean_filter_query(self, tokens): + if not self.filter_fields or not tokens: + return + + matching = [t for t in tokens if t["key"] in self.filter_fields] + queries = [ + Q(**{self.filter_fields[t["key"]]["to"]: t["value"]}) for t in matching + ] + query = None + for q in queries: + if not query: + query = q + else: + query = query & q + return query + + def clean_types(self, tokens): + if not self.types: + return [] + + if not tokens: + # no filtering on type, we return all types + return [t for key, t in self.types] + types = [] + for token in tokens: + for key, t in self.types: + if key.lower() == token["value"]: + types.append(t) + + return types diff --git a/api/funkwhale_api/common/utils.py b/api/funkwhale_api/common/utils.py index 221d2336b..bba4702b0 100644 --- a/api/funkwhale_api/common/utils.py +++ b/api/funkwhale_api/common/utils.py @@ -1,5 +1,9 @@ +from django.utils.deconstruct import deconstructible + import os import shutil +import uuid + from urllib.parse import parse_qs, urlencode, urlsplit, urlunsplit from django.db import transaction @@ -41,3 +45,22 @@ def set_query_parameter(url, **kwargs): new_query_string = urlencode(query_params, doseq=True) return urlunsplit((scheme, netloc, path, new_query_string, fragment)) + + +@deconstructible +class ChunkedPath(object): + def __init__(self, root, preserve_file_name=True): + self.root = root + self.preserve_file_name = preserve_file_name + + def __call__(self, instance, filename): + uid = str(uuid.uuid4()) + chunk_size = 2 + chunks = [uid[i : i + chunk_size] for i in range(0, len(uid), chunk_size)] + if self.preserve_file_name: + parts = chunks[:3] + [filename] + else: + ext = os.path.splitext(filename)[1][1:].lower() + new_filename = "".join(chunks[3:]) + ".{}".format(ext) + parts = chunks[:3] + [new_filename] + return os.path.join(self.root, *parts) diff --git a/api/funkwhale_api/common/validators.py b/api/funkwhale_api/common/validators.py new file mode 100644 index 000000000..b5f26cac5 --- /dev/null +++ b/api/funkwhale_api/common/validators.py @@ -0,0 +1,152 @@ +import mimetypes +from os.path import splitext + +from django.core.exceptions import ValidationError +from django.core.files.images import get_image_dimensions +from django.template.defaultfilters import filesizeformat +from django.utils.deconstruct import deconstructible +from django.utils.translation import ugettext_lazy as _ + + +@deconstructible +class ImageDimensionsValidator: + """ + ImageField dimensions validator. + + from https://gist.github.com/emilio-rst/4f81ea2718736a6aaf9bdb64d5f2ea6c + """ + + def __init__( + self, + width=None, + height=None, + min_width=None, + max_width=None, + min_height=None, + max_height=None, + ): + """ + Constructor + + Args: + width (int): exact width + height (int): exact height + min_width (int): minimum width + min_height (int): minimum height + max_width (int): maximum width + max_height (int): maximum height + """ + + self.width = width + self.height = height + self.min_width = min_width + self.max_width = max_width + self.min_height = min_height + self.max_height = max_height + + def __call__(self, image): + w, h = get_image_dimensions(image) + + if self.width is not None and w != self.width: + raise ValidationError(_("Width must be %dpx.") % (self.width,)) + + if self.height is not None and h != self.height: + raise ValidationError(_("Height must be %dpx.") % (self.height,)) + + if self.min_width is not None and w < self.min_width: + raise ValidationError(_("Minimum width must be %dpx.") % (self.min_width,)) + + if self.min_height is not None and h < self.min_height: + raise ValidationError( + _("Minimum height must be %dpx.") % (self.min_height,) + ) + + if self.max_width is not None and w > self.max_width: + raise ValidationError(_("Maximum width must be %dpx.") % (self.max_width,)) + + if self.max_height is not None and h > self.max_height: + raise ValidationError( + _("Maximum height must be %dpx.") % (self.max_height,) + ) + + +@deconstructible +class FileValidator(object): + """ + Taken from https://gist.github.com/jrosebr1/2140738 + Validator for files, checking the size, extension and mimetype. + Initialization parameters: + allowed_extensions: iterable with allowed file extensions + ie. ('txt', 'doc') + allowd_mimetypes: iterable with allowed mimetypes + ie. ('image/png', ) + min_size: minimum number of bytes allowed + ie. 100 + max_size: maximum number of bytes allowed + ie. 24*1024*1024 for 24 MB + Usage example:: + MyModel(models.Model): + myfile = FileField(validators=FileValidator(max_size=24*1024*1024), ...) + """ + + extension_message = _( + "Extension '%(extension)s' not allowed. Allowed extensions are: '%(allowed_extensions)s.'" + ) + mime_message = _( + "MIME type '%(mimetype)s' is not valid. Allowed types are: %(allowed_mimetypes)s." + ) + min_size_message = _( + "The current file %(size)s, which is too small. The minumum file size is %(allowed_size)s." + ) + max_size_message = _( + "The current file %(size)s, which is too large. The maximum file size is %(allowed_size)s." + ) + + def __init__(self, *args, **kwargs): + self.allowed_extensions = kwargs.pop("allowed_extensions", None) + self.allowed_mimetypes = kwargs.pop("allowed_mimetypes", None) + self.min_size = kwargs.pop("min_size", 0) + self.max_size = kwargs.pop("max_size", None) + + def __call__(self, value): + """ + Check the extension, content type and file size. + """ + + # Check the extension + ext = splitext(value.name)[1][1:].lower() + if self.allowed_extensions and ext not in self.allowed_extensions: + message = self.extension_message % { + "extension": ext, + "allowed_extensions": ", ".join(self.allowed_extensions), + } + + raise ValidationError(message) + + # Check the content type + mimetype = mimetypes.guess_type(value.name)[0] + if self.allowed_mimetypes and mimetype not in self.allowed_mimetypes: + message = self.mime_message % { + "mimetype": mimetype, + "allowed_mimetypes": ", ".join(self.allowed_mimetypes), + } + + raise ValidationError(message) + + # Check the file size + filesize = len(value) + if self.max_size and filesize > self.max_size: + message = self.max_size_message % { + "size": filesizeformat(filesize), + "allowed_size": filesizeformat(self.max_size), + } + + raise ValidationError(message) + + elif filesize < self.min_size: + message = self.min_size_message % { + "size": filesizeformat(filesize), + "allowed_size": filesizeformat(self.min_size), + } + + raise ValidationError(message) diff --git a/api/funkwhale_api/favorites/filters.py b/api/funkwhale_api/favorites/filters.py new file mode 100644 index 000000000..a355593d9 --- /dev/null +++ b/api/funkwhale_api/favorites/filters.py @@ -0,0 +1,15 @@ +from django_filters import rest_framework as filters + +from funkwhale_api.common import fields + +from . import models + + +class TrackFavoriteFilter(filters.FilterSet): + q = fields.SearchFilter( + search_fields=["track__title", "track__artist__name", "track__album__title"] + ) + + class Meta: + model = models.TrackFavorite + fields = ["user", "q"] diff --git a/api/funkwhale_api/favorites/serializers.py b/api/funkwhale_api/favorites/serializers.py index 3cafb80f0..16171aa34 100644 --- a/api/funkwhale_api/favorites/serializers.py +++ b/api/funkwhale_api/favorites/serializers.py @@ -2,8 +2,8 @@ from rest_framework import serializers from funkwhale_api.activity import serializers as activity_serializers -from funkwhale_api.music.serializers import TrackActivitySerializer -from funkwhale_api.users.serializers import UserActivitySerializer +from funkwhale_api.music.serializers import TrackActivitySerializer, TrackSerializer +from funkwhale_api.users.serializers import UserActivitySerializer, UserBasicSerializer from . import models @@ -26,6 +26,15 @@ class TrackFavoriteActivitySerializer(activity_serializers.ModelSerializer): class UserTrackFavoriteSerializer(serializers.ModelSerializer): + track = TrackSerializer(read_only=True) + user = UserBasicSerializer(read_only=True) + + class Meta: + model = models.TrackFavorite + fields = ("id", "user", "track", "creation_date") + + +class UserTrackFavoriteWriteSerializer(serializers.ModelSerializer): class Meta: model = models.TrackFavorite fields = ("id", "track", "creation_date") diff --git a/api/funkwhale_api/favorites/views.py b/api/funkwhale_api/favorites/views.py index 4d1c1e756..dae90ebbd 100644 --- a/api/funkwhale_api/favorites/views.py +++ b/api/funkwhale_api/favorites/views.py @@ -1,12 +1,13 @@ from rest_framework import mixins, status, viewsets from rest_framework.decorators import list_route +from rest_framework.permissions import IsAuthenticatedOrReadOnly from rest_framework.response import Response from funkwhale_api.activity import record -from funkwhale_api.common.permissions import ConditionalAuthentication +from funkwhale_api.common import fields, permissions from funkwhale_api.music.models import Track -from . import models, serializers +from . import filters, models, serializers class TrackFavoriteViewSet( @@ -16,9 +17,24 @@ class TrackFavoriteViewSet( viewsets.GenericViewSet, ): + filter_class = filters.TrackFavoriteFilter serializer_class = serializers.UserTrackFavoriteSerializer - queryset = models.TrackFavorite.objects.all() - permission_classes = [ConditionalAuthentication] + queryset = ( + models.TrackFavorite.objects.all() + .select_related("track__artist", "track__album__artist", "user") + .prefetch_related("track__files") + ) + permission_classes = [ + permissions.ConditionalAuthentication, + permissions.OwnerPermission, + IsAuthenticatedOrReadOnly, + ] + owner_checks = ["write"] + + def get_serializer_class(self): + if self.request.method.lower() in ["head", "get", "options"]: + return serializers.UserTrackFavoriteSerializer + return serializers.UserTrackFavoriteWriteSerializer def create(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) @@ -32,7 +48,10 @@ class TrackFavoriteViewSet( ) def get_queryset(self): - return self.queryset.filter(user=self.request.user) + queryset = super().get_queryset() + return queryset.filter( + fields.privacy_level_query(self.request.user, "user__privacy_level") + ) def perform_create(self, serializer): track = Track.objects.get(pk=serializer.data["track"]) diff --git a/api/funkwhale_api/federation/factories.py b/api/funkwhale_api/federation/factories.py index 7370ebd77..4a13842da 100644 --- a/api/funkwhale_api/federation/factories.py +++ b/api/funkwhale_api/federation/factories.py @@ -5,6 +5,7 @@ import requests import requests_http_signature from django.conf import settings from django.utils import timezone +from django.utils.http import http_date from funkwhale_api.factories import registry @@ -39,7 +40,7 @@ class SignedRequestFactory(factory.Factory): default_headers = { "User-Agent": "Test", "Host": "test.host", - "Date": "Right now", + "Date": http_date(timezone.now().timestamp()), "Content-Type": "application/activity+json", } if extracted: @@ -170,6 +171,7 @@ class LibraryTrackFactory(factory.DjangoModelFactory): audio_url = factory.Faker("url") audio_mimetype = "audio/ogg" metadata = factory.SubFactory(LibraryTrackMetadataFactory) + published_date = factory.LazyFunction(timezone.now) class Meta: model = models.LibraryTrack diff --git a/api/funkwhale_api/federation/filters.py b/api/funkwhale_api/federation/filters.py index 3b5bfd739..ff7575ba5 100644 --- a/api/funkwhale_api/federation/filters.py +++ b/api/funkwhale_api/federation/filters.py @@ -1,6 +1,7 @@ import django_filters from funkwhale_api.common import fields +from funkwhale_api.common import search from . import models @@ -23,8 +24,21 @@ class LibraryFilter(django_filters.FilterSet): class LibraryTrackFilter(django_filters.FilterSet): library = django_filters.CharFilter("library__uuid") status = django_filters.CharFilter(method="filter_status") - q = fields.SearchFilter( - search_fields=["artist_name", "title", "album_title", "library__actor__domain"] + q = fields.SmartSearchFilter( + config=search.SearchConfig( + search_fields={ + "domain": {"to": "library__actor__domain"}, + "artist": {"to": "artist_name"}, + "album": {"to": "album_title"}, + "title": {"to": "title"}, + }, + filter_fields={ + "domain": {"to": "library__actor__domain"}, + "artist": {"to": "artist_name__iexact"}, + "album": {"to": "album_title__iexact"}, + "title": {"to": "title__iexact"}, + }, + ) ) def filter_status(self, queryset, field_name, value): diff --git a/api/funkwhale_api/federation/models.py b/api/funkwhale_api/federation/models.py index 979b0674a..17ae01376 100644 --- a/api/funkwhale_api/federation/models.py +++ b/api/funkwhale_api/federation/models.py @@ -1,4 +1,3 @@ -import os import tempfile import uuid @@ -9,6 +8,7 @@ from django.db import models from django.utils import timezone from funkwhale_api.common import session +from funkwhale_api.common import utils as common_utils from funkwhale_api.music import utils as music_utils TYPE_CHOICES = [ @@ -20,6 +20,11 @@ TYPE_CHOICES = [ ] +class ActorQuerySet(models.QuerySet): + def local(self, include=True): + return self.exclude(user__isnull=include) + + class Actor(models.Model): ap_type = "Actor" @@ -47,6 +52,8 @@ class Actor(models.Model): related_name="following", ) + objects = ActorQuerySet.as_manager() + class Meta: unique_together = ["domain", "preferred_username"] @@ -141,12 +148,7 @@ class Library(models.Model): ) -def get_file_path(instance, filename): - uid = str(uuid.uuid4()) - chunk_size = 2 - chunks = [uid[i : i + chunk_size] for i in range(0, len(uid), chunk_size)] - parts = chunks[:3] + [filename] - return os.path.join("federation_cache", *parts) +get_file_path = common_utils.ChunkedPath("federation_cache") class LibraryTrack(models.Model): diff --git a/api/funkwhale_api/federation/serializers.py b/api/funkwhale_api/federation/serializers.py index 44de5d312..fc694c598 100644 --- a/api/funkwhale_api/federation/serializers.py +++ b/api/funkwhale_api/federation/serializers.py @@ -1,6 +1,8 @@ import logging +import mimetypes import urllib.parse +from django.core.exceptions import ObjectDoesNotExist from django.core.paginator import Paginator from django.db import transaction from rest_framework import serializers @@ -63,6 +65,15 @@ class ActorSerializer(serializers.Serializer): ret["endpoints"] = {} if instance.shared_inbox_url: ret["endpoints"]["sharedInbox"] = instance.shared_inbox_url + try: + if instance.user.avatar: + ret["icon"] = { + "type": "Image", + "mediaType": mimetypes.guess_type(instance.user.avatar.path)[0], + "url": utils.full_url(instance.user.avatar.crop["400x400"].url), + } + except ObjectDoesNotExist: + pass return ret def prepare_missing_fields(self): diff --git a/api/funkwhale_api/federation/signing.py b/api/funkwhale_api/federation/signing.py index 15525b3e5..1bb2b9d5d 100644 --- a/api/funkwhale_api/federation/signing.py +++ b/api/funkwhale_api/federation/signing.py @@ -1,4 +1,10 @@ +import datetime import logging +import pytz + +from django import forms +from django.utils import timezone +from django.utils.http import parse_http_date import requests import requests_http_signature @@ -7,8 +13,33 @@ from . import exceptions, utils logger = logging.getLogger(__name__) +# the request Date should be between now - 30s and now + 30s +DATE_HEADER_VALID_FOR = 30 + + +def verify_date(raw_date): + if not raw_date: + raise forms.ValidationError("Missing date header") + + try: + ts = parse_http_date(raw_date) + except ValueError as e: + raise forms.ValidationError(str(e)) + dt = datetime.datetime.utcfromtimestamp(ts) + dt = dt.replace(tzinfo=pytz.utc) + delta = datetime.timedelta(seconds=DATE_HEADER_VALID_FOR) + now = timezone.now() + if dt < now - delta or dt > now + delta: + raise forms.ValidationError( + "Request Date is too far in the future or in the past" + ) + + return dt + def verify(request, public_key): + verify_date(request.headers.get("Date")) + return requests_http_signature.HTTPSignatureAuth.verify( request, key_resolver=lambda **kwargs: public_key, use_auth_header=False ) diff --git a/api/funkwhale_api/federation/urls.py b/api/funkwhale_api/federation/urls.py index 2594f5549..319e37bed 100644 --- a/api/funkwhale_api/federation/urls.py +++ b/api/funkwhale_api/federation/urls.py @@ -8,6 +8,7 @@ music_router = routers.SimpleRouter(trailing_slash=False) router.register( r"federation/instance/actors", views.InstanceActorViewSet, "instance-actors" ) +router.register(r"federation/actors", views.ActorViewSet, "actors") router.register(r".well-known", views.WellKnownViewSet, "well-known") music_router.register(r"files", views.MusicFilesViewSet, "files") diff --git a/api/funkwhale_api/federation/utils.py b/api/funkwhale_api/federation/utils.py index e09870223..71f227464 100644 --- a/api/funkwhale_api/federation/utils.py +++ b/api/funkwhale_api/federation/utils.py @@ -5,6 +5,8 @@ def full_url(path): """ Given a relative path, return a full url usable for federation purpose """ + if path.startswith("http://") or path.startswith("https://"): + return path root = settings.FUNKWHALE_URL if path.startswith("/") and root.endswith("/"): return root + path[1:] diff --git a/api/funkwhale_api/federation/views.py b/api/funkwhale_api/federation/views.py index 63a1d7b71..29f566309 100644 --- a/api/funkwhale_api/federation/views.py +++ b/api/funkwhale_api/federation/views.py @@ -32,6 +32,24 @@ class FederationMixin(object): return super().dispatch(request, *args, **kwargs) +class ActorViewSet(FederationMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet): + lookup_field = "user__username" + lookup_value_regex = ".*" + authentication_classes = [authentication.SignatureAuthentication] + permission_classes = [] + renderer_classes = [renderers.ActivityPubRenderer] + queryset = models.Actor.objects.local().select_related("user") + serializer_class = serializers.ActorSerializer + + @detail_route(methods=["get", "post"]) + def inbox(self, request, *args, **kwargs): + return response.Response({}, status=200) + + @detail_route(methods=["get", "post"]) + def outbox(self, request, *args, **kwargs): + return response.Response({}, status=200) + + class InstanceActorViewSet(FederationMixin, viewsets.GenericViewSet): lookup_field = "actor" lookup_value_regex = "[a-z]*" @@ -100,6 +118,8 @@ class WellKnownViewSet(viewsets.GenericViewSet): resource_type, resource = webfinger.clean_resource(request.GET["resource"]) cleaner = getattr(webfinger, "clean_{}".format(resource_type)) result = cleaner(resource) + handler = getattr(self, "handler_{}".format(resource_type)) + data = handler(result) except forms.ValidationError as e: return response.Response({"errors": {"resource": e.message}}, status=400) except KeyError: @@ -107,14 +127,19 @@ class WellKnownViewSet(viewsets.GenericViewSet): {"errors": {"resource": "This field is required"}}, status=400 ) - handler = getattr(self, "handler_{}".format(resource_type)) - data = handler(result) - return response.Response(data) def handler_acct(self, clean_result): username, hostname = clean_result - actor = actors.SYSTEM_ACTORS[username].get_actor_instance() + + if username in actors.SYSTEM_ACTORS: + actor = actors.SYSTEM_ACTORS[username].get_actor_instance() + else: + try: + actor = models.Actor.objects.local().get(user__username=username) + except models.Actor.DoesNotExist: + raise forms.ValidationError("Invalid username") + return serializers.ActorWebfingerSerializer(actor).data diff --git a/api/funkwhale_api/federation/webfinger.py b/api/funkwhale_api/federation/webfinger.py index b899fe207..874b3c158 100644 --- a/api/funkwhale_api/federation/webfinger.py +++ b/api/funkwhale_api/federation/webfinger.py @@ -3,7 +3,7 @@ from django.conf import settings from funkwhale_api.common import session -from . import actors, serializers +from . import serializers VALID_RESOURCE_TYPES = ["acct"] @@ -32,9 +32,6 @@ def clean_acct(acct_string, ensure_local=True): if ensure_local and hostname.lower() != settings.FEDERATION_HOSTNAME: raise forms.ValidationError("Invalid hostname {}".format(hostname)) - if ensure_local and username not in actors.SYSTEM_ACTORS: - raise forms.ValidationError("Invalid username") - return username, hostname diff --git a/api/funkwhale_api/history/serializers.py b/api/funkwhale_api/history/serializers.py index e49322798..2254aee8c 100644 --- a/api/funkwhale_api/history/serializers.py +++ b/api/funkwhale_api/history/serializers.py @@ -1,8 +1,8 @@ from rest_framework import serializers from funkwhale_api.activity import serializers as activity_serializers -from funkwhale_api.music.serializers import TrackActivitySerializer -from funkwhale_api.users.serializers import UserActivitySerializer +from funkwhale_api.music.serializers import TrackActivitySerializer, TrackSerializer +from funkwhale_api.users.serializers import UserActivitySerializer, UserBasicSerializer from . import models @@ -25,6 +25,20 @@ class ListeningActivitySerializer(activity_serializers.ModelSerializer): class ListeningSerializer(serializers.ModelSerializer): + track = TrackSerializer(read_only=True) + user = UserBasicSerializer(read_only=True) + + class Meta: + model = models.Listening + fields = ("id", "user", "track", "creation_date") + + def create(self, validated_data): + validated_data["user"] = self.context["user"] + + return super().create(validated_data) + + +class ListeningWriteSerializer(serializers.ModelSerializer): class Meta: model = models.Listening fields = ("id", "user", "track", "creation_date") diff --git a/api/funkwhale_api/history/views.py b/api/funkwhale_api/history/views.py index e104a2aa3..6c7ef3991 100644 --- a/api/funkwhale_api/history/views.py +++ b/api/funkwhale_api/history/views.py @@ -1,17 +1,36 @@ -from rest_framework import mixins, permissions, viewsets +from rest_framework import mixins, viewsets +from rest_framework.permissions import IsAuthenticatedOrReadOnly from funkwhale_api.activity import record +from funkwhale_api.common import fields, permissions from . import models, serializers class ListeningViewSet( - mixins.CreateModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet + mixins.CreateModelMixin, + mixins.ListModelMixin, + mixins.RetrieveModelMixin, + viewsets.GenericViewSet, ): serializer_class = serializers.ListeningSerializer - queryset = models.Listening.objects.all() - permission_classes = [permissions.IsAuthenticated] + queryset = ( + models.Listening.objects.all() + .select_related("track__artist", "track__album__artist", "user") + .prefetch_related("track__files") + ) + permission_classes = [ + permissions.ConditionalAuthentication, + permissions.OwnerPermission, + IsAuthenticatedOrReadOnly, + ] + owner_checks = ["write"] + + def get_serializer_class(self): + if self.request.method.lower() in ["head", "get", "options"]: + return serializers.ListeningSerializer + return serializers.ListeningWriteSerializer def perform_create(self, serializer): r = super().perform_create(serializer) @@ -20,7 +39,9 @@ class ListeningViewSet( def get_queryset(self): queryset = super().get_queryset() - return queryset.filter(user=self.request.user) + return queryset.filter( + fields.privacy_level_query(self.request.user, "user__privacy_level") + ) def get_serializer_context(self): context = super().get_serializer_context() diff --git a/api/funkwhale_api/music/filters.py b/api/funkwhale_api/music/filters.py index 1f73fc9b0..87537b675 100644 --- a/api/funkwhale_api/music/filters.py +++ b/api/funkwhale_api/music/filters.py @@ -6,19 +6,9 @@ from funkwhale_api.common import fields from . import models -class ListenableMixin(filters.FilterSet): - listenable = filters.BooleanFilter(name="_", method="filter_listenable") - - def filter_listenable(self, queryset, name, value): - queryset = queryset.annotate(files_count=Count("tracks__files")) - if value: - return queryset.filter(files_count__gt=0) - else: - return queryset.filter(files_count=0) - - -class ArtistFilter(ListenableMixin): +class ArtistFilter(filters.FilterSet): q = fields.SearchFilter(search_fields=["name"]) + listenable = filters.BooleanFilter(name="_", method="filter_listenable") class Meta: model = models.Artist @@ -27,6 +17,13 @@ class ArtistFilter(ListenableMixin): "listenable": "exact", } + def filter_listenable(self, queryset, name, value): + queryset = queryset.annotate(files_count=Count("albums__tracks__files")) + if value: + return queryset.filter(files_count__gt=0) + else: + return queryset.filter(files_count=0) + class TrackFilter(filters.FilterSet): q = fields.SearchFilter(search_fields=["title", "album__title", "artist__name"]) @@ -72,10 +69,17 @@ class ImportJobFilter(filters.FilterSet): } -class AlbumFilter(ListenableMixin): +class AlbumFilter(filters.FilterSet): listenable = filters.BooleanFilter(name="_", method="filter_listenable") q = fields.SearchFilter(search_fields=["title", "artist__name" "source"]) class Meta: model = models.Album fields = ["listenable", "q", "artist"] + + def filter_listenable(self, queryset, name, value): + queryset = queryset.annotate(files_count=Count("tracks__files")) + if value: + return queryset.filter(files_count__gt=0) + else: + return queryset.filter(files_count=0) diff --git a/api/funkwhale_api/music/importers.py b/api/funkwhale_api/music/importers.py index ce7ded02b..fc4a98241 100644 --- a/api/funkwhale_api/music/importers.py +++ b/api/funkwhale_api/music/importers.py @@ -3,12 +3,19 @@ def load(model, *args, **kwargs): return importer.load(*args, **kwargs) +EXCLUDE_VALIDATION = {"Track": ["artist"]} + + class Importer(object): def __init__(self, model): self.model = model def load(self, cleaned_data, raw_data, import_hooks): mbid = cleaned_data.pop("mbid") + # let's validate data, just in case + instance = self.model(**cleaned_data) + exclude = EXCLUDE_VALIDATION.get(self.model.__name__, []) + instance.full_clean(exclude=["mbid", "uuid"] + exclude) m = self.model.objects.update_or_create(mbid=mbid, defaults=cleaned_data)[0] for hook in import_hooks: hook(m, cleaned_data, raw_data) diff --git a/api/funkwhale_api/music/management/commands/fix_track_files.py b/api/funkwhale_api/music/management/commands/fix_track_files.py index 988f9bed3..c61972db8 100644 --- a/api/funkwhale_api/music/management/commands/fix_track_files.py +++ b/api/funkwhale_api/music/management/commands/fix_track_files.py @@ -1,4 +1,3 @@ -import cacheops from django.core.management.base import BaseCommand from django.db import transaction from django.db.models import Q @@ -24,7 +23,6 @@ class Command(BaseCommand): self.fix_mimetypes(**options) self.fix_file_data(**options) self.fix_file_size(**options) - cacheops.invalidate_model(models.TrackFile) @transaction.atomic def fix_mimetypes(self, dry_run, **kwargs): diff --git a/api/funkwhale_api/music/models.py b/api/funkwhale_api/music/models.py index d533d8525..c8dd61313 100644 --- a/api/funkwhale_api/music/models.py +++ b/api/funkwhale_api/music/models.py @@ -15,7 +15,9 @@ from django.dispatch import receiver from django.urls import reverse from django.utils import timezone from taggit.managers import TaggableManager + from versatileimagefield.fields import VersatileImageField +from versatileimagefield.image_warmer import VersatileImageFieldWarmer from funkwhale_api import downloader, musicbrainz from funkwhale_api.federation import utils as federation_utils @@ -319,9 +321,10 @@ class Track(APIModelMixin): "mbid": {"musicbrainz_field_name": "id"}, "title": {"musicbrainz_field_name": "title"}, "artist": { - # we use the artist from the release to avoid #237 - "musicbrainz_field_name": "release-list", - "converter": get_artist, + "musicbrainz_field_name": "artist-credit", + "converter": lambda v: Artist.get_or_create_from_api( + mbid=v[0]["artist"]["id"] + )[0], }, "album": {"musicbrainz_field_name": "release-list", "converter": import_album}, } @@ -389,19 +392,37 @@ class Track(APIModelMixin): tracks = [t for m in data["release"]["medium-list"] for t in m["track-list"]] track_data = None for track in tracks: - if track["recording"]["id"] == mbid: + if track["recording"]["id"] == str(mbid): track_data = track break if not track_data: raise ValueError("No track found matching this ID") + track_artist_mbid = None + for ac in track_data["recording"]["artist-credit"]: + try: + ac_mbid = ac["artist"]["id"] + except TypeError: + # it's probably a string, like "feat." + continue + + if ac_mbid == str(album.artist.mbid): + continue + + track_artist_mbid = ac_mbid + break + track_artist_mbid = track_artist_mbid or album.artist.mbid + if track_artist_mbid == str(album.artist.mbid): + track_artist = album.artist + else: + track_artist = Artist.get_or_create_from_api(track_artist_mbid)[0] return cls.objects.update_or_create( mbid=mbid, defaults={ "position": int(track["position"]), "title": track["recording"]["title"], "album": album, - "artist": album.artist, + "artist": track_artist, }, ) @@ -622,3 +643,13 @@ def update_request_status(sender, instance, created, **kwargs): # let's mark the request as imported since the import is over instance.import_request.status = "imported" return instance.import_request.save(update_fields=["status"]) + + +@receiver(models.signals.post_save, sender=Album) +def warm_album_covers(sender, instance, **kwargs): + if not instance.cover: + return + album_covers_warmer = VersatileImageFieldWarmer( + instance_or_queryset=instance, rendition_key_set="square", image_attr="cover" + ) + num_created, failed_to_create = album_covers_warmer.warm() diff --git a/api/funkwhale_api/music/serializers.py b/api/funkwhale_api/music/serializers.py index c34970d0b..0661eb8f4 100644 --- a/api/funkwhale_api/music/serializers.py +++ b/api/funkwhale_api/music/serializers.py @@ -1,6 +1,7 @@ from django.db.models import Q from rest_framework import serializers from taggit.models import Tag +from versatileimagefield.serializers import VersatileImageFieldSerializer from funkwhale_api.activity import serializers as activity_serializers from funkwhale_api.users.serializers import UserBasicSerializer @@ -8,8 +9,12 @@ from funkwhale_api.users.serializers import UserBasicSerializer from . import models, tasks +cover_field = VersatileImageFieldSerializer(allow_null=True, sizes="square") + + class ArtistAlbumSerializer(serializers.ModelSerializer): tracks_count = serializers.SerializerMethodField() + cover = cover_field class Meta: model = models.Album @@ -60,8 +65,15 @@ class TrackFileSerializer(serializers.ModelSerializer): return url +class ArtistSimpleSerializer(serializers.ModelSerializer): + class Meta: + model = models.Artist + fields = ("id", "mbid", "name", "creation_date") + + class AlbumTrackSerializer(serializers.ModelSerializer): files = TrackFileSerializer(many=True, read_only=True) + artist = ArtistSimpleSerializer(read_only=True) class Meta: model = models.Track @@ -77,15 +89,10 @@ class AlbumTrackSerializer(serializers.ModelSerializer): ) -class ArtistSimpleSerializer(serializers.ModelSerializer): - class Meta: - model = models.Artist - fields = ("id", "mbid", "name", "creation_date") - - class AlbumSerializer(serializers.ModelSerializer): tracks = serializers.SerializerMethodField() artist = ArtistSimpleSerializer(read_only=True) + cover = cover_field class Meta: model = models.Album @@ -110,6 +117,7 @@ class AlbumSerializer(serializers.ModelSerializer): class TrackAlbumSerializer(serializers.ModelSerializer): artist = ArtistSimpleSerializer(read_only=True) + cover = cover_field class Meta: model = models.Album @@ -155,6 +163,8 @@ class TagSerializer(serializers.ModelSerializer): class SimpleAlbumSerializer(serializers.ModelSerializer): + cover = cover_field + class Meta: model = models.Album fields = ("id", "mbid", "title", "release_date", "cover") diff --git a/api/funkwhale_api/music/utils.py b/api/funkwhale_api/music/utils.py index 3080c1c6c..30f62f348 100644 --- a/api/funkwhale_api/music/utils.py +++ b/api/funkwhale_api/music/utils.py @@ -1,47 +1,9 @@ import mimetypes -import re import magic import mutagen -from django.db.models import Q - -def normalize_query( - query_string, - findterms=re.compile(r'"([^"]+)"|(\S+)').findall, - normspace=re.compile(r"\s{2,}").sub, -): - """ Splits the query string in invidual keywords, getting rid of unecessary spaces - and grouping quoted words together. - Example: - - >>> normalize_query(' some random words "with quotes " and spaces') - ['some', 'random', 'words', 'with quotes', 'and', 'spaces'] - - """ - return [normspace(" ", (t[0] or t[1]).strip()) for t in findterms(query_string)] - - -def get_query(query_string, search_fields): - """ Returns a query, that is a combination of Q objects. That combination - aims to search keywords within a model by testing the given search fields. - - """ - query = None # Query to search for every search term - terms = normalize_query(query_string) - for term in terms: - or_query = None # Query to search for a given term in each field - for field_name in search_fields: - q = Q(**{"%s__icontains" % field_name: term}) - if or_query is None: - or_query = q - else: - or_query = or_query | q - if query is None: - query = or_query - else: - query = query & or_query - return query +from funkwhale_api.common.search import normalize_query, get_query # noqa def guess_mimetype(f): diff --git a/api/funkwhale_api/playlists/filters.py b/api/funkwhale_api/playlists/filters.py index ae9f0226f..144b0f049 100644 --- a/api/funkwhale_api/playlists/filters.py +++ b/api/funkwhale_api/playlists/filters.py @@ -1,3 +1,4 @@ +from django.db.models import Count from django_filters import rest_framework as filters from funkwhale_api.music import utils @@ -7,10 +8,23 @@ from . import models class PlaylistFilter(filters.FilterSet): q = filters.CharFilter(name="_", method="filter_q") + listenable = filters.BooleanFilter(name="_", method="filter_listenable") class Meta: model = models.Playlist - fields = {"user": ["exact"], "name": ["exact", "icontains"], "q": "exact"} + fields = { + "user": ["exact"], + "name": ["exact", "icontains"], + "q": "exact", + "listenable": "exact", + } + + def filter_listenable(self, queryset, name, value): + queryset = queryset.annotate(plts_count=Count("playlist_tracks")) + if value: + return queryset.filter(plts_count__gt=0) + else: + return queryset.filter(plts_count=0) def filter_q(self, queryset, name, value): query = utils.get_query(value, ["name", "user__username"]) diff --git a/api/funkwhale_api/playlists/models.py b/api/funkwhale_api/playlists/models.py index e9df4624d..d2504d848 100644 --- a/api/funkwhale_api/playlists/models.py +++ b/api/funkwhale_api/playlists/models.py @@ -3,12 +3,41 @@ from django.utils import timezone from rest_framework import exceptions from funkwhale_api.common import fields, preferences +from funkwhale_api.music import models as music_models class PlaylistQuerySet(models.QuerySet): def with_tracks_count(self): return self.annotate(_tracks_count=models.Count("playlist_tracks")) + def with_duration(self): + return self.annotate( + duration=models.Sum("playlist_tracks__track__files__duration") + ) + + def with_covers(self): + album_prefetch = models.Prefetch( + "album", queryset=music_models.Album.objects.only("cover") + ) + track_prefetch = models.Prefetch( + "track", + queryset=music_models.Track.objects.prefetch_related(album_prefetch).only( + "id", "album_id" + ), + ) + + plt_prefetch = models.Prefetch( + "playlist_tracks", + queryset=PlaylistTrack.objects.all() + .exclude(track__album__cover=None) + .exclude(track__album__cover="") + .order_by("index") + .only("id", "playlist_id", "track_id") + .prefetch_related(track_prefetch), + to_attr="plts_for_cover", + ) + return self.prefetch_related(plt_prefetch) + class Playlist(models.Model): name = models.CharField(max_length=50) diff --git a/api/funkwhale_api/playlists/serializers.py b/api/funkwhale_api/playlists/serializers.py index 17cc06b10..a60a34938 100644 --- a/api/funkwhale_api/playlists/serializers.py +++ b/api/funkwhale_api/playlists/serializers.py @@ -65,6 +65,8 @@ class PlaylistTrackWriteSerializer(serializers.ModelSerializer): class PlaylistSerializer(serializers.ModelSerializer): tracks_count = serializers.SerializerMethodField(read_only=True) + duration = serializers.SerializerMethodField(read_only=True) + album_covers = serializers.SerializerMethodField(read_only=True) user = UserBasicSerializer(read_only=True) class Meta: @@ -72,11 +74,13 @@ class PlaylistSerializer(serializers.ModelSerializer): fields = ( "id", "name", - "tracks_count", "user", "modification_date", "creation_date", "privacy_level", + "tracks_count", + "album_covers", + "duration", ) read_only_fields = ["id", "modification_date", "creation_date"] @@ -87,6 +91,36 @@ class PlaylistSerializer(serializers.ModelSerializer): # no annotation? return obj.playlist_tracks.count() + def get_duration(self, obj): + try: + return obj.duration + except AttributeError: + # no annotation? + return 0 + + def get_album_covers(self, obj): + try: + plts = obj.plts_for_cover + except AttributeError: + return [] + + covers = [] + max_covers = 5 + for plt in plts: + url = plt.track.album.cover.crop["200x200"].url + if url in covers: + continue + covers.append(url) + if len(covers) >= max_covers: + break + + full_urls = [] + for url in covers: + if "request" in self.context: + url = self.context["request"].build_absolute_uri(url) + full_urls.append(url) + return full_urls + class PlaylistAddManySerializer(serializers.Serializer): tracks = serializers.PrimaryKeyRelatedField( diff --git a/api/funkwhale_api/playlists/views.py b/api/funkwhale_api/playlists/views.py index 21e35f50a..8db076a86 100644 --- a/api/funkwhale_api/playlists/views.py +++ b/api/funkwhale_api/playlists/views.py @@ -24,6 +24,8 @@ class PlaylistViewSet( models.Playlist.objects.all() .select_related("user") .annotate(tracks_count=Count("playlist_tracks")) + .with_covers() + .with_duration() ) permission_classes = [ permissions.ConditionalAuthentication, diff --git a/api/funkwhale_api/providers/audiofile/management/commands/import_files.py b/api/funkwhale_api/providers/audiofile/management/commands/import_files.py index b59c0046f..2aba0c145 100644 --- a/api/funkwhale_api/providers/audiofile/management/commands/import_files.py +++ b/api/funkwhale_api/providers/audiofile/management/commands/import_files.py @@ -82,10 +82,31 @@ class Command(BaseCommand): try: for import_path in options["path"]: matching += glob.glob(import_path, **glob_kwargs) - matching = sorted(list(set(matching))) + raw_matching = sorted(list(set(matching))) except TypeError: raise Exception("You need Python 3.5 to use the --recursive flag") + matching = [] + for m in raw_matching: + # In some situations, the path is encoded incorrectly on the filesystem + # so we filter out faulty paths and display a warning to the user. + # see https://code.eliotberriot.com/funkwhale/funkwhale/issues/138 + try: + m.encode("utf-8") + matching.append(m) + except UnicodeEncodeError: + try: + previous = matching[-1] + except IndexError: + previous = None + self.stderr.write( + self.style.WARNING( + "[warning] Ignoring undecodable path. Previous ok file was {}".format( + previous + ) + ) + ) + if options["in_place"]: self.stdout.write( "Checking imported paths against settings.MUSIC_DIRECTORY_PATH" diff --git a/api/funkwhale_api/subsonic/authentication.py b/api/funkwhale_api/subsonic/authentication.py index a573a1092..d6edb90cd 100644 --- a/api/funkwhale_api/subsonic/authentication.py +++ b/api/funkwhale_api/subsonic/authentication.py @@ -19,7 +19,7 @@ def authenticate(username, password): password = password.replace("enc:", "", 1) password = binascii.unhexlify(password).decode("utf-8") user = User.objects.get( - username=username, is_active=True, subsonic_api_token=password + username__iexact=username, is_active=True, subsonic_api_token=password ) except (User.DoesNotExist, binascii.Error): raise exceptions.AuthenticationFailed("Wrong username or password.") diff --git a/api/funkwhale_api/users/admin.py b/api/funkwhale_api/users/admin.py index 205c7c367..365db615e 100644 --- a/api/funkwhale_api/users/admin.py +++ b/api/funkwhale_api/users/admin.py @@ -56,7 +56,10 @@ class UserAdmin(AuthUserAdmin): fieldsets = ( (None, {"fields": ("username", "password", "privacy_level")}), - (_("Personal info"), {"fields": ("first_name", "last_name", "email")}), + ( + _("Personal info"), + {"fields": ("first_name", "last_name", "email", "avatar")}, + ), ( _("Permissions"), { diff --git a/api/funkwhale_api/users/factories.py b/api/funkwhale_api/users/factories.py index 5fceb57bb..9bef1da1c 100644 --- a/api/funkwhale_api/users/factories.py +++ b/api/funkwhale_api/users/factories.py @@ -4,6 +4,8 @@ from django.utils import timezone from funkwhale_api.factories import ManyToManyFromList, registry +from . import models + @registry.register class GroupFactory(factory.django.DjangoModelFactory): @@ -47,6 +49,7 @@ class UserFactory(factory.django.DjangoModelFactory): password = factory.PostGenerationMethodCall("set_password", "test") subsonic_api_token = None groups = ManyToManyFromList("groups") + avatar = factory.django.ImageField() class Meta: model = "users.User" @@ -71,6 +74,14 @@ class UserFactory(factory.django.DjangoModelFactory): # A list of permissions were passed in, use them self.user_permissions.add(*perms) + @factory.post_generation + def with_actor(self, create, extracted, **kwargs): + if not create or not extracted: + return + self.actor = models.create_actor(self) + self.save(update_fields=["actor"]) + return self.actor + @registry.register(name="users.SuperUser") class SuperUserFactory(UserFactory): diff --git a/api/funkwhale_api/users/migrations/0010_user_avatar.py b/api/funkwhale_api/users/migrations/0010_user_avatar.py new file mode 100644 index 000000000..da60439be --- /dev/null +++ b/api/funkwhale_api/users/migrations/0010_user_avatar.py @@ -0,0 +1,20 @@ +# Generated by Django 2.0.6 on 2018-07-10 20:09 + +from django.db import migrations, models +import funkwhale_api.common.utils +import funkwhale_api.common.validators + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0009_auto_20180619_2024'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='avatar', + field=models.ImageField(blank=True, max_length=150, null=True, upload_to=funkwhale_api.common.utils.ChunkedPath('users/avatars'), validators=[funkwhale_api.common.validators.ImageDimensionsValidator(max_height=400, max_width=400, min_height=50, min_width=50)]), + ), + ] diff --git a/api/funkwhale_api/users/migrations/0011_auto_20180721_1317.py b/api/funkwhale_api/users/migrations/0011_auto_20180721_1317.py new file mode 100644 index 000000000..5b5a1cabc --- /dev/null +++ b/api/funkwhale_api/users/migrations/0011_auto_20180721_1317.py @@ -0,0 +1,28 @@ +# Generated by Django 2.0.7 on 2018-07-21 13:17 + +from django.db import migrations, models +import django.db.models.deletion +import funkwhale_api.common.utils +import funkwhale_api.common.validators +import versatileimagefield.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('federation', '0006_auto_20180521_1702'), + ('users', '0010_user_avatar'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='actor', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='user', to='federation.Actor'), + ), + migrations.AlterField( + model_name='user', + name='avatar', + field=versatileimagefield.fields.VersatileImageField(blank=True, max_length=150, null=True, upload_to=funkwhale_api.common.utils.ChunkedPath('users/avatars', preserve_file_name=False), validators=[funkwhale_api.common.validators.ImageDimensionsValidator(min_height=50, min_width=50), funkwhale_api.common.validators.FileValidator(allowed_extensions=['png', 'jpg', 'jpeg', 'gif'], max_size=2097152)]), + ), + ] diff --git a/api/funkwhale_api/users/models.py b/api/funkwhale_api/users/models.py index ec9c39fd6..26ffb5a94 100644 --- a/api/funkwhale_api/users/models.py +++ b/api/funkwhale_api/users/models.py @@ -11,12 +11,21 @@ import uuid from django.conf import settings from django.contrib.auth.models import AbstractUser from django.db import models +from django.dispatch import receiver from django.urls import reverse from django.utils import timezone from django.utils.encoding import python_2_unicode_compatible from django.utils.translation import ugettext_lazy as _ +from versatileimagefield.fields import VersatileImageField +from versatileimagefield.image_warmer import VersatileImageFieldWarmer + from funkwhale_api.common import fields, preferences +from funkwhale_api.common import utils as common_utils +from funkwhale_api.common import validators as common_validators +from funkwhale_api.federation import keys +from funkwhale_api.federation import models as federation_models +from funkwhale_api.federation import utils as federation_utils def get_token(): @@ -39,6 +48,9 @@ PERMISSIONS_CONFIGURATION = { PERMISSIONS = sorted(PERMISSIONS_CONFIGURATION.keys()) +get_file_path = common_utils.ChunkedPath("users/avatars", preserve_file_name=False) + + @python_2_unicode_compatible class User(AbstractUser): @@ -88,6 +100,26 @@ class User(AbstractUser): blank=True, on_delete=models.SET_NULL, ) + avatar = VersatileImageField( + upload_to=get_file_path, + null=True, + blank=True, + max_length=150, + validators=[ + common_validators.ImageDimensionsValidator(min_width=50, min_height=50), + common_validators.FileValidator( + allowed_extensions=["png", "jpg", "jpeg", "gif"], + max_size=1024 * 1024 * 2, + ), + ], + ) + actor = models.OneToOneField( + "federation.Actor", + related_name="user", + on_delete=models.SET_NULL, + null=True, + blank=True, + ) def __str__(self): return self.username @@ -185,3 +217,41 @@ class Invitation(models.Model): ) return super().save(**kwargs) + + +def create_actor(user): + username = user.username + private, public = keys.get_key_pair() + args = { + "preferred_username": username, + "domain": settings.FEDERATION_HOSTNAME, + "type": "Person", + "name": username, + "manually_approves_followers": False, + "url": federation_utils.full_url( + reverse("federation:actors-detail", kwargs={"user__username": username}) + ), + "shared_inbox_url": federation_utils.full_url( + reverse("federation:actors-inbox", kwargs={"user__username": username}) + ), + "inbox_url": federation_utils.full_url( + reverse("federation:actors-inbox", kwargs={"user__username": username}) + ), + "outbox_url": federation_utils.full_url( + reverse("federation:actors-outbox", kwargs={"user__username": username}) + ), + } + args["private_key"] = private.decode("utf-8") + args["public_key"] = public.decode("utf-8") + + return federation_models.Actor.objects.create(**args) + + +@receiver(models.signals.post_save, sender=User) +def warm_user_avatar(sender, instance, **kwargs): + if not instance.avatar: + return + user_avatar_warmer = VersatileImageFieldWarmer( + instance_or_queryset=instance, rendition_key_set="square", image_attr="avatar" + ) + num_created, failed_to_create = user_avatar_warmer.warm() diff --git a/api/funkwhale_api/users/serializers.py b/api/funkwhale_api/users/serializers.py index 438951265..2f2271584 100644 --- a/api/funkwhale_api/users/serializers.py +++ b/api/funkwhale_api/users/serializers.py @@ -1,13 +1,33 @@ +import re + from django.conf import settings +from django.core import validators +from django.utils.deconstruct import deconstructible +from django.utils.translation import gettext_lazy as _ + from rest_auth.serializers import PasswordResetSerializer as PRS from rest_auth.registration.serializers import RegisterSerializer as RS from rest_framework import serializers +from versatileimagefield.serializers import VersatileImageFieldSerializer from funkwhale_api.activity import serializers as activity_serializers from . import models +@deconstructible +class ASCIIUsernameValidator(validators.RegexValidator): + regex = r"^[\w]+$" + message = _( + "Enter a valid username. This value may contain only English letters, " + "numbers, and _ characters." + ) + flags = re.ASCII + + +username_validators = [ASCIIUsernameValidator()] + + class RegisterSerializer(RS): invitation = serializers.CharField( required=False, allow_null=True, allow_blank=True @@ -27,6 +47,9 @@ class RegisterSerializer(RS): if self.validated_data.get("invitation"): user.invitation = self.validated_data.get("invitation") user.save(update_fields=["invitation"]) + user.actor = models.create_actor(user) + user.save(update_fields=["actor"]) + return user @@ -43,21 +66,29 @@ class UserActivitySerializer(activity_serializers.ModelSerializer): return "Person" +avatar_field = VersatileImageFieldSerializer(allow_null=True, sizes="square") + + class UserBasicSerializer(serializers.ModelSerializer): + avatar = avatar_field + class Meta: model = models.User - fields = ["id", "username", "name", "date_joined"] + fields = ["id", "username", "name", "date_joined", "avatar"] class UserWriteSerializer(serializers.ModelSerializer): + avatar = avatar_field + class Meta: model = models.User - fields = ["name", "privacy_level"] + fields = ["name", "privacy_level", "avatar"] class UserReadSerializer(serializers.ModelSerializer): permissions = serializers.SerializerMethodField() + avatar = avatar_field class Meta: model = models.User @@ -71,6 +102,7 @@ class UserReadSerializer(serializers.ModelSerializer): "permissions", "date_joined", "privacy_level", + "avatar", ] def get_permissions(self, o): diff --git a/api/requirements.pac b/api/requirements.pac new file mode 100644 index 000000000..7e7cb8a0d --- /dev/null +++ b/api/requirements.pac @@ -0,0 +1,6 @@ +curl +file +ffmpeg +libjpeg-turbo +libpqxx +python diff --git a/api/requirements/base.txt b/api/requirements/base.txt index 13c0efdbc..e4a85d99f 100644 --- a/api/requirements/base.txt +++ b/api/requirements/base.txt @@ -37,7 +37,7 @@ oauth2client<4 google-api-python-client>=1.6,<1.7 arrow>=0.12,<0.13 persisting-theory>=0.2,<0.3 -django-versatileimagefield>=1.8,<1.9 +django-versatileimagefield>=1.9,<1.10 django-filter>=1.1,<1.2 django-rest-auth>=0.9,<0.10 beautifulsoup4>=4.6,<4.7 @@ -58,7 +58,6 @@ python-magic==0.4.15 ffmpeg-python==0.1.10 channels>=2,<2.1 channels_redis>=2.1,<2.2 -django-cacheops>=4,<4.1 daphne==2.0.4 cryptography>=2,<3 diff --git a/api/setup.cfg b/api/setup.cfg index 18e34bc35..aa9a57abb 100644 --- a/api/setup.cfg +++ b/api/setup.cfg @@ -18,5 +18,4 @@ env = EMAIL_CONFIG=consolemail:// CELERY_BROKER_URL=memory:// CELERY_TASK_ALWAYS_EAGER=True - CACHEOPS_ENABLED=False FEDERATION_HOSTNAME=test.federation diff --git a/api/tests/common/test_search.py b/api/tests/common/test_search.py new file mode 100644 index 000000000..e5be7bc90 --- /dev/null +++ b/api/tests/common/test_search.py @@ -0,0 +1,83 @@ +import pytest + +from django.db.models import Q + +from funkwhale_api.common import search +from funkwhale_api.music import models as music_models + + +@pytest.mark.parametrize( + "query,expected", + [ + ("", [music_models.Album, music_models.Artist]), + ("is:album", [music_models.Album]), + ("is:artist is:album", [music_models.Artist, music_models.Album]), + ], +) +def test_search_config_is(query, expected): + s = search.SearchConfig( + types=[("album", music_models.Album), ("artist", music_models.Artist)] + ) + + cleaned = s.clean(query) + assert cleaned["types"] == expected + + +@pytest.mark.parametrize( + "query,expected", + [ + ("", None), + ("hello world", search.get_query("hello world", ["f1", "f2", "f3"])), + ("hello in:field2", search.get_query("hello", ["f2"])), + ("hello in:field1,field2", search.get_query("hello", ["f1", "f2"])), + ], +) +def test_search_config_query(query, expected): + s = search.SearchConfig( + search_fields={ + "field1": {"to": "f1"}, + "field2": {"to": "f2"}, + "field3": {"to": "f3"}, + } + ) + + cleaned = s.clean(query) + assert cleaned["search_query"] == expected + + +@pytest.mark.parametrize( + "query,expected", + [ + ("", None), + ("status:pending", Q(status="pending")), + ('user:"silent bob"', Q(user__username__iexact="silent bob")), + ( + "user:me status:pending", + Q(user__username__iexact="me") & Q(status="pending"), + ), + ], +) +def test_search_config_filter(query, expected): + s = search.SearchConfig( + filter_fields={ + "user": {"to": "user__username__iexact"}, + "status": {"to": "status"}, + } + ) + + cleaned = s.clean(query) + assert cleaned["filter_query"] == expected + + +def test_apply(): + cleaned = { + "filter_query": Q(batch__submitted_by__username__iexact="me"), + "search_query": Q(source="test"), + } + result = search.apply(music_models.ImportJob.objects.all(), cleaned) + + assert str(result.query) == str( + music_models.ImportJob.objects.filter( + Q(batch__submitted_by__username__iexact="me"), Q(source="test") + ).query + ) diff --git a/api/tests/conftest.py b/api/tests/conftest.py index aa36e1f76..fc7e11947 100644 --- a/api/tests/conftest.py +++ b/api/tests/conftest.py @@ -1,4 +1,7 @@ import datetime +import io +import PIL +import random import shutil import tempfile @@ -258,3 +261,14 @@ def now(mocker): now = timezone.now() mocker.patch("django.utils.timezone.now", return_value=now) return now + + +@pytest.fixture() +def avatar(): + i = PIL.Image.new("RGBA", (400, 400), random.choice(["red", "blue", "yellow"])) + f = io.BytesIO() + i.save(f, "png") + f.name = "avatar.png" + f.seek(0) + yield f + f.close() diff --git a/api/tests/favorites/test_favorites.py b/api/tests/favorites/test_favorites.py index cd75b0d26..0b99c9340 100644 --- a/api/tests/favorites/test_favorites.py +++ b/api/tests/favorites/test_favorites.py @@ -4,6 +4,8 @@ import pytest from django.urls import reverse from funkwhale_api.favorites.models import TrackFavorite +from funkwhale_api.music import serializers as music_serializers +from funkwhale_api.users import serializers as users_serializers def test_user_can_add_favorite(factories): @@ -15,21 +17,26 @@ def test_user_can_add_favorite(factories): assert f.user == user -def test_user_can_get_his_favorites(factories, logged_in_client, client): +def test_user_can_get_his_favorites(api_request, factories, logged_in_client, client): + r = api_request.get("/") favorite = factories["favorites.TrackFavorite"](user=logged_in_client.user) + factories["favorites.TrackFavorite"]() url = reverse("api:v1:favorites:tracks-list") - response = logged_in_client.get(url) - + response = logged_in_client.get(url, {"user": logged_in_client.user.pk}) expected = [ { - "track": favorite.track.pk, + "user": users_serializers.UserBasicSerializer( + favorite.user, context={"request": r} + ).data, + "track": music_serializers.TrackSerializer( + favorite.track, context={"request": r} + ).data, "id": favorite.id, "creation_date": favorite.creation_date.isoformat().replace("+00:00", "Z"), } ] - parsed_json = json.loads(response.content.decode("utf-8")) - - assert expected == parsed_json["results"] + assert response.status_code == 200 + assert response.data["results"] == expected def test_user_can_add_favorite_via_api(factories, logged_in_client, activity_muted): diff --git a/api/tests/favorites/test_views.py b/api/tests/favorites/test_views.py new file mode 100644 index 000000000..7c3aed402 --- /dev/null +++ b/api/tests/favorites/test_views.py @@ -0,0 +1,13 @@ +import pytest + +from django.urls import reverse + + +@pytest.mark.parametrize("level", ["instance", "me", "followers"]) +def test_privacy_filter(preferences, level, factories, api_client): + preferences["common__api_authentication_required"] = False + factories["favorites.TrackFavorite"](user__privacy_level=level) + url = reverse("api:v1:favorites:tracks-list") + response = api_client.get(url) + assert response.status_code == 200 + assert response.data["count"] == 0 diff --git a/api/tests/federation/test_serializers.py b/api/tests/federation/test_serializers.py index e966d1711..6b14656ba 100644 --- a/api/tests/federation/test_serializers.py +++ b/api/tests/federation/test_serializers.py @@ -681,3 +681,56 @@ def test_tapi_library_track_serializer_import_pending(factories): serializer = serializers.APILibraryTrackSerializer(lt) assert serializer.get_status(lt) == "import_pending" + + +def test_local_actor_serializer_to_ap(factories): + expected = { + "@context": [ + "https://www.w3.org/ns/activitystreams", + "https://w3id.org/security/v1", + {}, + ], + "id": "https://test.federation/user", + "type": "Person", + "following": "https://test.federation/user/following", + "followers": "https://test.federation/user/followers", + "inbox": "https://test.federation/user/inbox", + "outbox": "https://test.federation/user/outbox", + "preferredUsername": "user", + "name": "Real User", + "summary": "Hello world", + "manuallyApprovesFollowers": False, + "publicKey": { + "id": "https://test.federation/user#main-key", + "owner": "https://test.federation/user", + "publicKeyPem": "yolo", + }, + "endpoints": {"sharedInbox": "https://test.federation/inbox"}, + } + ac = models.Actor.objects.create( + url=expected["id"], + inbox_url=expected["inbox"], + outbox_url=expected["outbox"], + shared_inbox_url=expected["endpoints"]["sharedInbox"], + followers_url=expected["followers"], + following_url=expected["following"], + public_key=expected["publicKey"]["publicKeyPem"], + preferred_username=expected["preferredUsername"], + name=expected["name"], + domain="test.federation", + summary=expected["summary"], + type="Person", + manually_approves_followers=False, + ) + user = factories["users.User"]() + user.actor = ac + user.save() + ac.refresh_from_db() + expected["icon"] = { + "type": "Image", + "mediaType": "image/jpeg", + "url": utils.full_url(user.avatar.crop["400x400"].url), + } + serializer = serializers.ActorSerializer(ac) + + assert serializer.data == expected diff --git a/api/tests/federation/test_signing.py b/api/tests/federation/test_signing.py index 159f31cd9..298462142 100644 --- a/api/tests/federation/test_signing.py +++ b/api/tests/federation/test_signing.py @@ -1,4 +1,7 @@ import cryptography.exceptions +import datetime +from django.utils.http import http_date +from django import forms import pytest from funkwhale_api.federation import keys, signing @@ -36,6 +39,20 @@ def test_verify_fails_with_wrong_key(nodb_factories): signing.verify(prepared_request, wrong_public) +def test_verify_fails_with_wrong_date(nodb_factories, now): + too_old = now - datetime.timedelta(seconds=31) + too_old = http_date(too_old.timestamp()) + private, public = nodb_factories["federation.KeyPair"]() + auth = nodb_factories["federation.SignatureAuth"](key=private) + request = nodb_factories["federation.SignedRequest"]( + auth=auth, headers={"Date": too_old} + ) + prepared_request = request.prepare() + + with pytest.raises(forms.ValidationError): + signing.verify(prepared_request, public) + + def test_can_verify_django_request(factories, fake_request): private_key, public_key = keys.get_key_pair() signed_request = factories["federation.SignedRequest"]( @@ -95,14 +112,18 @@ def test_can_verify_django_request_digest_failure(factories, fake_request): signing.verify_django(django_request, public_key) -def test_can_verify_django_request_failure(factories, fake_request): +def test_can_verify_django_request_failure(factories, fake_request, now): private_key, public_key = keys.get_key_pair() signed_request = factories["federation.SignedRequest"]( auth__key=private_key, auth__headers=["date"] ) prepared = signed_request.prepare() django_request = fake_request.get( - "/", **{"HTTP_DATE": "Wrong", "HTTP_SIGNATURE": prepared.headers["signature"]} + "/", + **{ + "HTTP_DATE": http_date((now + datetime.timedelta(seconds=31)).timestamp()), + "HTTP_SIGNATURE": prepared.headers["signature"], + } ) - with pytest.raises(cryptography.exceptions.InvalidSignature): + with pytest.raises(forms.ValidationError): signing.verify_django(django_request, public_key) diff --git a/api/tests/federation/test_views.py b/api/tests/federation/test_views.py index 9e2d66a62..3a67a9f2a 100644 --- a/api/tests/federation/test_views.py +++ b/api/tests/federation/test_views.py @@ -417,3 +417,28 @@ def test_library_track_action_import(factories, superuser_api_client, mocker): for i, job in enumerate(batch.jobs.all()): assert job.library_track == imported_lts[i] mocked_run.assert_called_once_with(import_batch_id=batch.pk) + + +def test_local_actor_detail(factories, api_client): + user = factories["users.User"](with_actor=True) + url = reverse("federation:actors-detail", kwargs={"user__username": user.username}) + serializer = serializers.ActorSerializer(user.actor) + response = api_client.get(url) + + assert response.status_code == 200 + assert response.data == serializer.data + + +def test_wellknown_webfinger_local(factories, api_client, settings, mocker): + user = factories["users.User"](with_actor=True) + url = reverse("federation:well-known-webfinger") + response = api_client.get( + url, + data={"resource": "acct:{}".format(user.actor.webfinger_subject)}, + HTTP_ACCEPT="application/jrd+json", + ) + serializer = serializers.ActorWebfingerSerializer(user.actor) + + assert response.status_code == 200 + assert response["Content-Type"] == "application/jrd+json" + assert response.data == serializer.data diff --git a/api/tests/history/test_views.py b/api/tests/history/test_views.py new file mode 100644 index 000000000..8ec927710 --- /dev/null +++ b/api/tests/history/test_views.py @@ -0,0 +1,13 @@ +import pytest + +from django.urls import reverse + + +@pytest.mark.parametrize("level", ["instance", "me", "followers"]) +def test_privacy_filter(preferences, level, factories, api_client): + preferences["common__api_authentication_required"] = False + factories["history.Listening"](user__privacy_level=level) + url = reverse("api:v1:history:listenings-list") + response = api_client.get(url) + assert response.status_code == 200 + assert response.data["count"] == 0 diff --git a/api/tests/music/test_import.py b/api/tests/music/test_import.py index 2be267cff..12185f888 100644 --- a/api/tests/music/test_import.py +++ b/api/tests/music/test_import.py @@ -1,10 +1,15 @@ import json import os +import pytest +import uuid +from django import forms from django.urls import reverse from funkwhale_api.federation import actors from funkwhale_api.federation import serializers as federation_serializers +from funkwhale_api.music import importers +from funkwhale_api.music import models from funkwhale_api.music import tasks DATA_DIR = os.path.dirname(os.path.abspath(__file__)) @@ -237,3 +242,9 @@ def test__do_import_in_place_mbid(factories, tmpfile): assert bool(tf.audio_file) is False assert tf.source == "file://{}".format(path) assert tf.mimetype == "audio/ogg" + + +def test_importer_cleans(): + importer = importers.Importer(models.Artist) + with pytest.raises(forms.ValidationError): + importer.load({"name": "", "mbid": uuid.uuid4()}, {}, []) diff --git a/api/tests/music/test_models.py b/api/tests/music/test_models.py index df18a0909..1bd4282fe 100644 --- a/api/tests/music/test_models.py +++ b/api/tests/music/test_models.py @@ -44,6 +44,7 @@ def test_import_album_stores_release_group(factories): def test_import_track_from_release(factories, mocker): album = factories["music.Album"](mbid="430347cb-0879-3113-9fde-c75b658c298e") + artist = factories["music.Artist"](mbid="a5211c65-2465-406b-93ec-213588869dc1") album_data = { "release": { "id": album.mbid, @@ -64,6 +65,9 @@ def test_import_track_from_release(factories, mocker): "id": "2109e376-132b-40ad-b993-2bb6812e19d4", "title": "Teen Age Riot", "length": "417973", + "artist-credit": [ + {"artist": {"id": artist.mbid, "name": artist.name}} + ], }, "track_or_recording_length": "417973", } @@ -84,10 +88,66 @@ def test_import_track_from_release(factories, mocker): assert track.title == track_data["recording"]["title"] assert track.mbid == track_data["recording"]["id"] assert track.album == album - assert track.artist == album.artist + assert track.artist == artist assert track.position == int(track_data["position"]) +def test_import_track_with_different_artist_than_release(factories, mocker): + album = factories["music.Album"](mbid="430347cb-0879-3113-9fde-c75b658c298e") + recording_data = { + "recording": { + "id": "94ab07eb-bdf3-4155-b471-ba1dc85108bf", + "title": "Flaming Red Hair", + "length": "159000", + "artist-credit": [ + { + "artist": { + "id": "a5211c65-2465-406b-93ec-213588869dc1", + "name": "Plan 9", + "sort-name": "Plan 9", + "disambiguation": "New Zealand group", + } + } + ], + "release-list": [ + { + "id": album.mbid, + "title": "The Lord of the Rings: The Fellowship of the Ring - The Complete Recordings", + "status": "Official", + "quality": "normal", + "text-representation": {"language": "eng", "script": "Latn"}, + "artist-credit": [ + { + "artist": { + "id": "9b58672a-e68e-4972-956e-a8985a165a1f", + "name": "Howard Shore", + "sort-name": "Shore, Howard", + } + } + ], + "date": "2005-12-13", + "country": "US", + "release-event-count": 1, + "barcode": "093624945420", + "artist-credit-phrase": "Howard Shore", + } + ], + "release-count": 3, + "artist-credit-phrase": "Plan 9", + } + } + artist = factories["music.Artist"](mbid="a5211c65-2465-406b-93ec-213588869dc1") + mocker.patch( + "funkwhale_api.musicbrainz.api.recordings.get", return_value=recording_data + ) + + track = models.Track.get_or_create_from_api(recording_data["recording"]["id"])[0] + assert track.title == recording_data["recording"]["title"] + assert track.mbid == recording_data["recording"]["id"] + assert track.album == album + assert track.artist == artist + + def test_import_job_is_bound_to_track_file(factories, mocker): track = factories["music.Track"]() job = factories["music.ImportJob"](mbid=track.mbid) diff --git a/api/tests/music/test_serializers.py b/api/tests/music/test_serializers.py index 51ca96b5d..8705354f7 100644 --- a/api/tests/music/test_serializers.py +++ b/api/tests/music/test_serializers.py @@ -12,7 +12,12 @@ def test_artist_album_serializer(factories, to_api_date): "artist": album.artist.id, "creation_date": to_api_date(album.creation_date), "tracks_count": 1, - "cover": album.cover.url, + "cover": { + "original": album.cover.url, + "square_crop": album.cover.crop["400x400"].url, + "medium_square_crop": album.cover.crop["200x200"].url, + "small_square_crop": album.cover.crop["50x50"].url, + }, "release_date": to_api_date(album.release_date), } serializer = serializers.ArtistAlbumSerializer(album) @@ -43,7 +48,7 @@ def test_album_track_serializer(factories, to_api_date): expected = { "id": track.id, - "artist": track.artist.id, + "artist": serializers.ArtistSimpleSerializer(track.artist).data, "album": track.album.id, "mbid": str(track.mbid), "title": track.title, @@ -83,7 +88,12 @@ def test_album_serializer(factories, to_api_date): "title": album.title, "artist": serializers.ArtistSimpleSerializer(album.artist).data, "creation_date": to_api_date(album.creation_date), - "cover": album.cover.url, + "cover": { + "original": album.cover.url, + "square_crop": album.cover.crop["400x400"].url, + "medium_square_crop": album.cover.crop["200x200"].url, + "small_square_crop": album.cover.crop["50x50"].url, + }, "release_date": to_api_date(album.release_date), "tracks": serializers.AlbumTrackSerializer([track2, track1], many=True).data, } diff --git a/api/tests/playlists/test_serializers.py b/api/tests/playlists/test_serializers.py index 677288070..79765a24b 100644 --- a/api/tests/playlists/test_serializers.py +++ b/api/tests/playlists/test_serializers.py @@ -63,3 +63,40 @@ def test_update_insert_is_called_when_index_is_provided(factories, mocker): insert.assert_called_once_with(playlist, plt, 0) assert plt.index == 0 assert first.index == 1 + + +def test_playlist_serializer_include_covers(factories, api_request): + playlist = factories["playlists.Playlist"]() + t1 = factories["music.Track"]() + t2 = factories["music.Track"]() + t3 = factories["music.Track"](album__cover=None) + t4 = factories["music.Track"]() + t5 = factories["music.Track"]() + t6 = factories["music.Track"]() + t7 = factories["music.Track"]() + + playlist.insert_many([t1, t2, t3, t4, t5, t6, t7]) + request = api_request.get("/") + qs = playlist.__class__.objects.with_covers().with_tracks_count() + + expected = [ + request.build_absolute_uri(t1.album.cover.crop["200x200"].url), + request.build_absolute_uri(t2.album.cover.crop["200x200"].url), + request.build_absolute_uri(t4.album.cover.crop["200x200"].url), + request.build_absolute_uri(t5.album.cover.crop["200x200"].url), + request.build_absolute_uri(t6.album.cover.crop["200x200"].url), + ] + + serializer = serializers.PlaylistSerializer(qs.get(), context={"request": request}) + assert serializer.data["album_covers"] == expected + + +def test_playlist_serializer_include_duration(factories, api_request): + playlist = factories["playlists.Playlist"]() + tf1 = factories["music.TrackFile"](duration=15) + tf2 = factories["music.TrackFile"](duration=30) + playlist.insert_many([tf1.track, tf2.track]) + qs = playlist.__class__.objects.with_duration().with_tracks_count() + + serializer = serializers.PlaylistSerializer(qs.get()) + assert serializer.data["duration"] == 45 diff --git a/api/tests/subsonic/test_authentication.py b/api/tests/subsonic/test_authentication.py index b2d2c0400..b0c6b1b32 100644 --- a/api/tests/subsonic/test_authentication.py +++ b/api/tests/subsonic/test_authentication.py @@ -63,3 +63,15 @@ def test_auth_with_inactive_users(api_request, factories): authenticator = authentication.SubsonicAuthentication() with pytest.raises(exceptions.AuthenticationFailed): authenticator.authenticate(request) + + +def test_auth_case_insensitive(api_request, factories): + user = factories["users.User"](username="Hello") + user.subsonic_api_token = "password" + user.save() + request = api_request.get("/", {"u": "hello", "p": "password"}) + + authenticator = authentication.SubsonicAuthentication() + u, _ = authenticator.authenticate(request) + + assert user == u diff --git a/api/tests/test_import_audio_file.py b/api/tests/test_import_audio_file.py index 43e596ff7..f63e69b63 100644 --- a/api/tests/test_import_audio_file.py +++ b/api/tests/test_import_audio_file.py @@ -37,6 +37,7 @@ def test_can_create_track_from_file_metadata_no_mbid(db, mocker): def test_can_create_track_from_file_metadata_mbid(factories, mocker): album = factories["music.Album"]() + artist = factories["music.Artist"]() mocker.patch( "funkwhale_api.music.models.Album.get_or_create_from_api", return_value=(album, True), @@ -55,6 +56,9 @@ def test_can_create_track_from_file_metadata_mbid(factories, mocker): "recording": { "id": "2109e376-132b-40ad-b993-2bb6812e19d4", "title": "Teen Age Riot", + "artist-credit": [ + {"artist": {"id": artist.mbid, "name": artist.name}} + ], }, } ], @@ -79,7 +83,7 @@ def test_can_create_track_from_file_metadata_mbid(factories, mocker): assert track.mbid == track_data["recording"]["id"] assert track.position == 4 assert track.album == album - assert track.artist == album.artist + assert track.artist == artist def test_management_command_requires_a_valid_username(factories, mocker): diff --git a/api/tests/users/test_models.py b/api/tests/users/test_models.py index ea760cc6c..39a5bd326 100644 --- a/api/tests/users/test_models.py +++ b/api/tests/users/test_models.py @@ -1,7 +1,10 @@ import datetime import pytest +from django.urls import reverse + from funkwhale_api.users import models +from funkwhale_api.federation import utils as federation_utils def test__str__(factories): @@ -126,4 +129,27 @@ def test_can_filter_closed_invitations(factories): used = factories["users.User"](invited=True).invitation assert models.Invitation.objects.count() == 3 - assert list(models.Invitation.objects.open(False)) == [expired, used] + assert list(models.Invitation.objects.order_by("id").open(False)) == [expired, used] + + +def test_creating_actor_from_user(factories, settings): + user = factories["users.User"]() + actor = models.create_actor(user) + + assert actor.preferred_username == user.username + assert actor.domain == settings.FEDERATION_HOSTNAME + assert actor.type == "Person" + assert actor.name == user.username + assert actor.manually_approves_followers is False + assert actor.url == federation_utils.full_url( + reverse("federation:actors-detail", kwargs={"user__username": user.username}) + ) + assert actor.shared_inbox_url == federation_utils.full_url( + reverse("federation:actors-inbox", kwargs={"user__username": user.username}) + ) + assert actor.inbox_url == federation_utils.full_url( + reverse("federation:actors-inbox", kwargs={"user__username": user.username}) + ) + assert actor.outbox_url == federation_utils.full_url( + reverse("federation:actors-outbox", kwargs={"user__username": user.username}) + ) diff --git a/api/tests/users/test_views.py b/api/tests/users/test_views.py index fca66d302..92e9922bf 100644 --- a/api/tests/users/test_views.py +++ b/api/tests/users/test_views.py @@ -20,6 +20,22 @@ def test_can_create_user_via_api(preferences, api_client, db): assert u.username == "test1" +@pytest.mark.parametrize("username", ["wrong.name", "wrong-name", "éaeu", "wrong name"]) +def test_username_only_accepts_letters_and_underscores( + username, preferences, api_client, db +): + url = reverse("rest_register") + data = { + "username": username, + "email": "test1@test.com", + "password1": "testtest", + "password2": "testtest", + } + preferences["users__registration_enabled"] = True + response = api_client.post(url, data) + assert response.status_code == 400 + + def test_can_restrict_usernames(settings, preferences, db, api_client): url = reverse("rest_register") preferences["users__registration_enabled"] = True @@ -235,3 +251,39 @@ def test_user_cannot_patch_another_user(method, logged_in_api_client, factories) response = handler(url, payload) assert response.status_code == 403 + + +def test_user_can_patch_their_own_avatar(logged_in_api_client, avatar): + user = logged_in_api_client.user + url = reverse("api:v1:users:users-detail", kwargs={"username": user.username}) + content = avatar.read() + avatar.seek(0) + payload = {"avatar": avatar} + response = logged_in_api_client.patch(url, payload) + + assert response.status_code == 200 + user.refresh_from_db() + + assert user.avatar.read() == content + + +def test_creating_user_creates_actor_as_well( + api_client, factories, mocker, preferences +): + actor = factories["federation.Actor"]() + url = reverse("rest_register") + data = { + "username": "test1", + "email": "test1@test.com", + "password1": "testtest", + "password2": "testtest", + } + preferences["users__registration_enabled"] = True + mocker.patch("funkwhale_api.users.models.create_actor", return_value=actor) + response = api_client.post(url, data) + + assert response.status_code == 201 + + user = User.objects.get(username="test1") + + assert user.actor == actor diff --git a/demo/README.md b/demo/README.md new file mode 100644 index 000000000..1fb13b5a1 --- /dev/null +++ b/demo/README.md @@ -0,0 +1,61 @@ +# Setup the demo + +We assume you want to store the demo data in `/srv/funkwhale-demo`. +This setup requires Docker and docker-compose. + +## Create the necessary directories + +`mkdir /srv/funkwhale-demo` + +## Get some music + +You can use your own music (put it in `/usr/share/music`, this is the directory the demo will look into by default). + +If you don't have any music, you can use the repository https://code.eliotberriot.com/funkwhale/catalog, which +requires Git LFS. + +## Create an env file + +Copy the `env.sample` file to ``/srv/funkwhale-demo/.env`. + +Edit the file according to your needs. + +## Copy the setup script + +Copy the `setup.sh` script to ``/srv/funkwhale-demo/setup.sh`. + +Ensure it's executable with `chmod +x setup.sh`. + +## Setup your nginx vhost + +Setup your reverse proxy for the demo as described in https://docs.funkwhale.audio/installation/index.html#nginx. + +This is outside of the scope of this guide, as you will probably want some SSL certificates, however, +ensure you point the vhost configuration to the proper static files: + +- `root` should point to `/srv/funkwhale-demo/demo/front/dist` +- `/media` and `/_protected/media` should point to `/srv/funkwhale-demo/demo/data/media/` +- `/staticfiles` should point to `/srv/funkwhale-demo/demo/data/static` + +## Launch + +Setup the demo: + +``` +cd /srv/funkwhale-demo +sudo ENV_FILE=/srv/funkwhale-demo/.env ./setup.sh +``` + +## Automate + +You'll probaby want to reset the demo every now and then. You can do that +using a cronjob: + +``` +sudo crontab -e +# in the crontab, put this: +SHELL=/bin/bash +0 */3 * * * cd /srv/funkwhale-demo && ENV_FILE=/srv/funkwhale-demo/env ./setup.sh > /srv/funkwhale-demo/crontab.log 2>&1 +``` + +This will reset and restart the demo every 3 hours. diff --git a/demo/download-tracks.sh b/demo/download-tracks.sh deleted file mode 100755 index 448b44592..000000000 --- a/demo/download-tracks.sh +++ /dev/null @@ -1,21 +0,0 @@ -#! /bin/bash -set -e -[ -z $1 ] && echo "Path to list file missing" && exit 1 - -echo "This will download tracks from zip archives listed in $1" - -LIST_CONTENT=$(cat $1) -mkdir -p data/music -cd data/music - -echo "Downloading files..." -echo "$LIST_CONTENT" | grep "^[^#;]" | xargs -n 1 curl -LO - -echo "Unzipping archives..." -find . -name "*.zip" | while read filename; do - dirname="${filename%.*}" - mkdir $dirname - unzip -o -d "$dirname" "$filename"; -done; - -echo "Done!" diff --git a/demo/env.sample b/demo/env.sample new file mode 100644 index 000000000..0c9668765 --- /dev/null +++ b/demo/env.sample @@ -0,0 +1,6 @@ +FUNKWHALE_URL=https://demo.funkwhale.audio/ +DJANGO_ALLOWED_HOSTS=demo.funkwhale.audio +FUNKWHALE_API_PORT=5001 +DJANGO_SECRET_KEY=demo +DATABASE_URL=postgresql://postgres@postgres/postgres +CACHE_URL=redis://redis:6379/0 diff --git a/demo/music.txt b/demo/music.txt deleted file mode 100644 index 26a83c4e8..000000000 --- a/demo/music.txt +++ /dev/null @@ -1,8 +0,0 @@ -# You can get a pretty list of open music here: https://archive.org/details/jamendo-albums -https://archive.org/compress/jamendo-069098/formats=OGG%20VORBIS&file=/jamendo-069098.zip -https://archive.org/compress/jamendo-001144/formats=OGG%20VORBIS&file=/jamendo-001144.zip -https://archive.org/compress/jamendo-027690/formats=OGG%20VORBIS&file=/jamendo-027690.zip -https://archive.org/compress/jamendo-001469/formats=OGG%20VORBIS&file=/jamendo-001469.zip -https://archive.org/compress/jamendo-106323/formats=OGG%20VORBIS&file=/jamendo-106323.zip -https://archive.org/compress/jamendo-071149/formats=OGG%20VORBIS&file=/jamendo-071149.zip -https://archive.org/compress/jamendo-085030/formats=OGG%20VORBIS&file=/jamendo-085030.zip diff --git a/demo/setup.sh b/demo/setup.sh old mode 100644 new mode 100755 index e33bdf290..5edbd692c --- a/demo/setup.sh +++ b/demo/setup.sh @@ -1,30 +1,114 @@ #!/bin/bash -eux -version="develop" -music_path="/usr/share/music" -demo_path="/srv/funkwhale-demo/demo" - +version=${VERSION:-develop} +music_path=${MUSIC_PATH:-/usr/share/music} +demo_path=${DEMO_PATH:-/srv/funkwhale-demo/demo} +env_file=${ENV_FILE} echo 'Cleaning everything...' +mkdir -p $demo_path cd $demo_path /usr/local/bin/docker-compose down -v || echo 'Nothing to stop' -rm -rf /srv/funkwhale-demo/demo/* +sudo rm -rf $demo_path/* mkdir -p $demo_path echo 'Downloading demo files...' curl -L -o docker-compose.yml "https://code.eliotberriot.com/funkwhale/funkwhale/raw/$version/deploy/docker-compose.yml" curl -L -o .env "https://code.eliotberriot.com/funkwhale/funkwhale/raw/$version/deploy/env.prod.sample" mkdir data/ -cp -r $music_path data/music - curl -L -o front.zip "https://code.eliotberriot.com/funkwhale/funkwhale/-/jobs/artifacts/$version/download?job=build_front" unzip front.zip -echo "FUNKWHALE_URL=https://demo.funkwhale.audio/" >> .env -echo "DJANGO_SECRET_KEY=demo" >> .env -echo "DJANGO_ALLOWED_HOSTS=demo.funkwhale.audio" >> .env +cat $env_file >> .env echo "FUNKWHALE_VERSION=$version" >> .env -echo "FUNKWHALE_API_PORT=5001" >> .env -/usr/local/bin/docker-compose pull +echo "MUSIC_DIRECTORY_SERVE_PATH=$music_path" >> .env +echo "MUSIC_DIRECTORY_PATH=$music_path" >> .env +echo "MEDIA_ROOT=$demo_path/data/media/" >> .env +echo "STATIC_ROOT=$demo_path/data/static/" >> .env + +# /usr/local/bin/docker-compose pull /usr/local/bin/docker-compose up -d postgres redis sleep 5 -/usr/local/bin/docker-compose run --rm api demo/load-demo-data.sh +cat .env +cat < subapps -> proxy + user -> webui -> proxy + cache -> worker + proxy -> api + api -> cache + api -> db + scheduler -> cache + worker -> cache + worker -> db + } + +This graph may looks a bit scary, so we'll detail the role of each component below. + +The user +-------- + +Funkwhale users can interact with your instance using: + +- The official web interface +- Third-party apps + +The web interface +----------------- + +This refers to Funkwhale's built-in web interface, which is a Single Page application +written in Vue JS. This application will interact with Funkwhale's API to retrieve +or persist data. + +Third-party apps +---------------- + +Since Funkwhale implements a subset of the Subsonic API, it's compatible with existing apps such +as DSub, Ultrasonic or Clementine that support this API. Those apps can be used as a replacement +or in conjunction of the web interface, but the underlying data is the same. + +The reverse proxy +----------------- + +Funkwhale's API server should never be exposed directly to the internet, as we require +a reverse proxy (Apache or Nginx) for performance and security reasons. The reverse proxy +will receive client HTTP requests, and: + +- Proxy them to the API server +- Serve requested static files (Audio files, stylesheets, javascript, fonts...) + +The API server +-------------- + +Funkwhale's API server is the central piece of the project. This component is responsible +for answering and processing user requests, manipulate data from the database, send long-running +tasks to workers, etc. + +It's a Python/Django application. + +The database +------------ + +Most of the data such as user accounts, favorites, music metadata or playlist is stored +in a PostgreSQL database. + +The cache/message queue +----------------------- + +Fetching data from the database is sometimes slow or resource hungry. To reduce +the load, Redis act as a cache for data that is considerably faster than a database. + +It is also a message queue that will deliver tasks to the worker. + +The worker +---------- + +Some operations are too long to live in the HTTP request/response cycle. Typically, +importing a bunch of uploaded tracks could take a minute or two. + +To keep the API response time as fast as possible, we offload long-running tasks +to a background process, also known as the Celery worker. + +Typical tasks include: + +- Handling music imports +- Handling federation/ActivityPub messages +- Scanning other instances libraries + +This worker is also able to retry failed tasks, or spawn automatically +more process when the number of received tasks increase. + +The scheduler +------------- + +Some long-running tasks are not triggered by user or external input, but on a recurring +basis instead. The scheduler is responsible for triggering those tasks and put the corresponding +messages in the message queue so the worker can process them. + +Recurring tasks include: + +- Cache cleaning +- Music metadata refreshing diff --git a/docs/conf.py b/docs/conf.py index 01da9bc05..8b1a3d41a 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -20,7 +20,7 @@ import os import sys -sys.path.insert(0, os.path.abspath('../api')) +sys.path.insert(0, os.path.abspath("../api")) import funkwhale_api # NOQA @@ -33,24 +33,24 @@ import funkwhale_api # NOQA # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. -extensions = [] +extensions = ["sphinx.ext.graphviz"] # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ["_templates"] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # # source_suffix = ['.rst', '.md'] -source_suffix = '.rst' +source_suffix = ".rst" # The master toctree document. -master_doc = 'index' +master_doc = "index" # General information about the project. -project = 'funkwhale' -copyright = '2017, Eliot Berriot' -author = 'Eliot Berriot' +project = "funkwhale" +copyright = "2017, Eliot Berriot" +author = "Eliot Berriot" # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the @@ -71,10 +71,10 @@ language = None # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This patterns also effect to html_static_path and html_extra_path -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] # The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' +pygments_style = "sphinx" # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = False @@ -85,7 +85,7 @@ todo_include_todos = False # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -html_theme = 'alabaster' +html_theme = "alabaster" # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the @@ -96,13 +96,13 @@ html_theme = 'alabaster' # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] +html_static_path = ["_static"] # -- Options for HTMLHelp output ------------------------------------------ # Output file base name for HTML help builder. -htmlhelp_basename = 'funkwhaledoc' +htmlhelp_basename = "funkwhaledoc" # -- Options for LaTeX output --------------------------------------------- @@ -111,15 +111,12 @@ latex_elements = { # The paper size ('letterpaper' or 'a4paper'). # # 'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). # # 'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. # # 'preamble': '', - # Latex figure (float) alignment # # 'figure_align': 'htbp', @@ -129,8 +126,7 @@ latex_elements = { # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - (master_doc, 'funkwhale.tex', 'funkwhale Documentation', - 'Eliot Berriot', 'manual'), + (master_doc, "funkwhale.tex", "funkwhale Documentation", "Eliot Berriot", "manual") ] @@ -138,10 +134,7 @@ latex_documents = [ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, 'funkwhale', 'funkwhale Documentation', - [author], 1) -] +man_pages = [(master_doc, "funkwhale", "funkwhale Documentation", [author], 1)] # -- Options for Texinfo output ------------------------------------------- @@ -150,7 +143,13 @@ man_pages = [ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - (master_doc, 'funkwhale', 'funkwhale Documentation', - author, 'funkwhale', 'One line description of project.', - 'Miscellaneous'), + ( + master_doc, + "funkwhale", + "funkwhale Documentation", + author, + "funkwhale", + "One line description of project.", + "Miscellaneous", + ) ] diff --git a/docs/configuration.rst b/docs/configuration.rst index 7b7751fc6..3e7b5aa25 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -88,7 +88,7 @@ Default: ``Funkwhale `` Default: ``None`` The path on your server where Funwkhale can import files using :ref:`in-place import -`. It must be readable by the webserver and funkwhale +`. It must be readable by the webserver and Funkwhale api and worker processes. On docker installations, we recommend you use the default of ``/music`` @@ -124,6 +124,16 @@ On non-docker setup, you don't need to configure this setting. .. note:: This path should not include any trailing slash +.. _setting-REVERSE_PROXY_TYPE: + +``REVERSE_PROXY_TYPE`` +^^^^^^^^^^^^^^^^^^^^^^ + +Default: ``nginx`` + +The type of reverse-proxy behind which Funkwhale is served. Either ``apache2`` +or ``nginx``. This is only used if you are using in-place import. + User permissions ---------------- diff --git a/docs/features.rst b/docs/features.rst index e0f490e4b..c57e229fa 100644 --- a/docs/features.rst +++ b/docs/features.rst @@ -9,12 +9,12 @@ Funkwhale is a web based music server. It is similar in term of goals and featur A social platform ------------------ -However, funkwhale is better-suited for small to medium communities and was designed to be not only a music server and player, but also a place to socialize around music and discover new content. While some of these features are not currently implemented, our roadmap includes: +However, Funkwhale is better-suited for small to medium communities and was designed to be not only a music server and player, but also a place to socialize around music and discover new content. While some of these features are not currently implemented, our roadmap includes: - Radios, to discover the music of a given user, artist, genre... - Playlists - Favorites -- Broadcasts, as they existed in Grooveshark, for exemple +- Broadcasts, as they existed in Grooveshark, for example - Recommendations Music acquisition diff --git a/docs/federation.rst b/docs/federation.rst index 0f016ada9..08658b12e 100644 --- a/docs/federation.rst +++ b/docs/federation.rst @@ -22,7 +22,7 @@ Acquire music via federation ---------------------------- Instance libraries are protected by default. To access another instance -library, you have to follow it. Each funkwhale instance gets a dedicated +library, you have to follow it. Each Funkwhale instance gets a dedicated ActivityPub Actor you can follow via the username "library@yourinstance.domain". When submitted, a follow request will be sent to diff --git a/docs/importing-music.rst b/docs/importing-music.rst index b40eb7b88..4b4ea7c1d 100644 --- a/docs/importing-music.rst +++ b/docs/importing-music.rst @@ -4,8 +4,8 @@ Importing music From music directory on the server ---------------------------------- -You can import music files in funkwhale assuming they are located on the server -and readable by the funkwhale application. Your music files should contain at +You can import music files in Funkwhale assuming they are located on the server +and readable by the Funkwhale application. Your music files should contain at least an ``artist``, ``album`` and ``title`` tags, but we recommend you tag it extensively using a proper tool, such as Beets or Musicbrainz Picard. @@ -59,7 +59,7 @@ to import and don't want to double your disk usage. The CLI importer supports an additional ``--in-place`` option that triggers the following behaviour during import: -1. Imported files are not store in funkwhale anymore +1. Imported files are not store in Funkwhale anymore 2. Instead, Funkwhale will store the file path and use it to serve the music Because those files are not managed by Funkwhale, we offer additional @@ -98,14 +98,14 @@ directory is mounted as a volume as well:: volumes: - ./data/music:/music:ro - ./data/media:/app/funkwhale_api/media - # add your symlinked dirs here + # add your symlinked dirs here - /media/nfsshare:/media/nfsshare:ro api: volumes: - ./data/music:/music:ro - ./data/media:/app/funkwhale_api/media - # add your symlinked dirs here + # add your symlinked dirs here - /media/nfsshare:/media/nfsshare:ro diff --git a/docs/index.rst b/docs/index.rst index f177a4240..b107739ae 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -13,14 +13,17 @@ Funkwhale is a self-hosted, modern free and open-source music server, heavily in users/index features + architecture installation/index upgrading configuration + troubleshooting importing-music federation api third-party contributing + translators changelog Indices and tables diff --git a/docs/installation/debian.rst b/docs/installation/debian.rst index be17ab1e0..407f71dd7 100644 --- a/docs/installation/debian.rst +++ b/docs/installation/debian.rst @@ -1,15 +1,15 @@ -Debian installation -=================== +Debian and Arch Linux installation +================================== .. note:: - This guide targets Debian 9 (Stretch), which is the latest Debian. + This guide targets Debian 9 (Stretch), which is the latest Debian, as well as Arch Linux. External dependencies --------------------- -The guides will focus on installing funkwhale-specific components and -dependencies. However, funkwhale requires a +The guides will focus on installing Funkwhale-specific components and +dependencies. However, Funkwhale requires a :doc:`few external dependencies <./external_dependencies>` for which documentation is outside of this document scope. @@ -17,18 +17,23 @@ Install utilities ----------------- You'll need a few utilities during this guide that are not always present by -default on system. You can install them using: +default on system. On Debian-like systems, you can install them using: .. code-block:: shell sudo apt-get update sudo apt-get install curl python3-pip python3-venv git unzip +On Arch Linux and its derivatives: + +.. code-block:: shell + + sudo pacman -S curl python-pip python-virtualenv git unzip Layout ------- -All funkwhale-related files will be located under ``/srv/funkwhale`` apart +All Funkwhale-related files will be located under ``/srv/funkwhale`` apart from database files and a few configuration files. We will also have a dedicated ``funkwhale`` user to launch the processes we need and own those files. @@ -41,7 +46,7 @@ Create the user and the directory: .. code-block:: shell - sudo adduser --system --home /srv/funkwhale funkwhale + sudo useradd -r -s /usr/bin/nologin -d /srv/funkwhale -m funkwhale cd /srv/funkwhale Log in as the newly created user from now on: @@ -57,7 +62,7 @@ Now let's setup our directory layout. Here is how it will look like:: ├── api # api code of your instance ├── data # persistent data, such as music files ├── front # frontend files for the web user interface - └── virtualenv # python dependencies for funkwhale + └── virtualenv # python dependencies for Funkwhale Create the aforementionned directories: @@ -67,7 +72,7 @@ Create the aforementionned directories: The ``virtualenv`` directory is a bit special and will be created separately. -Download latest funkwhale release +Download latest Funkwhale release ---------------------------------- Funkwhale is splitted in two components: @@ -79,7 +84,7 @@ Those components are packaged in subsequent releases, such as 0.1, 0.2, etc. You can browse the :doc:`changelog ` for a list of available releases and pick the one you want to install, usually the latest one should be okay. -In this guide, we'll assume you want to install the latest version of funkwhale, +In this guide, we'll assume you want to install the latest version of Funkwhale, which is |version|: First, we'll download the latest api release. @@ -101,6 +106,24 @@ Then we'll download the frontend files: mv extracted/front . rm -rf extracted +.. note:: + + You can also choose to get the code directly from the git repo. In this + case, run + + cd /srv + rm -r funkwhale + git clone https://code.eliotberriot.com/funkwhale/funkwhale funkwhale + cd funkwhale + + You'll also need to re-create the folders we make earlier: + + mkdir -p config data/static data/media data/music front + + You will still need to get the frontend files as specified before, because + we're not going to build them. + + You can leave the ZIP archives in the directory, this will help you know which version you've installed next time you want to upgrade your installation. @@ -113,22 +136,20 @@ First, switch to the api directory: cd api -A few OS packages are required in order to run funkwhale. The list is available -in ``api/requirements.apt`` or by running -``./install_os_dependencies.sh list``. - -.. note:: - - Ensure you are running the next commands as root or using sudo - (and not as the funkwhale) user. - -You can install those packages all at once: +A few OS packages are required in order to run Funkwhale. On Debian-like +systems, they can be installed with .. code-block:: shell - ./install_os_dependencies.sh install + sudo apt install build-essential ffmpeg libjpeg-dev libmagic-dev libpq-dev postgresql-client python3-dev -From now on you can switch back to the funkwhale user. +On Arch, run + +.. code-block:: shell + + pacman -S $(cat api/requirements.pac) + +From now on, you should use the funkwhale user for all commands. Python dependencies -------------------- @@ -143,11 +164,12 @@ To avoid collisions with other software on your system, Python dependencies will be installed in a dedicated `virtualenv `_. -First, create the virtualenv: +First, create the virtualenv and install wheel: .. code-block:: shell python3 -m venv /srv/funkwhale/virtualenv + pip3 install wheel This will result in a ``virtualenv`` directory being created in ``/srv/funkwhale/virtualenv``. @@ -165,12 +187,11 @@ Finally, install the python dependencies: .. code-block:: shell - pip install wheel pip install -r api/requirements.txt .. important:: - further commands involving python should always be run after you activated + Further commands involving python should always be run after you activated the virtualenv, as described earlier, otherwise those commands will raise errors @@ -178,7 +199,7 @@ Finally, install the python dependencies: Environment file ---------------- -You can now start to configure funkwhale. The main way to achieve that is by +You can now start to configure Funkwhale. The main way to achieve that is by adding an environment file that will host settings that are relevant to your installation. @@ -188,8 +209,15 @@ Download the sample environment file: curl -L -o config/.env "https://code.eliotberriot.com/funkwhale/funkwhale/raw/|version|/deploy/env.prod.sample" +.. note:: + + if you used git to get the latest version of the code earlier, you can instead do + + cp /srv/funkwhale/deploy/env.prod.sample /srv/funkwhale/config/.env + + You can then edit it: the file is heavily commented, and the most relevant -configuration options are mentionned at the top of the file. +configuration options are mentioned at the top of the file. Especially, populate the ``DATABASE_URL`` and ``CACHE_URL`` values based on how you configured your PostgreSQL and Redis servers in @@ -198,30 +226,15 @@ how you configured your PostgreSQL and Redis servers in When you want to run command on the API server, such as to create the database or compile static files, you have to ensure you source -the environment variables. +the environment variables in that file. This can be done like this:: export $(cat config/.env | grep -v ^# | xargs) -The easier thing to do is to store this in a script:: - - cat > /srv/funkwhale/load_env <<'EOL' - #!/bin/bash - export $(cat /srv/funkwhale/config/.env | grep -v ^# | xargs) - EOL - chmod +x /srv/funkwhale/load_env - -You should now be able to run the following to populate your environment -variables easily: - -.. code-block:: shell - - source /srv/funkwhale/load_env - .. note:: - Remember to source ``load_env`` whenever you edit your .env file. + Remember to reload these variables whenever you edit your .env file. Database setup --------------- @@ -267,7 +280,7 @@ Collect static files -------------------- Static files are the static assets used by the API server (icon PNGs, CSS, etc.). -We need to collect them explicitely, so they can be served by the webserver: +We need to collect them explicitly, so they can be served by the webserver: .. code-block:: shell diff --git a/docs/installation/docker.rst b/docs/installation/docker.rst index e05201800..065cfd27e 100644 --- a/docs/installation/docker.rst +++ b/docs/installation/docker.rst @@ -1,7 +1,7 @@ Docker installation ==================== -Docker is the easiest way to get a funkwhale instance up and running. +Docker is the easiest way to get a Funkwhale instance up and running. First, ensure you have `Docker `_ and `docker-compose `_ installed. diff --git a/docs/installation/external_dependencies.rst b/docs/installation/external_dependencies.rst index adfb90e72..981997207 100644 --- a/docs/installation/external_dependencies.rst +++ b/docs/installation/external_dependencies.rst @@ -14,12 +14,20 @@ Funkwhale requires a PostgreSQL database to work properly. Please refer to the `PostgreSQL documentation `_ for installation instructions specific to your os. -On debian-like systems, you would install the database server like this: +On Debian-like systems, you would install the database server like this: .. code-block:: shell sudo apt-get install postgresql postgresql-contrib +On Arch Linux and its derivatives: + +.. code-block:: shell + + sudo pacman -S postgresql + +On Arch, you'll also need to initialize the database. See `the Arch Linux wiki `_. + The remaining steps are heavily inspired from `this Digital Ocean guide `_. Open a database shell: @@ -37,22 +45,23 @@ Create the project database and user: CREATE USER funkwhale; GRANT ALL PRIVILEGES ON DATABASE funkwhale TO funkwhale; -Assuming you already have :ref:`created your funkwhale user `, -you should now be able to open a postgresql shell: - .. warning:: - It's importing that you use utf-8 encoding for your database, + It's important that you use utf-8 encoding for your database, otherwise you'll end up with errors and crashes later on when dealing with music metedata that contains non-ascii chars. + +Assuming you already have :ref:`created your funkwhale user `, +you should now be able to open a postgresql shell: + .. code-block:: shell sudo -u funkwhale -H psql Unless you give a superuser access to the database user, you should also enable some extensions on your database server, as those are required -for funkwhale to work properly: +for Funkwhale to work properly: .. code-block:: shell @@ -68,11 +77,17 @@ Funkwhale also requires a cache server: queries - To handle asynchronous tasks such as music import -On debian-like distributions, a redis package is available, and you can +On Debian-like distributions, a redis package is available, and you can install it: .. code-block:: shell sudo apt-get install redis-server +On Arch Linux and its derivatives: + +.. code-block:: shell + + sudo pacman -S redis + This should be enough to have your redis server set up. diff --git a/docs/installation/index.rst b/docs/installation/index.rst index 83c47a101..aba6d55a2 100644 --- a/docs/installation/index.rst +++ b/docs/installation/index.rst @@ -56,7 +56,7 @@ Available installation methods ------------------------------- Docker is the recommended and easiest way to setup your Funkwhale instance. -We also maintain an installation guide for Debian 9. +We also maintain an installation guide for Debian 9 and Arch Linux. .. toctree:: :maxdepth: 1 @@ -96,17 +96,23 @@ Files for the web frontend are purely static and can simply be downloaded, unzip Reverse proxy -------------- -In order to make funkwhale accessible from outside your server and to play nicely with other applications on your machine, you should configure a reverse proxy. +In order to make Funkwhale accessible from outside your server and to play nicely with other applications on your machine, you should configure a reverse proxy. Nginx ^^^^^ -Ensure you have a recent version of nginx on your server. On debian-like system, you would have to run the following: +Ensure you have a recent version of nginx on your server. On Debian-like system, you would have to run the following: .. code-block:: bash - apt-get update - apt-get install nginx + sudo apt-get update + sudo apt-get install nginx + +On Arch Linux and its derivatives: + +.. code-block:: bash + + sudo pacman -S nginx Then, download our sample virtualhost file and proxy conf: @@ -129,10 +135,15 @@ If everything is fine, you can restart your nginx server with ``service nginx re Apache2 ^^^^^^^ -Ensure you have a recent version of apache2 installed on your server. +.. note:: + + These instructions are for Debian only. + For Arch Linux please refer to the `Arch Linux wiki `_. + +Ensure you have a recent version of Apache2 installed on your server. You'll also need the following dependencies:: - apt install libapache2-mod-xsendfile + sudo apt-get install libapache2-mod-xsendfile Then, download our sample virtualhost file: diff --git a/docs/installation/optimization.rst b/docs/installation/optimization.rst index f873795e2..9ff8ffadf 100644 --- a/docs/installation/optimization.rst +++ b/docs/installation/optimization.rst @@ -2,7 +2,7 @@ Optimizing your Funkwhale instance ================================== Depending on your requirements, you may want to reduce as much as possible -Funkwhale's footprint. +Funkwhale's memory footprint. Reduce workers concurrency -------------------------- @@ -14,9 +14,9 @@ memory usage. You can control this behaviour using the ``--concurrency`` flag. For instance, setting ``--concurrency=1`` will spawn only one worker. -This flag should be appended after the ``celery -A funkwhale_api.taskapp worker`` -command in your :file:`docker-compose.yml` file if your using Docker, or in your -:file:`/etc/systemd/system/funkwhale-worker.service` otherwise. +This flag should be appended after the ``celery -A funkwhale_api.taskapp +worker`` command in your :file:`docker-compose.yml` file if your using Docker, +or in your :file:`/etc/systemd/system/funkwhale-worker.service` otherwise. .. note:: @@ -33,5 +33,5 @@ Using the ``solo`` pool type should reduce your memory consumption. You can control this behaviour using the ``--pool=solo`` flag. This flag should be appended after the ``celery -A funkwhale_api.taskapp worker`` -command in your :file:`docker-compose.yml` file if your using Docker, or in your -:file:`/etc/systemd/system/funkwhale-worker.service` otherwise. +command in your :file:`docker-compose.yml` file if you're using Docker, or in +your :file:`/etc/systemd/system/funkwhale-worker.service` otherwise. diff --git a/docs/installation/systemd.rst b/docs/installation/systemd.rst index 27781c447..f162cac7d 100644 --- a/docs/installation/systemd.rst +++ b/docs/installation/systemd.rst @@ -1,10 +1,10 @@ Systemd configuration ---------------------- -Systemd offers a convenient way to manage your funkwhale instance if you're +Systemd offers a convenient way to manage your Funkwhale instance if you're not using docker. -We'll see how to setup systemd to proprely start a funkwhale instance. +We'll see how to setup systemd to proprely start a Funkwhale instance. First, download the sample unitfiles: @@ -17,9 +17,9 @@ First, download the sample unitfiles: This will download three unitfiles: -- ``funkwhale-server.service`` to launch the funkwhale web server -- ``funkwhale-worker.service`` to launch the funkwhale task worker -- ``funkwhale-beat.service`` to launch the funkwhale task beat (this is for recurring tasks) +- ``funkwhale-server.service`` to launch the Funkwhale web server +- ``funkwhale-worker.service`` to launch the Funkwhale task worker +- ``funkwhale-beat.service`` to launch the Funkwhale task beat (this is for recurring tasks) - ``funkwhale.target`` to easily stop and start all of the services at once You can of course review and edit them to suit your deployment scenario diff --git a/docs/translators.rst b/docs/translators.rst new file mode 100644 index 000000000..6728e9ad4 --- /dev/null +++ b/docs/translators.rst @@ -0,0 +1 @@ +.. include:: ../TRANSLATORS.rst diff --git a/docs/troubleshooting.rst b/docs/troubleshooting.rst new file mode 100644 index 000000000..61fa4c68a --- /dev/null +++ b/docs/troubleshooting.rst @@ -0,0 +1,212 @@ +Troubleshooting +=============== + +Various errors and issues can arise on your Funkwhale instance, caused by configuration errors, +deployment/environment specific issues, or bugs in the software itself. + +On this document, you'll find: + +- Tools and commands you can use to better understand the issues +- A list of common pitfalls and errors and how to solve them +- A collection of links and advice to get help from the community and report new issues + +Diagnose problems +^^^^^^^^^^^^^^^^^ + +Funkwhale is made of several components, each one being a potential cause for failure. Having an even basic overview +of Funkwhale's technical architecture can help you understand what is going on. You can refer to :doc:`the technical architecture ` for that. + +Problems usually fall into one of those categories: + +- **Frontend**: Funkwhale's interface is not loading, not behaving as expected, music is not playing +- **API**: the interface do not display any data or show errors +- **Import**: uploaded/imported tracks are not imported correctly or at all +- **Federation**: you cannot contact other Funkwhale servers, access their library, play federated tracks +- **Everything else** + +Each category comes with its own set of diagnose tools and/or commands we will detail below. We'll also give you simple +steps for each type of problem. Please try those to see if it fix your issues. If none of those works, please report your issue on our +issue tracker. + +Frontend issues +^^^^^^^^^^^^^^^ + +Diagnostic tools: + +- Javascript and network logs from your browser console (see instructions on how to open it in `Chrome `_ and `Firefox `_ +- Proxy and API access and error logs (see :ref:`access-logs`) +- The same operation works from a different browser + +Common problems +*************** + +The front-end is completely blank +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +You are visiting Funkwhale, but you don't see anything. + +- Try from a different browser +- Check network errors in your browser console. If you see responses with 40X or 50X statuses, there is probably an issue with the webserver configuration +- If you don't see anything wrong in the network console, check the Javascript console +- Disable your browser extensions (like adblockers) + +Music is not playing +~~~~~~~~~~~~~~~~~~~~ + +You have some tracks in your queue that don't play, or the queue is jumping from one track to the next until +there is no more track available: + +- Try with other tracks. If it works with some tracks but not other tracks, this may means that the failing tracks are not probably imported + or that your browser does not support a specific audio format +- Check the network and javascript console for potential errors + +Tracks are not appending to the queue +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +When clicking on "Play", "Play all albums" or "Play all" buttons, some tracks are not appended to the queue. This is +actually a feature of Funkwhale: those tracks have no file associated with them, so we cannot play them. + +Specific pages are loading forever or blank +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +When viewing a given page, the page load never ends (you continue to see the spinner), or nothing seems to appear at all: + +- Ensure your internet connection is up and running +- Ensure your instance is up and running +- Check the network and javascript console for potential errors + + +Backend issues +^^^^^^^^^^^^^^ + +Diagnostic tools: + +- Reverse proxy logs: + - Apache logs should be available at :file:`/var/log/apache/access.log` and :file:`/var/log/apache/error.log` + - Nginx logs should be available at :file:`/var/log/nginx/access.log` and :file:`/var/log/nginx/error.log` +- API logs: + - Docker setup: ``docker-compose logs -f --tail=50 api`` (remove the ``--tail`` flag to get the full logs) + - Non-docker setup: ``journalctl -xn -u funkwhale-server`` + +.. note:: + + If you edit your .env file to test a new configuration, you have to restart your services to pick up the changes: + + - Docker setup: ``docker-compose up -d`` + - Non-docker setup: ``systemctl restart funkwhale.target`` + +Common problems +*************** + +Instance work properly, but audio files are not served (404 error) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- If you're using docker, ensure the ``MEDIA_ROOT`` variable is commented in your env file +- Ensure the ``_protected/media`` block points toward the path where media files are stored (``/srv/funkwhale/data/media``, by default) +- If you're using in-place import, ensure :ref:`setting-MUSIC_DIRECTORY_PATH`, :ref:`setting-MUSIC_DIRECTORY_SERVE_PATH` and :ref:`setting-REVERSE_PROXY_TYPE` are configured properly, and that the files are readable by the webserver + +Weakref error when running ``python manage.py `` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +On Python <3.6, you may see this kind of errors when running commands like ``python manage.py migrate``:: + + Exception ignored in: .remove at 0x107e7a6a8> + Traceback (most recent call last): + File "/srv/funkwhale/venv/lib/python3.5/weakref.py", line 117, in remove + TypeError: 'NoneType' object is not callable + +This is caused by a bug in Python (cf https://github.com/celery/celery/issues/3818), and is not affecting in any way +the command you execute. You can safely ignore this error. + +``Your models have changes that are not yet reflected in a migration`` warning +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +When running ``python manage.py migrate`` (both in docker or non-docker), you may end-up with this:: + + Operations to perform: + Apply all migrations: account, admin, auth, authtoken, common, contenttypes, dynamic_preferences, favorites, federation, history, music, playlists, radios, requests, sessions, sites, socialaccount, taggit, users + Running migrations: + No migrations to apply. + + Your models have changes that are not yet reflected in a migration, and so won't be applied. + Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply them. + +This warning can be safely ignored. You should not run the suggested ``manage.py makemigrations`` command. + +File import issues +^^^^^^^^^^^^^^^^^^ + +Unless you are using the CLI to import files, imports are send as tasks in a queue to a celery worker that will process them. + +Diagnostic tools: + +- Celery worker logs: + - Docker setup: ``docker-compose logs -f --tail=50 celeryworker`` (remove the ``--tail`` flag to get the full logs) + - Non-docker setup: ``journalctl -xn -u funkwhale-worker`` + +Federation issues +^^^^^^^^^^^^^^^^^ + +Received federations messages are sent to a dedicated task queue and processed asynchronously by a celery worker. + +Diagnostic tools: + +- API logs: + - Docker setup: ``docker-compose logs -f --tail=50 api`` (remove the ``--tail`` flag to get the full logs) + - Non-docker setup: ``journalctl -xn -u funkwhale-server`` +- Celery worker logs: + - Docker setup: ``docker-compose logs -f --tail=50 celeryworker`` (remove the ``--tail`` flag to get the full logs) + - Non-docker setup: ``journalctl -xn -u funkwhale-worker`` + +Common problems +*************** + +I have no access to another instance library +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- Check if it works with the demo library (library@demo.funkwhale.audio) +- Check if the remote library received your follow request and approved it +- Trigger a scan via the interface +- Have a look in the celery logs for potential errors during the scan + +Other problems +^^^^^^^^^^^^^^ + +It's a bit hard to give targeted advice about problems that do not fit in the previous categories. However, we can recommend to: + +- Try to identify the scope of the issue and reproduce it reliably +- Ensure your instance is configured as detailed in the installation documentation, and if you did not use the default + values, to check what you changed +- To read the .env file carefuly, as most of the options are described in the comments + + +Report an issue or get help +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Well be more than happy to help you to debug installation and configuration issues. The main channel +for receiving support about your Funkwhale installation is the `#funkwhale-troubleshooting:matrix.org `_ Matrix channel. + +Before asking for help, we'd really appreciate if you took the time to go through this document and try to diagnose the problem yourself. But if you don't find +anything relevant or don't have the time, we'll be there for you! + +Here are a few recommendations on how to structure and what to include in your help requests: + +- Give us as much context as possible about your installation (OS, version, Docker/non-docker, reverse-proxy type, relevant logs and errors, etc.) +- Including screenshots or small gifs or videos can help us considerably when debugging front-end issues + +You can also open issues on our `issue tracker `_. Please have a quick look for +similar issues before doing that, and use the issue tracker only to report bugs, suggest enhancements (both in the software and the documentation) or new features. + +.. warning:: + + If you ever need to share screenshots or urls with someone else, ensure those do not include your personnal token. + This token is binded to your account and can be used to connect and use your account. + + Urls that includes your token looks like: ``https://your.instance/api/v1/trackfiles/42/serve/?jwt=yoursecrettoken`` + +Improving this documentation +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If you feel like something should be improved in this document (and in the documentation in general), feel free to `edit +it `_ and open a Merge Request. If you lack time or skills +to do that, you can open an issue to discuss that, and someone else will do it. diff --git a/docs/upgrading.rst b/docs/upgrading.rst index 85a2b5057..49ea55881 100644 --- a/docs/upgrading.rst +++ b/docs/upgrading.rst @@ -1,4 +1,4 @@ -Upgrading your funkwhale instance to a newer version +Upgrading your Funkwhale instance to a newer version ==================================================== .. note:: @@ -7,7 +7,7 @@ Upgrading your funkwhale instance to a newer version the database and the media files. We're commited to make upgrade as easy and straightforward as possible, - however, funkwhale is still in development and you'll be safer with a backup. + however, Funkwhale is still in development and you'll be safer with a backup. Reading the release notes @@ -72,7 +72,7 @@ Upgrading the API ^^^^^^^^^^^^^^^^^ On non-docker, upgrade involves a few more commands. We assume your setup -match what is described in :doc:`debian`: +match what is described in :doc:`/installation/debian`: .. parsed-literal:: diff --git a/docs/users/apps.rst b/docs/users/apps.rst index f01af9266..f3e412d56 100644 --- a/docs/users/apps.rst +++ b/docs/users/apps.rst @@ -61,6 +61,22 @@ Then, when using a client, you'll have to input some information about your serv In your client configuration, please double check the "ID3" or "Browse with tags" setting is enabled. +Ultrasonic (Android) +^^^^^^^^^^^^^^^^^^^^ + +- Price: free +- F-Droid: https://f-droid.org/en/packages/org.moire.ultrasonic/ +- Google Play: https://play.google.com/store/apps/details?id=org.moire.ultrasonic +- Sources: https://github.com/ultrasonic/ultrasonic + + +Ultrasonic is a full-featured Subsonic client with Playlists, Stars, Search, +Offline mode, etc. + +It's one of the recommended Android client to use with Funkwhale, as we are doing +our Android tests on this one. + + DSub (Android) ^^^^^^^^^^^^^^ @@ -76,7 +92,7 @@ DSub is a full-featured Subsonic client that works great, and has a lot of featu - Search - Offline cache (with configurable size, playlist download, queue prefetching, etc.) -It's the recommended Android client to use with Funkwhale, as we are doing +It's one of the recommended Android client to use with Funkwhale, as we are doing our Android tests on this one. Clementine (Desktop) diff --git a/front/Dockerfile b/front/Dockerfile index 3d4c65e64..69771c326 100644 --- a/front/Dockerfile +++ b/front/Dockerfile @@ -1,5 +1,8 @@ FROM node:9 +# needed to compile translations +RUN curl -L -o /usr/local/bin/jq https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64 && chmod +x /usr/local/bin/jq + EXPOSE 8080 WORKDIR /app/ ADD package.json . diff --git a/front/build/dev-server.js b/front/build/dev-server.js index f9c389e72..634a6d41e 100644 --- a/front/build/dev-server.js +++ b/front/build/dev-server.js @@ -14,8 +14,6 @@ var webpackConfig = process.env.NODE_ENV === 'testing' ? require('./webpack.prod.conf') : require('./webpack.dev.conf') -require('./i18n') - // default port where dev server listens for incoming traffic var port = process.env.PORT || config.dev.port var host = process.env.HOST || config.dev.host diff --git a/front/build/i18n.js b/front/build/i18n.js deleted file mode 100644 index ef31070c7..000000000 --- a/front/build/i18n.js +++ /dev/null @@ -1,49 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -const { gettextToI18next } = require('i18next-conv'); - -const poDir = path.join(__dirname, '..', '..', 'po') -const outDir = path.join(__dirname, '..', 'static', 'translations') -if (!fs.existsSync(outDir) || !fs.statSync(outDir).isDirectory()) { - fs.mkdirSync(outDir) -} - -// Convert .po files to i18next files -fs.readdir(poDir, (err, files) => { - if (err) { - return console.log(err) - } - - for (const file of files) { - if (file.endsWith('.po')) { - const lang = file.replace(/\.po$/, '') - const output = path.join(outDir, `${lang}.json`) - fs.readFile(path.join(poDir, file), (err, content) => { - if (err) { - return console.log(err) - } - - gettextToI18next(lang, content).then(res => { - fs.writeFile(output, res, err => { - if (err) { - console.log(err) - } else { - console.log(`Wrote translation file: ${output}`) - if (lang === 'en') { - // for english, we need to specify that json values are equal to the keys. - // otherwise we end up with empty strings on the front end for english - var contents = fs.readFileSync(output) - var jsonContent = JSON.parse(contents) - var finalContent = {} - Object.keys(jsonContent).forEach(function(key) { - finalContent[key] = key - }) - fs.writeFile(output, JSON.stringify(finalContent)) - } - } - }) - }) - }) - } - } -}) diff --git a/front/locales/app.pot b/front/locales/app.pot new file mode 100644 index 000000000..9eb4a2a7d --- /dev/null +++ b/front/locales/app.pot @@ -0,0 +1,2411 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the front package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: front 1.0.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-07-22 14:12+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +#: front/src/components/playlists/PlaylistModal.vue:9 +msgid "\"%{ title }\", by %{ artist }" +msgstr "" + +#: front/src/components/Sidebar.vue:24 +msgid "(%{ index } of %{ length })" +msgstr "" + +#: front/src/components/Sidebar.vue:22 +msgid "(empty)" +msgstr "" + +#: front/src/components/common/ActionTable.vue:43 +#: front/src/components/common/ActionTable.vue:51 +msgid "%{ count } on %{ total } selected" +msgid_plural "%{ count } on %{ total } selected" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/Sidebar.vue:116 src/views/federation/LibraryDetail.vue:87 +msgid "%{ count } track" +msgid_plural "%{ count } tracks" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/library/Artist.vue:13 +msgid "%{ count } track in %{ albumsCount } albums" +msgid_plural "%{ count } tracks in %{ albumsCount } albums" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/library/radios/Builder.vue:76 +msgid "%{ count } track matching combined filters" +msgid_plural "%{ count } tracks matching combined filters" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/playlists/Card.vue:18 +msgid "%{ count} track" +msgid_plural "%{ count } tracks" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/common/Duration.vue:2 +msgid "%{ hours } h %{ minutes } min" +msgstr "" + +#: front/src/components/common/Duration.vue:5 +msgid "%{ minutes } min" +msgstr "" + +#: front/src/components/activity/Like.vue:7 +msgid "%{ user } favorited a track" +msgstr "" + +#: front/src/components/activity/Listen.vue:7 +msgid "%{ user } listened to a track" +msgstr "" + +#: front/src/components/auth/Profile.vue:49 +msgid "%{ username }'s profile" +msgstr "" + +#: front/src/components/audio/artist/Card.vue:41 +msgid "1 album" +msgid_plural "%{ count } albums" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/favorites/List.vue:10 +msgid "1 favorite" +msgid_plural "%{ count } favorites" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/audio/album/Card.vue:54 +#: front/src/components/federation/LibraryCard.vue:25 +msgid "1 track" +msgid_plural "%{ count } tracks" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/About.vue:5 +msgid "About %{ instance }" +msgstr "" + +#: front/src/App.vue:54 +msgid "About Funkwhale" +msgstr "" + +#: front/src/App.vue:32 src/components/About.vue:8 src/components/About.vue:55 +msgid "About this instance" +msgstr "" + +#: front/src/components/manage/library/RequestsTable.vue:28 +#: front/src/components/manage/library/RequestsTable.vue:62 +msgid "Accepted" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:111 +msgid "Access disabled" +msgstr "" + +#: front/src/components/Home.vue:109 +msgid "Access your music from a clean interface that focus on what really matters" +msgstr "" + +#: front/src/views/admin/users/UsersDetail.vue:54 +msgid "Account active" +msgstr "" + +#: front/src/components/auth/Settings.vue:5 +msgid "Account settings" +msgstr "" + +#: front/src/components/auth/Settings.vue:257 +msgid "Account Settings" +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:39 +msgid "Account status" +msgstr "" + +#: front/src/views/auth/PasswordReset.vue:14 +msgid "Account's email" +msgstr "" + +#: front/src/components/common/ActionTable.vue:82 +msgid "Action %{ action } was launched successfully on %{ count } element" +msgid_plural "Action %{ action } was launched successfully on %{ count } elements" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/common/ActionTable.vue:8 +#: front/src/components/federation/LibraryFollowTable.vue:24 +#: front/src/components/library/radios/Builder.vue:60 +#: front/src/components/manage/library/RequestsTable.vue:54 +msgid "Actions" +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:53 +msgid "Active" +msgstr "" + +#: front/src/components/Sidebar.vue:60 +msgid "Activity" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:21 +msgid "Actor" +msgstr "" + +#: front/src/views/federation/LibraryList.vue:8 +msgid "Add a new library" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:46 +msgid "Add filter" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:36 +msgid "Add filters to customize your radio" +msgstr "" + +#: front/src/components/audio/PlayButton.vue:53 +msgid "Add to current queue" +msgstr "" + +#: front/src/components/favorites/TrackFavoriteIcon.vue:4 +#: front/src/components/favorites/TrackFavoriteIcon.vue:21 +msgid "Add to favorites" +msgstr "" + +#: front/src/components/playlists/TrackPlaylistIcon.vue:6 +#: front/src/components/playlists/TrackPlaylistIcon.vue:32 +msgid "Add to playlist..." +msgstr "" + +#: front/src/components/audio/PlayButton.vue:14 +msgid "Add to queue" +msgstr "" + +#: front/src/components/playlists/PlaylistModal.vue:116 +msgid "Add to this playlist" +msgstr "" + +#: front/src/components/playlists/PlaylistModal.vue:54 +msgid "Add track" +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:69 +msgid "Admin" +msgstr "" + +#: front/src/components/Sidebar.vue:64 +msgid "Administration" +msgstr "" + +#: front/src/components/audio/SearchBar.vue:26 src/components/audio/track/Table.vue:8 +#: front/src/components/federation/LibraryTrackTable.vue:49 +#: front/src/components/library/Album.vue:91 +#: front/src/components/manage/library/FilesTable.vue:39 +#: front/src/components/metadata/Search.vue:134 +msgid "Album" +msgstr "" + +#: front/src/components/library/import/ReleaseImport.vue:3 +msgid "Album %{ title } (%{ count } track) by %{ artist }" +msgid_plural "Album %{ title } (%{ count } tracks) by %{ artist }" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/library/Album.vue:12 +msgid "Album containing %{ count } track, by %{ artist }" +msgid_plural "Album containing %{ count } tracks, by %{ artist }" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/library/Track.vue:20 +msgid "Album page" +msgstr "" + +#: front/src/components/audio/Search.vue:19 src/components/instance/Stats.vue:48 +#: front/src/components/manage/library/RequestsTable.vue:50 +#: front/src/components/requests/Form.vue:9 +msgid "Albums" +msgstr "" + +#: front/src/components/library/Artist.vue:44 +msgid "Albums by this artist" +msgstr "" + +#: front/src/components/manage/library/RequestsTable.vue:26 +#: front/src/components/manage/users/InvitationsTable.vue:19 +msgid "All" +msgstr "" + +#: front/src/components/playlists/Editor.vue:13 +msgid "An error occured while saving your changes" +msgstr "" + +#: front/src/components/auth/Login.vue:10 +msgid "An unknown error happend, this can mean the server is down or cannot be reached" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:11 +#: front/src/components/library/import/BatchDetail.vue:68 +#: front/src/components/library/import/BatchList.vue:13 +#: front/src/components/library/import/BatchList.vue:22 +msgid "Any" +msgstr "" + +#: front/src/components/library/import/BatchList.vue:24 +msgid "API" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:68 +#: front/src/components/federation/LibraryFollowTable.vue:78 +msgid "Approve" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:70 +msgid "Approve access?" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:38 +msgid "Approved" +msgstr "" + +#: front/src/components/auth/Logout.vue:5 +msgid "Are you sure you want to log out?" +msgstr "" + +#: front/src/components/audio/SearchBar.vue:25 src/components/audio/track/Table.vue:7 +#: front/src/components/federation/LibraryTrackTable.vue:48 +#: front/src/components/library/Artist.vue:119 +#: front/src/components/manage/library/FilesTable.vue:38 +#: front/src/components/manage/library/RequestsTable.vue:49 +#: front/src/components/metadata/Search.vue:130 +msgid "Artist" +msgstr "" + +#: front/src/components/requests/Form.vue:5 +msgid "Artist name" +msgstr "" + +#: front/src/components/library/Album.vue:22 src/components/library/Track.vue:23 +msgid "Artist page" +msgstr "" + +#: front/src/components/audio/Search.vue:65 +msgid "Artist, album, track..." +msgstr "" + +#: front/src/components/audio/Search.vue:10 src/components/instance/Stats.vue:42 +#: front/src/components/library/Artists.vue:119 src/components/library/Library.vue:7 +msgid "Artists" +msgstr "" + +#: front/src/components/favorites/List.vue:33 +#: front/src/components/federation/LibraryTrackTable.vue:28 +#: front/src/components/library/Artists.vue:25 src/components/library/Radios.vue:44 +#: front/src/components/manage/library/FilesTable.vue:19 +#: front/src/components/manage/library/RequestsTable.vue:19 +#: front/src/components/manage/users/UsersTable.vue:19 +#: front/src/views/federation/LibraryList.vue:28 src/views/playlists/List.vue:27 +msgid "Ascending" +msgstr "" + +#: front/src/views/auth/PasswordReset.vue:27 +msgid "Ask for a password reset" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:56 +msgid "Auto importing" +msgstr "" + +#: front/src/components/playlists/PlaylistModal.vue:26 +msgid "Available playlists" +msgstr "" + +#: front/src/components/auth/Settings.vue:34 +msgid "Avatar" +msgstr "" + +#: front/src/views/auth/EmailConfirm.vue:17 src/views/auth/PasswordReset.vue:24 +#: front/src/views/auth/PasswordResetConfirm.vue:18 +msgid "Back to login" +msgstr "" + +#: front/src/views/federation/LibraryFollowersList.vue:5 +msgid "Be careful when accepting follow requests, as it means the follower will have access to your entire library." +msgstr "" + +#: front/src/components/library/Track.vue:80 +#: front/src/components/manage/library/FilesTable.vue:42 +msgid "Bitrate" +msgstr "" + +#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4 +msgid "Browse" +msgstr "" + +#: front/src/components/Sidebar.vue:50 +msgid "Browse library" +msgstr "" + +#: front/src/components/library/Artists.vue:4 +msgid "Browsing artists" +msgstr "" + +#: front/src/views/federation/LibraryTrackList.vue:3 +msgid "Browsing federated tracks" +msgstr "" + +#: front/src/views/federation/LibraryFollowersList.vue:3 +msgid "Browsing followers" +msgstr "" + +#: front/src/views/federation/LibraryList.vue:3 +msgid "Browsing libraries" +msgstr "" + +#: front/src/views/playlists/List.vue:3 +msgid "Browsing playlists" +msgstr "" + +#: front/src/components/library/Radios.vue:4 +msgid "Browsing radios" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:5 +msgid "Builder" +msgstr "" + +#: front/src/components/audio/album/Card.vue:13 +msgid "By %{ artist }" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:57 +msgid "By confirming, %{ username } will be denied access to your library." +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:73 +msgid "By confirming, %{ username } will be granted access to your library." +msgstr "" + +#: front/src/components/audio/track/Table.vue:43 +#: front/src/components/common/DangerousButton.vue:17 +#: front/src/components/library/radios/Filter.vue:53 +#: front/src/components/playlists/PlaylistModal.vue:63 +msgid "Cancel" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:59 +msgid "Candidates" +msgstr "" + +#: front/src/components/auth/Settings.vue:76 +msgid "Cannot change your password" +msgstr "" + +#: front/src/App.vue:66 +msgid "Change language" +msgstr "" + +#: front/src/components/auth/Settings.vue:67 +msgid "Change my password" +msgstr "" + +#: front/src/components/auth/Settings.vue:95 +msgid "Change password" +msgstr "" + +#: front/src/views/auth/PasswordResetConfirm.vue:4 +#: front/src/views/auth/PasswordResetConfirm.vue:62 +msgid "Change your password" +msgstr "" + +#: front/src/components/auth/Settings.vue:96 +msgid "Change your password?" +msgstr "" + +#: front/src/components/playlists/Editor.vue:21 +msgid "Changes synced with server" +msgstr "" + +#: front/src/components/auth/Settings.vue:70 +msgid "Changing your password will also change your Subsonic API password if you have requested one." +msgstr "" + +#: front/src/components/auth/Settings.vue:98 +msgid "Changing your password will have the following consequences" +msgstr "" + +#: front/src/App.vue:4 +msgid "Choose your instance" +msgstr "" + +#: front/src/components/Home.vue:64 +msgid "Clean library" +msgstr "" + +#: front/src/components/manage/users/InvitationForm.vue:37 +msgid "Clear" +msgstr "" + +#: front/src/components/playlists/Editor.vue:40 +#: front/src/components/playlists/Editor.vue:45 +msgid "Clear playlist" +msgstr "" + +#: front/src/components/audio/Player.vue:270 +msgid "Clear your queue" +msgstr "" + +#: front/src/components/library/import/BatchList.vue:23 +msgid "CLI" +msgstr "" + +#: front/src/components/Home.vue:44 +msgid "Click once, listen for hours using built-in radios" +msgstr "" + +#: front/src/components/manage/library/RequestsTable.vue:30 +#: front/src/components/manage/library/RequestsTable.vue:64 +msgid "Closed" +msgstr "" + +#: front/src/components/manage/users/InvitationForm.vue:26 +#: front/src/components/manage/users/InvitationsTable.vue:42 +msgid "Code" +msgstr "" + +#: front/src/components/audio/album/Card.vue:43 +#: front/src/components/audio/artist/Card.vue:33 +#: front/src/components/discussion/Comment.vue:20 +msgid "Collapse" +msgstr "" + +#: front/src/components/manage/library/RequestsTable.vue:51 +#: front/src/components/requests/Form.vue:14 +msgid "Comment" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:58 +msgid "Config" +msgstr "" + +#: front/src/components/common/DangerousButton.vue:21 +msgid "Confirm" +msgstr "" + +#: front/src/views/auth/EmailConfirm.vue:4 src/views/auth/EmailConfirm.vue:20 +#: front/src/views/auth/EmailConfirm.vue:51 +msgid "Confirm your email" +msgstr "" + +#: front/src/views/auth/EmailConfirm.vue:13 +msgid "Confirmation code" +msgstr "" + +#: front/src/components/playlists/Editor.vue:163 +msgid "Copy tracks from current queue to playlist" +msgstr "" + +#: front/src/components/Home.vue:88 +msgid "Covers, lyrics, our goal is to have them all ;)" +msgstr "" + +#: front/src/components/auth/Signup.vue:4 +msgid "Create a funkwhale account" +msgstr "" + +#: front/src/components/playlists/Form.vue:2 +msgid "Create a new playlist" +msgstr "" + +#: front/src/components/auth/Login.vue:17 +msgid "Create an account" +msgstr "" + +#: front/src/components/manage/library/RequestsTable.vue:88 +#: front/src/components/requests/Card.vue:25 +msgid "Create import" +msgstr "" + +#: front/src/components/auth/Signup.vue:51 +msgid "Create my account" +msgstr "" + +#: front/src/components/playlists/Form.vue:34 +msgid "Create playlist" +msgstr "" + +#: front/src/components/library/Radios.vue:23 +msgid "Create your own radio" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:22 +#: front/src/components/manage/library/RequestsTable.vue:52 +#: front/src/components/manage/users/InvitationsTable.vue:40 +msgid "Creation date" +msgstr "" + +#: front/src/components/auth/Settings.vue:54 +msgid "Current avatar" +msgstr "" + +#: front/src/components/playlists/PlaylistModal.vue:8 +msgid "Current track" +msgstr "" + +#: front/src/components/manage/library/FilesTable.vue:189 +#: front/src/components/manage/library/RequestsTable.vue:195 +#: front/src/components/manage/users/InvitationsTable.vue:166 +#: front/src/views/playlists/Detail.vue:33 +msgid "Delete" +msgstr "" + +#: front/src/views/playlists/Detail.vue:38 +msgid "Delete playlist" +msgstr "" + +#: front/src/views/radios/Detail.vue:28 +msgid "Delete radio" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:52 +#: front/src/components/federation/LibraryFollowTable.vue:63 +msgid "Deny" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:54 +msgid "Deny access?" +msgstr "" + +#: front/src/components/favorites/List.vue:34 +#: front/src/components/federation/LibraryTrackTable.vue:29 +#: front/src/components/library/Artists.vue:26 src/components/library/Radios.vue:47 +#: front/src/components/manage/library/FilesTable.vue:20 +#: front/src/components/manage/library/RequestsTable.vue:20 +#: front/src/components/manage/users/UsersTable.vue:20 +#: front/src/views/federation/LibraryList.vue:29 src/views/playlists/List.vue:28 +msgid "Descending" +msgstr "" + +#: front/src/components/federation/LibraryCard.vue:50 +msgid "Detail" +msgstr "" + +#: front/src/views/admin/users/UsersDetail.vue:146 +msgid "Determine if the user account is active or not. Inactive users cannot login or use the service." +msgstr "" + +#: front/src/components/auth/Settings.vue:104 +#: front/src/components/auth/SubsonicTokenForm.vue:52 +msgid "Disable access" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:49 +msgid "Disable Subsonic access" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:50 +msgid "Disable Subsonic API access?" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:14 +msgid "Discover how to use Funkwhale from other apps" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:26 +msgid "Display publicly" +msgstr "" + +#: front/src/components/playlists/Editor.vue:42 +msgid "Do you want to clear the playlist \"%{ playlist }\"?" +msgstr "" + +#: front/src/components/common/DangerousButton.vue:7 +msgid "Do you want to confirm this action?" +msgstr "" + +#: front/src/views/playlists/Detail.vue:35 +msgid "Do you want to delete the playlist \"%{ playlist }\"?" +msgstr "" + +#: front/src/views/radios/Detail.vue:26 +msgid "Do you want to delete the radio \"%{ radio }\"?" +msgstr "" + +#: front/src/components/common/ActionTable.vue:29 +msgid "Do you want to launch %{ action } on %{ count } element?" +msgid_plural "Do you want to launch %{ action } on %{ count } elements?" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/Sidebar.vue:113 +msgid "Do you want to restore your previous queue?" +msgstr "" + +#: front/src/App.vue:38 +msgid "Documentation" +msgstr "" + +#: front/src/components/audio/track/Table.vue:24 src/components/library/Track.vue:48 +msgid "Download" +msgstr "" + +#: front/src/components/audio/track/Table.vue:27 +msgid "Download tracks" +msgstr "" + +#: front/src/components/playlists/Editor.vue:49 +msgid "Drag and drop rows to reorder tracks in the playlist" +msgstr "" + +#: front/src/components/library/Track.vue:58 +#: front/src/components/manage/library/FilesTable.vue:43 +msgid "Duration" +msgstr "" + +#: front/src/components/Home.vue:96 +msgid "Easy to use" +msgstr "" + +#: front/src/components/About.vue:21 +msgid "Edit instance info" +msgstr "" + +#: front/src/components/radios/Card.vue:20 src/views/playlists/Detail.vue:30 +msgid "Edit..." +msgstr "" + +#: front/src/components/auth/Signup.vue:29 +#: front/src/components/manage/users/UsersTable.vue:38 +msgid "Email" +msgstr "" + +#: front/src/views/admin/users/UsersDetail.vue:29 +msgid "Email address" +msgstr "" + +#: front/src/views/auth/EmailConfirm.vue:23 +msgid "Email confirmed" +msgstr "" + +#: front/src/views/playlists/Detail.vue:29 +msgid "End edition" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:4 +msgid "Ensure your music files are properly tagged before uploading them." +msgstr "" + +#: front/src/components/library/Radios.vue:140 +msgid "Enter a radio name..." +msgstr "" + +#: front/src/components/library/Artists.vue:118 +msgid "Enter an artist name..." +msgstr "" + +#: front/src/views/federation/LibraryList.vue:122 +msgid "Enter an library domain name..." +msgstr "" + +#: front/src/views/playlists/List.vue:104 +msgid "Enter an playlist name..." +msgstr "" + +#: front/src/components/auth/Signup.vue:98 +msgid "Enter your email" +msgstr "" + +#: front/src/components/auth/Signup.vue:96 +msgid "Enter your invitation code (case insensitive)" +msgstr "" + +#: front/src/components/metadata/Search.vue:114 +msgid "Enter your search query..." +msgstr "" + +#: front/src/components/auth/Signup.vue:97 +msgid "Enter your username" +msgstr "" + +#: front/src/components/auth/Login.vue:77 +msgid "Enter your username or email" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:20 +msgid "Error" +msgstr "" + +#: front/src/views/admin/Settings.vue:87 +msgid "Error reporting" +msgstr "" + +#: front/src/components/common/ActionTable.vue:75 +msgid "Error while applying action" +msgstr "" + +#: front/src/views/auth/PasswordReset.vue:7 +msgid "Error while asking for a password reset" +msgstr "" + +#: front/src/views/auth/PasswordResetConfirm.vue:7 +msgid "Error while changing your password" +msgstr "" + +#: front/src/views/auth/EmailConfirm.vue:7 +msgid "Error while confirming your email" +msgstr "" + +#: front/src/components/manage/users/InvitationForm.vue:4 +msgid "Error while creating invitation" +msgstr "" + +#: front/src/components/admin/SettingsGroup.vue:5 +msgid "Error while saving settings" +msgstr "" + +#: front/src/components/federation/LibraryForm.vue:10 +msgid "Error while scanning library" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:41 +#: front/src/components/library/import/BatchDetail.vue:70 +#: front/src/components/library/import/BatchList.vue:15 +msgid "Errored" +msgstr "" + +#: front/src/components/playlists/Form.vue:89 +msgid "Everyone" +msgstr "" + +#: front/src/components/playlists/Form.vue:85 +msgid "Everyone on this instance" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:57 +msgid "Exclude" +msgstr "" + +#: front/src/components/discussion/Comment.vue:14 +msgid "Expand" +msgstr "" + +#: front/src/components/manage/users/InvitationsTable.vue:41 +msgid "Expiration date" +msgstr "" + +#: front/src/components/manage/users/InvitationsTable.vue:50 +msgid "Expired" +msgstr "" + +#: front/src/components/manage/users/InvitationsTable.vue:21 +msgid "Expired/used" +msgstr "" + +#: front/src/components/library/import/Main.vue:65 +msgid "External source. Supported backends" +msgstr "" + +#: front/src/components/Sidebar.vue:51 +msgid "Favorites" +msgstr "" + +#: front/src/components/federation/LibraryForm.vue:3 +msgid "Federate with a new instance" +msgstr "" + +#: front/src/views/federation/LibraryTrackList.vue:21 +msgid "Federated tracks" +msgstr "" + +#: front/src/components/Sidebar.vue:87 src/components/library/import/BatchList.vue:25 +#: front/src/components/manage/users/UsersTable.vue:180 +#: front/src/views/admin/Settings.vue:84 src/views/admin/users/UsersDetail.vue:161 +#: front/src/views/federation/Base.vue:35 src/views/federation/LibraryDetail.vue:40 +msgid "Federation" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:3 +msgid "File mirroring" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:43 +msgid "File name" +msgstr "" + +#: front/src/components/library/import/Main.vue:76 +msgid "File upload" +msgstr "" + +#: front/src/views/admin/library/Base.vue:5 src/views/admin/library/FilesList.vue:21 +msgid "Files" +msgstr "" + +#: front/src/components/library/import/ArtistImport.vue:7 +msgid "Filter album types" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:56 +msgid "Filter name" +msgstr "" + +#: front/src/components/library/import/Main.vue:52 +msgid "Finish import" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:54 +msgid "Finished" +msgstr "" + +#: front/src/components/library/import/Main.vue:59 +msgid "First, choose where you want to import the music from" +msgstr "" + +#: front/src/components/federation/LibraryCard.vue:44 +msgid "Follow" +msgstr "" + +#: front/src/components/federation/LibraryCard.vue:36 +msgid "Follow request pending approval" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:21 +msgid "Follow status" +msgstr "" + +#: front/src/views/federation/Base.vue:13 +#: front/src/views/federation/LibraryFollowersList.vue:24 +msgid "Followers" +msgstr "" + +#: front/src/components/federation/LibraryCard.vue:18 +msgid "Followers only" +msgstr "" + +#: front/src/components/federation/LibraryCard.vue:15 +#: front/src/views/federation/LibraryDetail.vue:29 +msgid "Following" +msgstr "" + +#: front/src/components/activity/Like.vue:12 src/components/activity/Listen.vue:12 +msgid "from %{ album } by %{ artist }" +msgstr "" + +#: front/src/components/library/Track.vue:13 +msgid "From album %{ album } by %{ artist }" +msgstr "" + +#: front/src/App.vue:56 +msgid "Funkwhale is a free and open-source project run by volunteers. You can help us improve the platform by reporting bugs, suggesting features and share the project with your friends!" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:7 +msgid "Funkwhale is compatible with other music players that support the Subsonic API." +msgstr "" + +#: front/src/components/Home.vue:98 +msgid "Funkwhale is dead simple to use." +msgstr "" + +#: front/src/components/Home.vue:39 +msgid "Funkwhale is designed to make it easy to listen to music you like, or to discover new artists." +msgstr "" + +#: front/src/components/Home.vue:119 +msgid "Funkwhale is free and gives you control on your music." +msgstr "" + +#: front/src/components/Home.vue:66 +msgid "Funkwhale takes care of handling your music" +msgstr "" + +#: front/src/components/manage/users/InvitationForm.vue:16 +msgid "Get a new invitation" +msgstr "" + +#: front/src/components/Home.vue:13 +msgid "Get me to the library" +msgstr "" + +#: front/src/components/Home.vue:77 +msgid "" +"Get quality metadata about your music thanks to\n" +" \n" +" MusicBrainz\n" +" " +msgstr "" + +#: front/src/components/common/ActionTable.vue:21 +#: front/src/components/common/ActionTable.vue:27 +msgid "Go" +msgstr "" + +#: front/src/components/PageNotFound.vue:14 +msgid "Go to home page" +msgstr "" + +#: front/src/components/library/import/Main.vue:13 +msgid "Grab corresponding metadata" +msgstr "" + +#: front/src/App.vue:74 +msgid "Help us translate Funkwhale" +msgstr "" + +#: front/src/components/library/Home.vue:65 +msgid "Home" +msgstr "" + +#: front/src/components/instance/Stats.vue:36 +msgid "Hours of music" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:11 +msgid "However, accessing Funkwhale from those clients require a separate password you can set below." +msgstr "" + +#: front/src/components/library/import/BatchList.vue:34 +msgid "ID" +msgstr "" + +#: front/src/views/auth/PasswordResetConfirm.vue:24 +msgid "If the email address provided in the previous step is valid and binded to a user account, you should receive an email with reset instructions in the next couple of minutes." +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:196 +#: front/src/components/library/Library.vue:17 +msgid "Import" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:57 +msgid "Import #%{ id } launched" +msgstr "" + +#: front/src/components/library/import/Main.vue:38 +msgid "Import %{ count } track" +msgid_plural "Import %{ count } tracks" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/library/import/BatchDetail.vue:10 +msgid "Import batch" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:185 +msgid "Import Batch #%{ id }" +msgstr "" + +#: front/src/components/library/Library.vue:20 +msgid "Import batches" +msgstr "" + +#: front/src/components/library/import/BatchList.vue:117 +msgid "Import Batches" +msgstr "" + +#: front/src/components/manage/library/FilesTable.vue:40 +#: front/src/components/manage/library/RequestsTable.vue:53 +msgid "Import date" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:38 +msgid "Import detail page" +msgstr "" + +#: front/src/components/Sidebar.vue:81 +msgid "Import music" +msgstr "" + +#: front/src/components/library/import/Main.vue:267 +msgid "Import Music" +msgstr "" + +#: front/src/components/Home.vue:71 +msgid "Import music from various platforms, such as YouTube or SoundCloud" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:14 +#: front/src/components/federation/LibraryTrackTable.vue:66 +msgid "Import pending" +msgstr "" + +#: front/src/views/admin/library/Base.vue:9 +#: front/src/views/admin/library/RequestsList.vue:3 +#: front/src/views/admin/library/RequestsList.vue:21 +msgid "Import requests" +msgstr "" + +#: front/src/components/library/import/BatchList.vue:20 +#: front/src/components/library/import/Main.vue:6 +msgid "Import source" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:9 +msgid "Import status" +msgstr "" + +#: front/src/components/library/import/ReleaseImport.vue:14 +msgid "Import this release" +msgstr "" + +#: front/src/components/library/import/TrackImport.vue:11 +msgid "Import this track" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:12 +#: front/src/components/manage/library/RequestsTable.vue:29 +#: front/src/components/manage/library/RequestsTable.vue:61 +msgid "Imported" +msgstr "" + +#: front/src/components/library/import/TrackImport.vue:44 +msgid "Imported URL" +msgstr "" + +#: front/src/views/admin/Settings.vue:82 +msgid "Imports" +msgstr "" + +#: front/src/components/favorites/TrackFavoriteIcon.vue:3 +msgid "In favorites" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:65 +msgid "In library" +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:54 +msgid "Inactive" +msgstr "" + +#: front/src/components/library/import/Main.vue:96 +msgid "Input a MusicBrainz ID manually:" +msgstr "" + +#: front/src/views/auth/PasswordReset.vue:53 +msgid "Input the email address binded to your account" +msgstr "" + +#: front/src/components/playlists/Editor.vue:31 +msgid "Insert from queue (%{ count } track)" +msgid_plural "Insert from queue (%{ count } tracks)" +msgstr[0] "" +msgstr[1] "" + +#: front/src/views/admin/Settings.vue:80 +msgid "Instance information" +msgstr "" + +#: front/src/components/library/Radios.vue:9 +msgid "Instance radios" +msgstr "" + +#: front/src/views/admin/Settings.vue:75 +msgid "Instance settings" +msgstr "" + +#: front/src/views/instance/Timeline.vue:57 +msgid "Instance Timeline" +msgstr "" + +#: front/src/components/auth/Signup.vue:42 +#: front/src/components/manage/users/InvitationForm.vue:11 +msgid "Invitation code" +msgstr "" + +#: front/src/components/auth/Signup.vue:43 +msgid "Invitation code (optional)" +msgstr "" + +#: front/src/views/admin/users/Base.vue:8 src/views/admin/users/InvitationsList.vue:3 +#: front/src/views/admin/users/InvitationsList.vue:24 +msgid "Invitations" +msgstr "" + +#: front/src/App.vue:43 +msgid "Issue tracker" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:80 +msgid "Job ID" +msgstr "" + +#: front/src/components/library/import/BatchList.vue:36 +msgid "Jobs" +msgstr "" + +#: front/src/components/Home.vue:50 +msgid "Keep a track of your favorite songs" +msgstr "" + +#: front/src/components/audio/track/Table.vue:33 +msgid "Keep your PRIVATE_TOKEN secret as it gives access to your account." +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:41 +#: front/src/views/admin/users/UsersDetail.vue:45 +msgid "Last activity" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:101 +msgid "Last fetched" +msgstr "" + +#: front/src/components/playlists/PlaylistModal.vue:32 +msgid "Last modification" +msgstr "" + +#: front/src/components/common/ActionTable.vue:39 +msgid "Launch" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:18 +#: front/src/components/library/import/BatchList.vue:35 +msgid "Launch date" +msgstr "" + +#: front/src/components/federation/LibraryForm.vue:31 +msgid "Launch scan" +msgstr "" + +#: front/src/components/Home.vue:10 +msgid "Learn more about this instance" +msgstr "" + +#: front/src/components/manage/users/InvitationForm.vue:58 +msgid "Leave empty for a random code" +msgstr "" + +#: front/src/components/requests/Form.vue:10 +msgid "Leave this field empty if you're requesting the whole discography." +msgstr "" + +#: front/src/views/federation/Base.vue:5 src/views/federation/LibraryList.vue:123 +msgid "Libraries" +msgstr "" + +#: front/src/components/Sidebar.vue:70 +#: front/src/components/federation/LibraryTrackTable.vue:51 +#: front/src/components/instance/Stats.vue:30 +#: front/src/components/manage/users/UsersTable.vue:176 +#: front/src/views/admin/users/UsersDetail.vue:157 +#: front/src/views/federation/LibraryDetail.vue:194 +msgid "Library" +msgstr "" + +#: front/src/views/admin/library/FilesList.vue:3 +msgid "Library files" +msgstr "" + +#: front/src/components/federation/LibraryForm.vue:20 +msgid "Library name" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:84 +msgid "Library size" +msgstr "" + +#: front/src/components/federation/LibraryForm.vue:96 +msgid "library@demo.funkwhale.audio" +msgstr "" + +#: front/src/App.vue:29 +msgid "Links" +msgstr "" + +#: front/src/views/instance/Timeline.vue:4 +msgid "Loading timeline..." +msgstr "" + +#: front/src/components/favorites/List.vue:5 +msgid "Loading your favorites..." +msgstr "" + +#: front/src/components/auth/Login.vue:78 +msgid "Log In" +msgstr "" + +#: front/src/components/auth/Login.vue:4 +msgid "Log in to your Funkwhale account" +msgstr "" + +#: front/src/components/auth/Logout.vue:20 +msgid "Log Out" +msgstr "" + +#: front/src/components/Sidebar.vue:38 +msgid "Logged in as %{ username }" +msgstr "" + +#: front/src/components/Sidebar.vue:44 src/components/auth/Login.vue:41 +msgid "Login" +msgstr "" + +#: front/src/components/Sidebar.vue:43 +msgid "Logout" +msgstr "" + +#: front/src/components/audio/Player.vue:266 +msgid "Looping disabled. Click to switch to single-track looping." +msgstr "" + +#: front/src/components/audio/Player.vue:267 +msgid "Looping on a single track. Click to switch to whole queue looping." +msgstr "" + +#: front/src/components/audio/Player.vue:268 +msgid "Looping on whole queue. Click to disable looping." +msgstr "" + +#: front/src/components/library/Track.vue:94 +msgid "Lyrics" +msgstr "" + +#: front/src/views/admin/library/Base.vue:25 +msgid "Manage library" +msgstr "" + +#: front/src/components/playlists/PlaylistModal.vue:3 +msgid "Manage playlists" +msgstr "" + +#: front/src/views/admin/users/Base.vue:20 +msgid "Manage users" +msgstr "" + +#: front/src/views/playlists/List.vue:8 +msgid "Manage your playlists" +msgstr "" + +#: front/src/components/manage/library/RequestsTable.vue:197 +msgid "Mark as closed" +msgstr "" + +#: front/src/components/manage/library/RequestsTable.vue:196 +msgid "Mark as imported" +msgstr "" + +#: front/src/components/library/import/Main.vue:12 +msgid "Metadata" +msgstr "" + +#: front/src/components/library/import/Main.vue:115 +msgid "" +"Metadata is the data related to the music you want to import. This includes all the information about the artists, albums and tracks. In order to have a high quality library, it is recommended to grab data from the\n" +" \n" +" MusicBrainz\n" +" \n" +" project, which you can think about as the Wikipedia of music." +msgstr "" + +#: front/src/components/Sidebar.vue:48 src/components/library/import/Main.vue:18 +msgid "Music" +msgstr "" + +#: front/src/components/library/import/Main.vue:147 +msgid "Music request" +msgstr "" + +#: front/src/components/audio/Player.vue:265 +msgid "Mute" +msgstr "" + +#: front/src/components/Sidebar.vue:34 +msgid "My account" +msgstr "" + +#: front/src/components/playlists/Form.vue:74 +msgid "My awesome playlist" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:227 +msgid "My awesome radio" +msgstr "" + +#: front/src/components/library/Track.vue:64 src/components/library/Track.vue:75 +#: front/src/components/library/Track.vue:86 +#: front/src/components/manage/library/FilesTable.vue:63 +#: front/src/components/manage/library/FilesTable.vue:69 +#: front/src/components/manage/library/FilesTable.vue:75 +#: front/src/components/manage/library/FilesTable.vue:81 +#: front/src/components/manage/library/RequestsTable.vue:71 +#: front/src/components/manage/library/RequestsTable.vue:75 +#: front/src/components/manage/library/RequestsTable.vue:82 +#: front/src/components/manage/users/UsersTable.vue:61 +#: front/src/views/admin/users/UsersDetail.vue:49 +msgid "N/A" +msgstr "" + +#: front/src/components/playlists/PlaylistModal.vue:31 +#: front/src/views/admin/users/UsersDetail.vue:21 +msgid "Name" +msgstr "" + +#: front/src/components/auth/Settings.vue:88 +#: front/src/views/auth/PasswordResetConfirm.vue:14 +msgid "New password" +msgstr "" + +#: front/src/components/Sidebar.vue:158 +msgid "New tracks will be appended here automatically." +msgstr "" + +#: front/src/components/library/import/Main.vue:29 +msgid "Next step" +msgstr "" + +#: front/src/components/audio/Player.vue:263 +msgid "Next track" +msgstr "" + +#: front/src/components/Sidebar.vue:125 +msgid "No" +msgstr "" + +#: front/src/components/Home.vue:103 +msgid "No add-ons, no plugins : you only need a web library" +msgstr "" + +#: front/src/components/library/Track.vue:102 +msgid "No lyrics available for this track." +msgstr "" + +#: front/src/components/playlists/Form.vue:81 +msgid "Nobody except me" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:32 +msgid "Not following" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:13 +#: front/src/components/federation/LibraryTrackTable.vue:67 +msgid "Not imported" +msgstr "" + +#: front/src/components/manage/users/InvitationsTable.vue:51 +msgid "Not used" +msgstr "" + +#: front/src/App.vue:37 +msgid "Official website" +msgstr "" + +#: front/src/components/auth/Settings.vue:83 +msgid "Old password" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:36 +msgid "Once all your files are uploaded, simply click the following button to check the import status." +msgstr "" + +#: front/src/components/federation/LibraryCard.vue:21 +#: front/src/components/manage/users/InvitationsTable.vue:20 +msgid "Open" +msgstr "" + +#: front/src/App.vue:63 +msgid "Options" +msgstr "" + +#: front/src/components/library/import/Main.vue:93 +msgid "Or" +msgstr "" + +#: front/src/components/favorites/List.vue:23 +#: front/src/components/federation/LibraryTrackTable.vue:18 +#: front/src/components/library/Artists.vue:15 src/components/library/Radios.vue:33 +#: front/src/components/manage/library/FilesTable.vue:9 +#: front/src/components/manage/library/RequestsTable.vue:9 +#: front/src/components/manage/users/InvitationsTable.vue:9 +#: front/src/components/manage/users/UsersTable.vue:9 +#: front/src/views/federation/LibraryList.vue:18 src/views/playlists/List.vue:17 +msgid "Ordering" +msgstr "" + +#: front/src/components/favorites/List.vue:31 +#: front/src/components/federation/LibraryTrackTable.vue:26 +#: front/src/components/library/Artists.vue:23 src/components/library/Radios.vue:41 +#: front/src/components/manage/library/FilesTable.vue:17 +#: front/src/components/manage/library/RequestsTable.vue:17 +#: front/src/components/manage/users/UsersTable.vue:17 +#: front/src/views/federation/LibraryList.vue:26 src/views/playlists/List.vue:25 +msgid "Ordering direction" +msgstr "" + +#: front/src/components/manage/users/InvitationsTable.vue:38 +msgid "Owner" +msgstr "" + +#: front/src/components/PageNotFound.vue:33 +msgid "Page Not Found" +msgstr "" + +#: front/src/components/PageNotFound.vue:7 +msgid "Page not found!" +msgstr "" + +#: front/src/components/auth/Login.vue:32 src/components/auth/Signup.vue:38 +msgid "Password" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:95 +msgid "Password updated" +msgstr "" + +#: front/src/views/auth/PasswordResetConfirm.vue:28 +msgid "Password updated successfully" +msgstr "" + +#: front/src/components/audio/Player.vue:262 +msgid "Pause track" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:46 +#: front/src/components/library/import/BatchDetail.vue:33 +#: front/src/components/library/import/BatchDetail.vue:69 +#: front/src/components/library/import/BatchList.vue:14 +#: front/src/components/library/import/FileUpload.vue:59 +#: front/src/components/manage/library/RequestsTable.vue:27 +#: front/src/components/manage/library/RequestsTable.vue:63 +msgid "Pending" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:11 +#: front/src/views/federation/LibraryDetail.vue:26 +msgid "Pending approval" +msgstr "" + +#: front/src/components/Sidebar.vue:217 +msgid "Pending follow requests" +msgstr "" + +#: front/src/components/Sidebar.vue:216 src/views/admin/library/Base.vue:26 +msgid "Pending import requests" +msgstr "" + +#: front/src/components/requests/Form.vue:26 src/views/federation/Base.vue:36 +msgid "Pending requests" +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:42 +#: front/src/views/admin/users/UsersDetail.vue:68 +msgid "Permissions" +msgstr "" + +#: front/src/components/audio/PlayButton.vue:9 src/components/library/Track.vue:30 +msgid "Play" +msgstr "" + +#: front/src/components/audio/album/Card.vue:50 +#: front/src/components/audio/artist/Card.vue:44 src/components/library/Album.vue:28 +#: front/src/views/playlists/Detail.vue:23 +msgid "Play all" +msgstr "" + +#: front/src/components/library/Artist.vue:26 +msgid "Play all albums" +msgstr "" + +#: front/src/components/audio/PlayButton.vue:58 +msgid "Play immediatly" +msgstr "" + +#: front/src/components/audio/PlayButton.vue:15 +msgid "Play next" +msgstr "" + +#: front/src/components/audio/PlayButton.vue:16 +msgid "Play now" +msgstr "" + +#: front/src/components/audio/Player.vue:261 +msgid "Play track" +msgstr "" + +#: front/src/views/playlists/Detail.vue:90 +msgid "Playlist" +msgstr "" + +#: front/src/views/playlists/Detail.vue:12 +msgid "Playlist containing %{ count } track, by %{ username }" +msgid_plural "Playlist containing %{ count } tracks, by %{ username }" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/playlists/Form.vue:9 +msgid "Playlist created" +msgstr "" + +#: front/src/components/playlists/Editor.vue:4 +msgid "Playlist editor" +msgstr "" + +#: front/src/components/playlists/Form.vue:21 +msgid "Playlist name" +msgstr "" + +#: front/src/components/playlists/Form.vue:6 +msgid "Playlist updated" +msgstr "" + +#: front/src/components/playlists/Form.vue:25 +msgid "Playlist visibility" +msgstr "" + +#: front/src/components/Sidebar.vue:56 src/components/library/Home.vue:16 +#: front/src/components/library/Library.vue:13 src/views/admin/Settings.vue:83 +#: front/src/views/playlists/List.vue:103 +msgid "Playlists" +msgstr "" + +#: front/src/components/Home.vue:56 +msgid "Playlists? We got them" +msgstr "" + +#: front/src/components/auth/Settings.vue:79 +msgid "Please double-check your password is correct" +msgstr "" + +#: front/src/components/auth/Login.vue:9 +msgid "Please double-check your username/password couple is correct" +msgstr "" + +#: front/src/components/auth/Settings.vue:46 +msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px." +msgstr "" + +#: front/src/components/library/import/Main.vue:26 +msgid "Previous step" +msgstr "" + +#: front/src/components/audio/Player.vue:260 +msgid "Previous track" +msgstr "" + +#: front/src/views/auth/EmailConfirm.vue:26 +#: front/src/views/auth/PasswordResetConfirm.vue:31 +msgid "Proceed to login" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:50 +msgid "Published date" +msgstr "" + +#: front/src/components/library/import/ArtistImport.vue:17 +msgid "Query template" +msgstr "" + +#: front/src/components/Sidebar.vue:20 +msgid "Queue" +msgstr "" + +#: front/src/components/audio/Player.vue:203 +msgid "Queue shuffled!" +msgstr "" + +#: front/src/views/radios/Detail.vue:80 +msgid "Radio" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:226 +msgid "Radio Builder" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:15 +msgid "Radio created" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:21 +msgid "Radio name" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:12 +msgid "Radio updated" +msgstr "" + +#: front/src/components/library/Library.vue:10 src/components/library/Radios.vue:141 +msgid "Radios" +msgstr "" + +#: front/src/views/instance/Timeline.vue:7 +msgid "Recent activity on this instance" +msgstr "" + +#: front/src/components/library/Home.vue:24 +msgid "Recently added" +msgstr "" + +#: front/src/components/library/Home.vue:11 +msgid "Recently favorited" +msgstr "" + +#: front/src/components/library/Home.vue:6 +msgid "Recently listened" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:81 +msgid "Recording MusicBrainz ID" +msgstr "" + +#: front/src/views/admin/users/UsersDetail.vue:84 +#: front/src/views/federation/LibraryDetail.vue:122 +msgid "Refresh" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:42 +msgid "Refused" +msgstr "" + +#: front/src/components/auth/Profile.vue:12 +msgid "Registered since %{ date }" +msgstr "" + +#: front/src/components/auth/Signup.vue:9 +msgid "Registration are closed on this instance, you will need an invitation code to signup." +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:71 +msgid "regular user" +msgstr "" + +#: front/src/components/library/radios/Filter.vue:59 +msgid "Remove" +msgstr "" + +#: front/src/components/auth/Settings.vue:58 +msgid "Remove avatar" +msgstr "" + +#: front/src/components/favorites/TrackFavoriteIcon.vue:19 +msgid "Remove from favorites" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:34 +#: front/src/components/auth/SubsonicTokenForm.vue:37 +msgid "Request a new password" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:35 +msgid "Request a new Subsonic API password?" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:43 +msgid "Request a password" +msgstr "" + +#: front/src/App.vue:35 +msgid "Request music" +msgstr "" + +#: front/src/views/library/MusicRequest.vue:4 src/views/library/MusicRequest.vue:21 +msgid "Request some music" +msgstr "" + +#: front/src/components/requests/Form.vue:20 +msgid "Request submitted!" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:49 +msgid "Rerun errored jobs" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:187 +msgid "Rerun job" +msgstr "" + +#: front/src/components/auth/Login.vue:34 src/views/auth/PasswordReset.vue:4 +#: front/src/views/auth/PasswordReset.vue:52 +msgid "Reset your password" +msgstr "" + +#: front/src/components/library/import/TrackImport.vue:31 +msgid "Result %{ current }/%{ total }" +msgstr "" + +#: front/src/components/favorites/List.vue:38 src/components/library/Artists.vue:30 +#: front/src/components/library/Radios.vue:52 src/views/federation/LibraryList.vue:33 +#: front/src/views/playlists/List.vue:32 +msgid "Results per page" +msgstr "" + +#: front/src/components/admin/SettingsGroup.vue:63 +#: front/src/components/library/radios/Builder.vue:29 +msgid "Save" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:112 +msgid "Scan triggered!" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:5 +#: front/src/components/library/Artists.vue:10 src/components/library/Radios.vue:29 +#: front/src/components/library/import/BatchDetail.vue:62 +#: front/src/components/library/import/BatchList.vue:7 +#: front/src/components/manage/library/FilesTable.vue:5 +#: front/src/components/manage/library/RequestsTable.vue:5 +#: front/src/components/manage/users/InvitationsTable.vue:5 +#: front/src/components/manage/users/UsersTable.vue:5 +#: front/src/views/federation/LibraryList.vue:14 src/views/playlists/List.vue:13 +msgid "Search" +msgstr "" + +#: front/src/components/library/import/Main.vue:85 +msgid "Search an entity you want to import:" +msgstr "" + +#: front/src/components/manage/library/RequestsTable.vue:180 +msgid "Search by artist, username, comment..." +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:188 +msgid "Search by source..." +msgstr "" + +#: front/src/components/library/import/BatchList.vue:116 +msgid "Search by submitter, source..." +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:182 +#: front/src/components/manage/library/FilesTable.vue:175 +msgid "Search by title, artist, domain..." +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:140 +msgid "Search by username, domain..." +msgstr "" + +#: front/src/components/manage/users/InvitationsTable.vue:152 +msgid "Search by username, email, code..." +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:162 +msgid "Search by username, email, name..." +msgstr "" + +#: front/src/components/audio/SearchBar.vue:20 +msgid "Search for artists, albums, tracks..." +msgstr "" + +#: front/src/components/audio/Search.vue:2 +msgid "Search for some music" +msgstr "" + +#: front/src/components/library/Track.vue:105 +msgid "Search on lyrics.wikia.com" +msgstr "" + +#: front/src/components/library/Album.vue:33 src/components/library/Artist.vue:31 +#: front/src/components/library/Track.vue:40 +msgid "Search on Wikipedia" +msgstr "" + +#: front/src/components/library/import/TrackImport.vue:42 +msgid "Search query" +msgstr "" + +#: front/src/views/admin/Settings.vue:15 +msgid "Sections" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:41 +msgid "Select a filter" +msgstr "" + +#: front/src/components/common/ActionTable.vue:61 +msgid "Select all %{ total } elements" +msgid_plural "Select all %{ total } elements" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/library/import/FileUpload.vue:22 +msgid "Select files to upload..." +msgstr "" + +#: front/src/components/common/ActionTable.vue:69 +msgid "Select only current page" +msgstr "" + +#: front/src/components/library/import/Main.vue:19 +msgid "Select relevant sources or files for import" +msgstr "" + +#: front/src/components/federation/LibraryCard.vue:43 +msgid "Send a follow request" +msgstr "" + +#: front/src/components/Sidebar.vue:97 src/components/manage/users/UsersTable.vue:184 +#: front/src/views/admin/users/UsersDetail.vue:165 +msgid "Settings" +msgstr "" + +#: front/src/components/auth/Settings.vue:10 +msgid "Settings updated" +msgstr "" + +#: front/src/components/admin/SettingsGroup.vue:11 +msgid "Settings updated successfully." +msgstr "" + +#: front/src/components/auth/Profile.vue:24 +msgid "Settings..." +msgstr "" + +#: front/src/components/manage/users/InvitationForm.vue:27 +msgid "Share link" +msgstr "" + +#: front/src/components/audio/artist/Card.vue:30 +msgid "Show 1 more album" +msgid_plural "Show %{ count } more albums" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/audio/album/Card.vue:40 +msgid "Show 1 more track" +msgid_plural "Show %{ count } more tracks" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/forms/PasswordInput.vue:25 +msgid "Show/hide password" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:97 +#: front/src/components/federation/LibraryTrackTable.vue:98 +#: front/src/components/library/import/BatchDetail.vue:128 +#: front/src/components/library/import/BatchList.vue:73 +#: front/src/components/manage/library/FilesTable.vue:97 +#: front/src/components/manage/library/RequestsTable.vue:104 +#: front/src/components/manage/users/InvitationsTable.vue:76 +#: front/src/components/manage/users/UsersTable.vue:87 +msgid "Showing results %{ start }-%{ end } on %{ total }" +msgstr "" + +#: front/src/components/audio/Player.vue:269 +msgid "Shuffle your queue" +msgstr "" + +#: front/src/components/auth/Signup.vue:95 +msgid "Sign Up" +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:40 +#: front/src/views/admin/users/UsersDetail.vue:37 +msgid "Sign-up" +msgstr "" + +#: front/src/components/audio/track/Table.vue:31 +msgid "Simply copy paste the snippet below into a terminal to launch the download." +msgstr "" + +#: front/src/components/library/Track.vue:69 +#: front/src/components/library/import/FileUpload.vue:44 +#: front/src/components/manage/library/FilesTable.vue:44 +msgid "Size" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:37 +#: front/src/components/library/import/BatchDetail.vue:72 +msgid "Skipped" +msgstr "" + +#: front/src/components/requests/Form.vue:3 +msgid "Something's missing in the library? Let us know what you would like to listen!" +msgstr "" + +#: front/src/components/audio/Search.vue:25 +msgid "Sorry, we did not found any album matching your query" +msgstr "" + +#: front/src/components/audio/Search.vue:16 +msgid "Sorry, we did not found any artist matching your query" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:82 +#: front/src/components/library/import/BatchList.vue:38 +#: front/src/components/library/import/TrackImport.vue:17 +msgid "Source" +msgstr "" + +#: front/src/App.vue:41 +msgid "Source code" +msgstr "" + +#: front/src/App.vue:40 +msgid "Source code (%{version})" +msgstr "" + +#: front/src/components/auth/Profile.vue:20 +#: front/src/components/manage/users/UsersTable.vue:70 +msgid "Staff member" +msgstr "" + +#: front/src/components/radios/Button.vue:4 +msgid "Start" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:28 +msgid "Start Upload" +msgstr "" + +#: front/src/views/admin/Settings.vue:86 +msgid "Statistics" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:23 +#: front/src/components/federation/LibraryTrackTable.vue:46 +#: front/src/components/library/import/BatchDetail.vue:66 +#: front/src/components/library/import/BatchDetail.vue:83 +#: front/src/components/library/import/BatchList.vue:11 +#: front/src/components/library/import/BatchList.vue:37 +#: front/src/components/library/import/FileUpload.vue:45 +#: front/src/components/manage/library/RequestsTable.vue:24 +#: front/src/components/manage/library/RequestsTable.vue:48 +#: front/src/components/manage/users/InvitationsTable.vue:17 +#: front/src/components/manage/users/InvitationsTable.vue:39 +#: front/src/components/manage/users/UsersTable.vue:43 +msgid "Status" +msgstr "" + +#: front/src/components/radios/Button.vue:3 +msgid "Stop" +msgstr "" + +#: front/src/components/Sidebar.vue:159 +msgid "Stop radio" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:32 +msgid "Stop Upload" +msgstr "" + +#: front/src/App.vue:9 src/components/requests/Form.vue:17 +msgid "Submit" +msgstr "" + +#: front/src/components/requests/Form.vue:22 +msgid "Submit another request" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:26 +#: front/src/components/library/import/BatchList.vue:39 +msgid "Submitted by" +msgstr "" + +#: front/src/views/admin/Settings.vue:85 +msgid "Subsonic" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:2 +msgid "Subsonic API password" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:71 +#: front/src/components/library/import/BatchList.vue:16 +#: front/src/components/library/import/FileUpload.vue:56 +msgid "Success" +msgstr "" + +#: front/src/App.vue:11 +msgid "Suggested choices" +msgstr "" + +#: front/src/components/playlists/Editor.vue:9 +msgid "Syncing changes to server..." +msgstr "" + +#: front/src/components/Home.vue:26 +msgid "That's simple: we loved Grooveshark and we want to build something even better." +msgstr "" + +#: front/src/components/requests/Form.vue:73 +msgid "The Beatles, Mickael Jackson…" +msgstr "" + +#: front/src/App.vue:59 +msgid "The funkwhale logo was kindly designed and provided by Francis Gading." +msgstr "" + +#: front/src/components/Home.vue:124 +msgid "The plaform is free and open-source, you can install it and modify it without worries" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:4 +msgid "The Subsonic API is not available on this Funkwhale instance." +msgstr "" + +#: front/src/components/requests/Form.vue:74 +msgid "The White Album, Thriller…" +msgstr "" + +#: front/src/components/audio/track/Table.vue:30 +msgid "There is currently no way to download directly multiple tracks from funkwhale as a ZIP archive. However, you can use a command line tools such as cURL to easily download a list of tracks." +msgstr "" + +#: front/src/components/library/import/Main.vue:149 +msgid "This import will be associated with the music request below. After the import is finished, the request will be marked as fulfilled." +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:195 +msgid "This indicate if the remote library granted you access" +msgstr "" + +#: front/src/components/auth/Profile.vue:16 +msgid "This is you!" +msgstr "" + +#: front/src/components/common/ActionTable.vue:37 +msgid "This may affect a lot of elements, please double check this is really what you want." +msgstr "" + +#: front/src/components/audio/PlayButton.vue:61 +msgid "This track is not imported and cannot be played" +msgstr "" + +#: front/src/views/playlists/Detail.vue:37 +msgid "This will completely delete this playlist and cannot be undone." +msgstr "" + +#: front/src/views/radios/Detail.vue:27 +msgid "This will completely delete this radio and cannot be undone." +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:51 +msgid "This will completely disable access to the Subsonic API using from account." +msgstr "" + +#: front/src/App.vue:137 +msgid "This will erase your local data and disconnect you, do you want to continue?" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:36 +msgid "This will log you out from existing devices that use the current password." +msgstr "" + +#: front/src/components/playlists/Editor.vue:44 +msgid "This will remove all tracks from this playlist and cannot be undone." +msgstr "" + +#: front/src/components/audio/track/Table.vue:6 +#: front/src/components/federation/LibraryTrackTable.vue:47 +#: front/src/components/manage/library/FilesTable.vue:37 +msgid "Title" +msgstr "" + +#: front/src/components/audio/SearchBar.vue:27 src/components/library/Track.vue:174 +#: front/src/components/library/import/BatchDetail.vue:84 +#: front/src/components/metadata/Search.vue:138 +msgid "Track" +msgstr "" + +#: front/src/components/library/Track.vue:53 +msgid "Track information" +msgstr "" + +#: front/src/components/library/radios/Filter.vue:44 +msgid "Track matching filter" +msgstr "" + +#: front/src/components/instance/Stats.vue:54 +msgid "tracks" +msgstr "" + +#: front/src/components/library/Album.vue:43 +#: front/src/components/playlists/PlaylistModal.vue:33 +#: front/src/views/federation/Base.vue:8 src/views/playlists/Detail.vue:50 +#: front/src/views/radios/Detail.vue:34 +msgid "Tracks" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:125 +msgid "Tracks available in this library" +msgstr "" + +#: front/src/components/library/Artist.vue:54 +msgid "Tracks by this artist" +msgstr "" + +#: front/src/components/instance/Stats.vue:25 +msgid "Tracks favorited" +msgstr "" + +#: front/src/components/instance/Stats.vue:19 +msgid "tracks listened" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:109 +msgid "Trigger scan" +msgstr "" + +#: front/src/components/manage/library/FilesTable.vue:41 +msgid "Type" +msgstr "" + +#: front/src/components/About.vue:15 +msgid "Unfortunately, owners of this instance did not yet take the time to complete this page." +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:95 +msgid "Unknown" +msgstr "" + +#: front/src/components/Home.vue:37 +msgid "Unlimited music" +msgstr "" + +#: front/src/components/audio/Player.vue:264 +msgid "Unmute" +msgstr "" + +#: front/src/components/auth/Settings.vue:50 +msgid "Update avatar" +msgstr "" + +#: front/src/components/playlists/Form.vue:33 +msgid "Update playlist" +msgstr "" + +#: front/src/components/auth/Settings.vue:27 +msgid "Update settings" +msgstr "" + +#: front/src/views/auth/PasswordResetConfirm.vue:21 +msgid "Update your password" +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:172 +#: front/src/views/admin/users/UsersDetail.vue:153 +msgid "Upload" +msgstr "" + +#: front/src/components/auth/Settings.vue:45 +msgid "Upload a new avatar" +msgstr "" + +#: front/src/components/library/import/Main.vue:7 +msgid "Uploaded files or external source" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:57 +msgid "Uploading..." +msgstr "" + +#: front/src/App.vue:45 +msgid "Use another instance" +msgstr "" + +#: front/src/components/requests/Form.vue:75 +msgid "Use this comment box to add details to your request if needed" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:196 +msgid "Use this flag to enable/disable federation with this library" +msgstr "" + +#: front/src/views/auth/PasswordReset.vue:12 +msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password." +msgstr "" + +#: front/src/components/federation/LibraryForm.vue:6 +msgid "Use this form to scan an instance and setup federation." +msgstr "" + +#: front/src/components/manage/users/InvitationsTable.vue:49 +msgid "Used" +msgstr "" + +#: front/src/components/manage/library/RequestsTable.vue:47 +msgid "User" +msgstr "" + +#: front/src/components/instance/Stats.vue:5 +msgid "User activity" +msgstr "" + +#: front/src/components/library/Radios.vue:20 +msgid "User radios" +msgstr "" + +#: front/src/components/auth/Signup.vue:19 +#: front/src/components/manage/users/UsersTable.vue:37 +msgid "Username" +msgstr "" + +#: front/src/components/auth/Login.vue:15 +msgid "Username or email" +msgstr "" + +#: front/src/components/instance/Stats.vue:13 +msgid "users" +msgstr "" + +#: front/src/components/Sidebar.vue:103 src/views/admin/Settings.vue:81 +#: front/src/views/admin/users/Base.vue:5 src/views/admin/users/UsersList.vue:3 +#: front/src/views/admin/users/UsersList.vue:21 +msgid "Users" +msgstr "" + +#: front/src/components/library/Album.vue:37 src/components/library/Artist.vue:35 +#: front/src/components/library/Track.vue:44 +#: front/src/components/library/import/ArtistImport.vue:131 +#: front/src/components/metadata/ArtistCard.vue:49 +#: front/src/components/metadata/ReleaseCard.vue:53 +msgid "View on MusicBrainz" +msgstr "" + +#: front/src/components/playlists/PlaylistModal.vue:20 +msgid "We cannot add the track to a playlist" +msgstr "" + +#: front/src/components/playlists/Form.vue:14 +msgid "We cannot create the playlist" +msgstr "" + +#: front/src/components/auth/Signup.vue:13 +msgid "We cannot create your account" +msgstr "" + +#: front/src/components/auth/Login.vue:7 +msgid "We cannot log you in" +msgstr "" + +#: front/src/components/auth/Settings.vue:38 +msgid "We cannot save your avatar" +msgstr "" + +#: front/src/components/auth/Settings.vue:14 +msgid "We cannot save your settings" +msgstr "" + +#: front/src/components/Home.vue:130 +msgid "We do not track you or bother you with ads" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:5 +msgid "We recommend using Picard for that purpose." +msgstr "" + +#: front/src/components/Home.vue:7 +msgid "We think listening to music should be simple." +msgstr "" + +#: front/src/components/PageNotFound.vue:10 +msgid "We're sorry, the page you asked for does not exist:" +msgstr "" + +#: front/src/components/requests/Form.vue:21 +msgid "We've received your request, you'll get some groove soon ;)" +msgstr "" + +#: front/src/components/Home.vue:152 +msgid "Welcome" +msgstr "" + +#: front/src/components/Home.vue:5 +msgid "Welcome on Funkwhale" +msgstr "" + +#: front/src/components/library/import/Main.vue:114 +msgid "What is metadata?" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:197 +msgid "When enabled, auto importing will automatically import new tracks published in this library" +msgstr "" + +#: front/src/components/Home.vue:24 +msgid "Why funkwhale?" +msgstr "" + +#: front/src/components/Sidebar.vue:124 +msgid "Yes" +msgstr "" + +#: front/src/components/auth/Logout.vue:8 +msgid "Yes, log me out!" +msgstr "" + +#: front/src/components/auth/Logout.vue:7 +msgid "You are currently logged in as %{ username }" +msgstr "" + +#: front/src/components/library/import/Main.vue:111 +msgid "You can also skip this step and enter metadata manually." +msgstr "" + +#: front/src/components/Home.vue:136 +msgid "You can invite friends and family to your instance so they can enjoy your music" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:7 +msgid "You can use this interface to build your own custom radio, which will play tracks according to your criteria." +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:8 +msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance." +msgstr "" + +#: front/src/components/Sidebar.vue:156 +msgid "You have a radio playing" +msgstr "" + +#: front/src/App.vue:6 +msgid "You need to select an instance in order to continue" +msgstr "" + +#: front/src/components/auth/Settings.vue:100 +msgid "You will be logged out from this session and have to log in with the new one" +msgstr "" + +#: front/src/components/auth/Settings.vue:71 +msgid "You will have to update your password on your clients that use this password." +msgstr "" + +#: front/src/components/library/import/Main.vue:103 +msgid "You will import:" +msgstr "" + +#: front/src/views/auth/EmailConfirm.vue:24 +msgid "Your email address was confirmed, you can now use the service without limitations." +msgstr "" + +#: front/src/components/favorites/List.vue:109 +msgid "Your Favorites" +msgstr "" + +#: front/src/components/Home.vue:117 +msgid "Your music, your way" +msgstr "" + +#: front/src/views/auth/PasswordResetConfirm.vue:29 +msgid "Your password has been updated successfully." +msgstr "" + +#: front/src/components/auth/Settings.vue:101 +msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password" +msgstr "" + +#: front/src/components/audio/PlayButton.vue:156 +msgid "%{ count } track was added to your queue" +msgid_plural "%{ count } tracks were added to your queue" +msgstr[0] "" +msgstr[1] "" diff --git a/front/locales/ar/LC_MESSAGES/app.po b/front/locales/ar/LC_MESSAGES/app.po new file mode 100644 index 000000000..b027ab1ee --- /dev/null +++ b/front/locales/ar/LC_MESSAGES/app.po @@ -0,0 +1,2536 @@ +msgid "" +msgstr "" +"Project-Id-Version: Arabic (FunkWhale)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-07-22 14:12+0200\n" +"PO-Revision-Date: 2018-07-22 15:50+0000\n" +"Last-Translator: ButterflyOfFire \n" +"Language-Team: Arabic \n" +"Language: ar\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " +"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" +"X-Generator: Weblate 2.20\n" + +#: front/src/components/playlists/PlaylistModal.vue:9 +msgid "\"%{ title }\", by %{ artist }" +msgstr "\"%{ title }\"، لِـ %{ artist }" + +#: front/src/components/Sidebar.vue:24 +msgid "(%{ index } of %{ length })" +msgstr "(%{ index } مِن %{ length })" + +#: front/src/components/Sidebar.vue:22 +msgid "(empty)" +msgstr "(فارغ)" + +#: front/src/components/common/ActionTable.vue:43 +#: front/src/components/common/ActionTable.vue:51 +msgid "%{ count } on %{ total } selected" +msgid_plural "%{ count } on %{ total } selected" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: front/src/components/Sidebar.vue:116 +#: src/views/federation/LibraryDetail.vue:87 +msgid "%{ count } track" +msgid_plural "%{ count } tracks" +msgstr[0] "" +msgstr[1] "%{ count } مَقطَع" +msgstr[2] "" +msgstr[3] "%{ count } مَقاطِع" +msgstr[4] "%{ count } مَقاطِع" +msgstr[5] "%{ count } مَقاطِع" + +#: front/src/components/library/Artist.vue:13 +msgid "%{ count } track in %{ albumsCount } albums" +msgid_plural "%{ count } tracks in %{ albumsCount } albums" +msgstr[0] "" +msgstr[1] "%{ count } مَقطَع في %{ albumsCount } ألبومات" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "%{ count } مَقاطِع في %{ albumsCount } ألبومات" +msgstr[5] "%{ count } مَقاطِع في %{ albumsCount } ألبومات" + +#: front/src/components/library/radios/Builder.vue:76 +msgid "%{ count } track matching combined filters" +msgid_plural "%{ count } tracks matching combined filters" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: front/src/components/playlists/Card.vue:18 +msgid "%{ count} track" +msgid_plural "%{ count } tracks" +msgstr[0] "" +msgstr[1] "%{ count } مَقطَع" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "%{ count } مَقاطِع" +msgstr[5] "%{ count } مَقاطِع" + +#: front/src/components/common/Duration.vue:2 +msgid "%{ hours } h %{ minutes } min" +msgstr "" + +#: front/src/components/common/Duration.vue:5 +msgid "%{ minutes } min" +msgstr "" + +#: front/src/components/activity/Like.vue:7 +msgid "%{ user } favorited a track" +msgstr "" + +#: front/src/components/activity/Listen.vue:7 +msgid "%{ user } listened to a track" +msgstr "" + +#: front/src/components/auth/Profile.vue:49 +msgid "%{ username }'s profile" +msgstr "الملف الشخصي لِـ %{ username }" + +#: front/src/components/audio/artist/Card.vue:41 +msgid "1 album" +msgid_plural "%{ count } albums" +msgstr[0] "ألبوم واحد" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "%{ count } ألبومات" +msgstr[5] "%{ count } ألبومات" + +#: front/src/components/favorites/List.vue:10 +msgid "1 favorite" +msgid_plural "%{ count } favorites" +msgstr[0] "مفضّلة واحدة" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "%{ count } مفضّلات" +msgstr[4] "%{ count } مفضّلات" +msgstr[5] "%{ count } مفضّلات" + +#: front/src/components/audio/album/Card.vue:54 +#: front/src/components/federation/LibraryCard.vue:25 +msgid "1 track" +msgid_plural "%{ count } tracks" +msgstr[0] "مَقطَع واحد" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "%{ count } مَقاطِع" +msgstr[5] "%{ count } مَقاطِع" + +#: front/src/components/About.vue:5 +#, fuzzy +msgid "About %{ instance }" +msgstr "عن مثيل الخادوم هذا" + +#: front/src/App.vue:54 +msgid "About Funkwhale" +msgstr "عن فانك وايل Funkwhale" + +#: front/src/App.vue:32 src/components/About.vue:8 src/components/About.vue:55 +msgid "About this instance" +msgstr "عن مثيل الخادوم هذا" + +#: front/src/components/manage/library/RequestsTable.vue:28 +#: front/src/components/manage/library/RequestsTable.vue:62 +msgid "Accepted" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:111 +msgid "Access disabled" +msgstr "" + +#: front/src/components/Home.vue:109 +msgid "Access your music from a clean interface that focus on what really matters" +msgstr "صِلوا إلى موسيقاكم عبر واجهة نظيفة التصميم تُركّز فعلًا على الأهمّ" + +#: front/src/views/admin/users/UsersDetail.vue:54 +msgid "Account active" +msgstr "الحساب نشِط" + +#: front/src/components/auth/Settings.vue:5 +msgid "Account settings" +msgstr "إعدادات الحساب" + +#: front/src/components/auth/Settings.vue:257 +msgid "Account Settings" +msgstr "إعدادات الحساب" + +#: front/src/components/manage/users/UsersTable.vue:39 +msgid "Account status" +msgstr "حالة الحساب" + +#: front/src/views/auth/PasswordReset.vue:14 +msgid "Account's email" +msgstr "البريد الإلكتروني الخاص بالحساب" + +#: front/src/components/common/ActionTable.vue:82 +msgid "Action %{ action } was launched successfully on %{ count } element" +msgid_plural "Action %{ action } was launched successfully on %{ count } elements" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: front/src/components/common/ActionTable.vue:8 +#: front/src/components/federation/LibraryFollowTable.vue:24 +#: front/src/components/library/radios/Builder.vue:60 +#: front/src/components/manage/library/RequestsTable.vue:54 +msgid "Actions" +msgstr "الإجراءات" + +#: front/src/components/manage/users/UsersTable.vue:53 +msgid "Active" +msgstr "النشاط" + +#: front/src/components/Sidebar.vue:60 +msgid "Activity" +msgstr "النشاط" + +#: front/src/components/federation/LibraryFollowTable.vue:21 +msgid "Actor" +msgstr "" + +#: front/src/views/federation/LibraryList.vue:8 +msgid "Add a new library" +msgstr "إضافة مكتبة جديدة" + +#: front/src/components/library/radios/Builder.vue:46 +msgid "Add filter" +msgstr "إضافة عامل تصفية" + +#: front/src/components/library/radios/Builder.vue:36 +msgid "Add filters to customize your radio" +msgstr "قم بإضافة عوامل تصفية لتخصيص إذاعتك" + +#: front/src/components/audio/PlayButton.vue:53 +msgid "Add to current queue" +msgstr "إضافة إلى قائمة الانتظار الحالية" + +#: front/src/components/favorites/TrackFavoriteIcon.vue:4 +#: front/src/components/favorites/TrackFavoriteIcon.vue:21 +msgid "Add to favorites" +msgstr "إضافة إلى المفضلة" + +#: front/src/components/playlists/TrackPlaylistIcon.vue:6 +#: front/src/components/playlists/TrackPlaylistIcon.vue:32 +msgid "Add to playlist..." +msgstr "إضافة إلى قائمة المقاطع الموسيقية …" + +#: front/src/components/audio/PlayButton.vue:14 +msgid "Add to queue" +msgstr "أضِف إلى قائمة الانتظار" + +#: front/src/components/playlists/PlaylistModal.vue:116 +msgid "Add to this playlist" +msgstr "أضفه إلى قائمة التشغيل هذه" + +#: front/src/components/playlists/PlaylistModal.vue:54 +msgid "Add track" +msgstr "إضافة مقطع موسيقي" + +#: front/src/components/manage/users/UsersTable.vue:69 +msgid "Admin" +msgstr "المدير" + +#: front/src/components/Sidebar.vue:64 +msgid "Administration" +msgstr "الإدارة" + +#: front/src/components/audio/SearchBar.vue:26 +#: src/components/audio/track/Table.vue:8 +#: front/src/components/federation/LibraryTrackTable.vue:49 +#: front/src/components/library/Album.vue:91 +#: front/src/components/manage/library/FilesTable.vue:39 +#: front/src/components/metadata/Search.vue:134 +msgid "Album" +msgstr "الألبوم" + +#: front/src/components/library/import/ReleaseImport.vue:3 +msgid "Album %{ title } (%{ count } track) by %{ artist }" +msgid_plural "Album %{ title } (%{ count } tracks) by %{ artist }" +msgstr[0] "" +msgstr[1] "ألبوم %{ title } (%{ count } tracks) لِـ %{ artist }" +msgstr[2] "" +msgstr[3] "ألبوم %{ title } (%{ count } tracks) لِـ %{ artist }" +msgstr[4] "ألبوم %{ title } (%{ count } tracks) لِـ %{ artist }" +msgstr[5] "ألبوم %{ title } (%{ count } tracks) لِـ %{ artist }" + +#: front/src/components/library/Album.vue:12 +msgid "Album containing %{ count } track, by %{ artist }" +msgid_plural "Album containing %{ count } tracks, by %{ artist }" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: front/src/components/library/Track.vue:20 +msgid "Album page" +msgstr "صفحة الألبوم" + +#: front/src/components/audio/Search.vue:19 +#: src/components/instance/Stats.vue:48 +#: front/src/components/manage/library/RequestsTable.vue:50 +#: front/src/components/requests/Form.vue:9 +msgid "Albums" +msgstr "الألبومات" + +#: front/src/components/library/Artist.vue:44 +msgid "Albums by this artist" +msgstr "مِن ألبومات هذا الفنان" + +#: front/src/components/manage/library/RequestsTable.vue:26 +#: front/src/components/manage/users/InvitationsTable.vue:19 +msgid "All" +msgstr "الكل" + +#: front/src/components/playlists/Editor.vue:13 +msgid "An error occured while saving your changes" +msgstr "حدث خطأ أثناء عملية حفظ التغييرات" + +#: front/src/components/auth/Login.vue:10 +msgid "An unknown error happend, this can mean the server is down or cannot be reached" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:11 +#: front/src/components/library/import/BatchDetail.vue:68 +#: front/src/components/library/import/BatchList.vue:13 +#: front/src/components/library/import/BatchList.vue:22 +msgid "Any" +msgstr "الكل" + +#: front/src/components/library/import/BatchList.vue:24 +msgid "API" +msgstr "واجهة برمجة التطبيقات API" + +#: front/src/components/federation/LibraryFollowTable.vue:68 +#: front/src/components/federation/LibraryFollowTable.vue:78 +msgid "Approve" +msgstr "وافق" + +#: front/src/components/federation/LibraryFollowTable.vue:70 +msgid "Approve access?" +msgstr "ترخيص النفاذ ؟" + +#: front/src/components/federation/LibraryFollowTable.vue:38 +msgid "Approved" +msgstr "مرخّص" + +#: front/src/components/auth/Logout.vue:5 +msgid "Are you sure you want to log out?" +msgstr "أمتأكد من أنك تريد الخروج ؟" + +#: front/src/components/audio/SearchBar.vue:25 +#: src/components/audio/track/Table.vue:7 +#: front/src/components/federation/LibraryTrackTable.vue:48 +#: front/src/components/library/Artist.vue:119 +#: front/src/components/manage/library/FilesTable.vue:38 +#: front/src/components/manage/library/RequestsTable.vue:49 +#: front/src/components/metadata/Search.vue:130 +msgid "Artist" +msgstr "الفنان" + +#: front/src/components/requests/Form.vue:5 +msgid "Artist name" +msgstr "إسم الفنان" + +#: front/src/components/library/Album.vue:22 +#: src/components/library/Track.vue:23 +msgid "Artist page" +msgstr "صفحة الفنان" + +#: front/src/components/audio/Search.vue:65 +msgid "Artist, album, track..." +msgstr "فنان ، ألبوم ، مقطع موسيقي ..." + +#: front/src/components/audio/Search.vue:10 +#: src/components/instance/Stats.vue:42 +#: front/src/components/library/Artists.vue:119 +#: src/components/library/Library.vue:7 +msgid "Artists" +msgstr "الفنانون" + +#: front/src/components/favorites/List.vue:33 +#: front/src/components/federation/LibraryTrackTable.vue:28 +#: front/src/components/library/Artists.vue:25 +#: src/components/library/Radios.vue:44 +#: front/src/components/manage/library/FilesTable.vue:19 +#: front/src/components/manage/library/RequestsTable.vue:19 +#: front/src/components/manage/users/UsersTable.vue:19 +#: front/src/views/federation/LibraryList.vue:28 +#: src/views/playlists/List.vue:27 +msgid "Ascending" +msgstr "تصاعدي" + +#: front/src/views/auth/PasswordReset.vue:27 +msgid "Ask for a password reset" +msgstr "أطلب إعادة تعيين كلمة المرور" + +#: front/src/views/federation/LibraryDetail.vue:56 +msgid "Auto importing" +msgstr "إستيراد تلقائي" + +#: front/src/components/playlists/PlaylistModal.vue:26 +msgid "Available playlists" +msgstr "قوائم المقاطع الموسيقية المتوفرة" + +#: front/src/components/auth/Settings.vue:34 +msgid "Avatar" +msgstr "الصورة الرمزية" + +#: front/src/views/auth/EmailConfirm.vue:17 src/views/auth/PasswordReset.vue:24 +#: front/src/views/auth/PasswordResetConfirm.vue:18 +msgid "Back to login" +msgstr "العودة إلى صفحة تسجيل الدخول" + +#: front/src/views/federation/LibraryFollowersList.vue:5 +msgid "Be careful when accepting follow requests, as it means the follower will have access to your entire library." +msgstr "" + +#: front/src/components/library/Track.vue:80 +#: front/src/components/manage/library/FilesTable.vue:42 +msgid "Bitrate" +msgstr "معدل البت" + +#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4 +msgid "Browse" +msgstr "تصفّح" + +#: front/src/components/Sidebar.vue:50 +msgid "Browse library" +msgstr "تصفح المكتبة" + +#: front/src/components/library/Artists.vue:4 +msgid "Browsing artists" +msgstr "استعراض الفنانين" + +#: front/src/views/federation/LibraryTrackList.vue:3 +msgid "Browsing federated tracks" +msgstr "تصفح المَقاطع الموسيقية المتحدة" + +#: front/src/views/federation/LibraryFollowersList.vue:3 +msgid "Browsing followers" +msgstr "إستكشاف المُشاركين" + +#: front/src/views/federation/LibraryList.vue:3 +msgid "Browsing libraries" +msgstr "تصفّح المكتبات" + +#: front/src/views/playlists/List.vue:3 +msgid "Browsing playlists" +msgstr "تصفّح قوائم المَقاطِع الموسيقية" + +#: front/src/components/library/Radios.vue:4 +msgid "Browsing radios" +msgstr "تصفّح الإذاعات" + +#: front/src/components/library/radios/Builder.vue:5 +msgid "Builder" +msgstr "المحرّر" + +#: front/src/components/audio/album/Card.vue:13 +msgid "By %{ artist }" +msgstr "حسب %{ artist }" + +#: front/src/components/federation/LibraryFollowTable.vue:57 +msgid "By confirming, %{ username } will be denied access to your library." +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:73 +msgid "By confirming, %{ username } will be granted access to your library." +msgstr "" + +#: front/src/components/audio/track/Table.vue:43 +#: front/src/components/common/DangerousButton.vue:17 +#: front/src/components/library/radios/Filter.vue:53 +#: front/src/components/playlists/PlaylistModal.vue:63 +msgid "Cancel" +msgstr "إلغاء" + +#: front/src/components/library/radios/Builder.vue:59 +msgid "Candidates" +msgstr "" + +#: front/src/components/auth/Settings.vue:76 +msgid "Cannot change your password" +msgstr "لا يمكن تغيير كلمة المرور" + +#: front/src/App.vue:66 +msgid "Change language" +msgstr "تغيير اللغة" + +#: front/src/components/auth/Settings.vue:67 +msgid "Change my password" +msgstr "تغيير الكلمة السرية" + +#: front/src/components/auth/Settings.vue:95 +msgid "Change password" +msgstr "تغيير كلمة المرور" + +#: front/src/views/auth/PasswordResetConfirm.vue:4 +#: front/src/views/auth/PasswordResetConfirm.vue:62 +msgid "Change your password" +msgstr "عدّل كلمتك السرية" + +#: front/src/components/auth/Settings.vue:96 +msgid "Change your password?" +msgstr "هل تريد تغيير كلمتك السريّة ؟" + +#: front/src/components/playlists/Editor.vue:21 +msgid "Changes synced with server" +msgstr "تمت مزامنة التعديلات مع السيرفر" + +#: front/src/components/auth/Settings.vue:70 +msgid "Changing your password will also change your Subsonic API password if you have requested one." +msgstr "" + +#: front/src/components/auth/Settings.vue:98 +msgid "Changing your password will have the following consequences" +msgstr "" + +#: front/src/App.vue:4 +msgid "Choose your instance" +msgstr "اختر خادومك" + +#: front/src/components/Home.vue:64 +msgid "Clean library" +msgstr "مكتبة موسيقية ذات جودة عالية" + +#: front/src/components/manage/users/InvitationForm.vue:37 +msgid "Clear" +msgstr "امسح" + +#: front/src/components/playlists/Editor.vue:40 +#: front/src/components/playlists/Editor.vue:45 +msgid "Clear playlist" +msgstr "مسح قائمة المَقاطع الموسيقية" + +#: front/src/components/audio/Player.vue:270 +msgid "Clear your queue" +msgstr "مسح قائمة الانتظار الخاصة بك" + +#: front/src/components/library/import/BatchList.vue:23 +msgid "CLI" +msgstr "واجهة إدخال سطر الأوامر CLI" + +#: front/src/components/Home.vue:44 +msgid "Click once, listen for hours using built-in radios" +msgstr "إضغط مرة واحدة و استمع لساعات مِن الموسيقى عبر الإذاعات المُدمَجة" + +#: front/src/components/manage/library/RequestsTable.vue:30 +#: front/src/components/manage/library/RequestsTable.vue:64 +msgid "Closed" +msgstr "مُغلَقة" + +#: front/src/components/manage/users/InvitationForm.vue:26 +#: front/src/components/manage/users/InvitationsTable.vue:42 +msgid "Code" +msgstr "الرمز" + +#: front/src/components/audio/album/Card.vue:43 +#: front/src/components/audio/artist/Card.vue:33 +#: front/src/components/discussion/Comment.vue:20 +msgid "Collapse" +msgstr "" + +#: front/src/components/manage/library/RequestsTable.vue:51 +#: front/src/components/requests/Form.vue:14 +msgid "Comment" +msgstr "تعليق" + +#: front/src/components/library/radios/Builder.vue:58 +msgid "Config" +msgstr "" + +#: front/src/components/common/DangerousButton.vue:21 +msgid "Confirm" +msgstr "تأكيد" + +#: front/src/views/auth/EmailConfirm.vue:4 src/views/auth/EmailConfirm.vue:20 +#: front/src/views/auth/EmailConfirm.vue:51 +msgid "Confirm your email" +msgstr "تأكيد بريدك الإلكتروني" + +#: front/src/views/auth/EmailConfirm.vue:13 +msgid "Confirmation code" +msgstr "رمز التأكيد" + +#: front/src/components/playlists/Editor.vue:163 +msgid "Copy tracks from current queue to playlist" +msgstr "نسخ المَقاطِع مِن قائمة الإنتظار الحالية إلى قائمة التشغيل" + +#: front/src/components/Home.vue:88 +msgid "Covers, lyrics, our goal is to have them all ;)" +msgstr "أغلِفة الألبومات و كلمات الأغاني، هدفنا هو دمجها جميعا ;)" + +#: front/src/components/auth/Signup.vue:4 +msgid "Create a funkwhale account" +msgstr "أنشئ حسابا على فانك وايل" + +#: front/src/components/playlists/Form.vue:2 +msgid "Create a new playlist" +msgstr "أنشئ قائمة مَقاطِع موسيقية جديدة" + +#: front/src/components/auth/Login.vue:17 +msgid "Create an account" +msgstr "أنشئ حسابا" + +#: front/src/components/manage/library/RequestsTable.vue:88 +#: front/src/components/requests/Card.vue:25 +msgid "Create import" +msgstr "إنشاء استيراد" + +#: front/src/components/auth/Signup.vue:51 +msgid "Create my account" +msgstr "أنشئ حسابي" + +#: front/src/components/playlists/Form.vue:34 +msgid "Create playlist" +msgstr "أنشئ قائمة مَقاطع موسيقية" + +#: front/src/components/library/Radios.vue:23 +msgid "Create your own radio" +msgstr "أنشئ إذاعتك" + +#: front/src/components/federation/LibraryFollowTable.vue:22 +#: front/src/components/manage/library/RequestsTable.vue:52 +#: front/src/components/manage/users/InvitationsTable.vue:40 +msgid "Creation date" +msgstr "تاريخ الإنشاء" + +#: front/src/components/auth/Settings.vue:54 +#, fuzzy +msgid "Current avatar" +msgstr "المَقطَع الحالي" + +#: front/src/components/playlists/PlaylistModal.vue:8 +msgid "Current track" +msgstr "المَقطَع الحالي" + +#: front/src/components/manage/library/FilesTable.vue:189 +#: front/src/components/manage/library/RequestsTable.vue:195 +#: front/src/components/manage/users/InvitationsTable.vue:166 +#: front/src/views/playlists/Detail.vue:33 +msgid "Delete" +msgstr "حذف" + +#: front/src/views/playlists/Detail.vue:38 +msgid "Delete playlist" +msgstr "حذف قائمة الأغاني" + +#: front/src/views/radios/Detail.vue:28 +msgid "Delete radio" +msgstr "حذف الإذاعة" + +#: front/src/components/federation/LibraryFollowTable.vue:52 +#: front/src/components/federation/LibraryFollowTable.vue:63 +msgid "Deny" +msgstr "رفض" + +#: front/src/components/federation/LibraryFollowTable.vue:54 +msgid "Deny access?" +msgstr "هل تؤكد رفض الوصول ؟" + +#: front/src/components/favorites/List.vue:34 +#: front/src/components/federation/LibraryTrackTable.vue:29 +#: front/src/components/library/Artists.vue:26 +#: src/components/library/Radios.vue:47 +#: front/src/components/manage/library/FilesTable.vue:20 +#: front/src/components/manage/library/RequestsTable.vue:20 +#: front/src/components/manage/users/UsersTable.vue:20 +#: front/src/views/federation/LibraryList.vue:29 +#: src/views/playlists/List.vue:28 +msgid "Descending" +msgstr "تنازليًا" + +#: front/src/components/federation/LibraryCard.vue:50 +msgid "Detail" +msgstr "التفاصيل" + +#: front/src/views/admin/users/UsersDetail.vue:146 +msgid "Determine if the user account is active or not. Inactive users cannot login or use the service." +msgstr "" + +#: front/src/components/auth/Settings.vue:104 +#: front/src/components/auth/SubsonicTokenForm.vue:52 +msgid "Disable access" +msgstr "تعطيل النفاذ" + +#: front/src/components/auth/SubsonicTokenForm.vue:49 +msgid "Disable Subsonic access" +msgstr "تعطيل النفاذ عبر صاب سونيك Subsonic" + +#: front/src/components/auth/SubsonicTokenForm.vue:50 +msgid "Disable Subsonic API access?" +msgstr "تعطيل النفاذ عبر واجهة برمجة التطبيقات صاب سونيك ؟" + +#: front/src/components/auth/SubsonicTokenForm.vue:14 +msgid "Discover how to use Funkwhale from other apps" +msgstr "إكتشف كيفية استخدام فانك وايل Funkwhale عبر التطبيقات الأخرى" + +#: front/src/components/library/radios/Builder.vue:26 +msgid "Display publicly" +msgstr "إعرضها للعامة" + +#: front/src/components/playlists/Editor.vue:42 +msgid "Do you want to clear the playlist \"%{ playlist }\"?" +msgstr "هل تودّ إفراغ قائمة المَقاطِع الموسيقية \"%{ playlist }\" ؟" + +#: front/src/components/common/DangerousButton.vue:7 +msgid "Do you want to confirm this action?" +msgstr "هل تؤكّد هذا الإجراء ؟" + +#: front/src/views/playlists/Detail.vue:35 +msgid "Do you want to delete the playlist \"%{ playlist }\"?" +msgstr "متأكّد مِن أنك تريد حذف قائمة المَقاطِع الموسيقية \"%{ playlist }\" ؟" + +#: front/src/views/radios/Detail.vue:26 +#, fuzzy +msgid "Do you want to delete the radio \"%{ radio }\"?" +msgstr "أتريد حقا حذف إذاعة \"{{ radio }}\" ؟" + +#: front/src/components/common/ActionTable.vue:29 +msgid "Do you want to launch %{ action } on %{ count } element?" +msgid_plural "Do you want to launch %{ action } on %{ count } elements?" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: front/src/components/Sidebar.vue:113 +msgid "Do you want to restore your previous queue?" +msgstr "هل تريد استرجاع قائمة الإنتظار السابقة للأغاني ؟" + +#: front/src/App.vue:38 +msgid "Documentation" +msgstr "الدليل" + +#: front/src/components/audio/track/Table.vue:24 +#: src/components/library/Track.vue:48 +msgid "Download" +msgstr "تنزيل" + +#: front/src/components/audio/track/Table.vue:27 +msgid "Download tracks" +msgstr "تنزيل" + +#: front/src/components/playlists/Editor.vue:49 +msgid "Drag and drop rows to reorder tracks in the playlist" +msgstr "" + +#: front/src/components/library/Track.vue:58 +#: front/src/components/manage/library/FilesTable.vue:43 +msgid "Duration" +msgstr "المدّة" + +#: front/src/components/Home.vue:96 +msgid "Easy to use" +msgstr "سهل للإستخدام" + +#: front/src/components/About.vue:21 +msgid "Edit instance info" +msgstr "تعديل معلومات مثيل الخادوم" + +#: front/src/components/radios/Card.vue:20 src/views/playlists/Detail.vue:30 +msgid "Edit..." +msgstr "تعديل …" + +#: front/src/components/auth/Signup.vue:29 +#: front/src/components/manage/users/UsersTable.vue:38 +msgid "Email" +msgstr "البريد الإلكتروني" + +#: front/src/views/admin/users/UsersDetail.vue:29 +msgid "Email address" +msgstr "عنوان البريد الإلكتروني" + +#: front/src/views/auth/EmailConfirm.vue:23 +msgid "Email confirmed" +msgstr "عنوان البريد الإلكتروني مؤكَّد" + +#: front/src/views/playlists/Detail.vue:29 +msgid "End edition" +msgstr "إنهاء التعديل" + +#: front/src/components/library/import/FileUpload.vue:4 +msgid "Ensure your music files are properly tagged before uploading them." +msgstr "تأكّد مِن احتواء ملفات الموسيقى على بيانات وصفية صحيحة قبل إرسالها." + +#: front/src/components/library/Radios.vue:140 +msgid "Enter a radio name..." +msgstr "أدخِل إسم إذاعة …" + +#: front/src/components/library/Artists.vue:118 +msgid "Enter an artist name..." +msgstr "أدخِل إسم فنان …" + +#: front/src/views/federation/LibraryList.vue:122 +msgid "Enter an library domain name..." +msgstr "أدخِل إسم نطاق لمكتبة ما …" + +#: front/src/views/playlists/List.vue:104 +msgid "Enter an playlist name..." +msgstr "أدخِل إسم قائمة مَقاطِعٍ موسيقية …" + +#: front/src/components/auth/Signup.vue:98 +msgid "Enter your email" +msgstr "أدخِل عنوان بريدك الإلكتروني" + +#: front/src/components/auth/Signup.vue:96 +msgid "Enter your invitation code (case insensitive)" +msgstr "أدخِل رمز الدعوة" + +#: front/src/components/metadata/Search.vue:114 +msgid "Enter your search query..." +msgstr "أدخِل طلب بحثِك …" + +#: front/src/components/auth/Signup.vue:97 +msgid "Enter your username" +msgstr "أدخِل إسم المستخدِم" + +#: front/src/components/auth/Login.vue:77 +msgid "Enter your username or email" +msgstr "أدخل إسم المستخدِم أو البريد الإلكتروني" + +#: front/src/components/auth/SubsonicTokenForm.vue:20 +msgid "Error" +msgstr "خطأ" + +#: front/src/views/admin/Settings.vue:87 +msgid "Error reporting" +msgstr "سِجِل الأخطاء" + +#: front/src/components/common/ActionTable.vue:75 +msgid "Error while applying action" +msgstr "حدث خطأ أثناء تطبيق الإجراء" + +#: front/src/views/auth/PasswordReset.vue:7 +msgid "Error while asking for a password reset" +msgstr "حدث خطأ أثناء إرسال طلب إعادة تعيين الكلمة السرية" + +#: front/src/views/auth/PasswordResetConfirm.vue:7 +msgid "Error while changing your password" +msgstr "حدث خطأ أثناء عملية تعديل الكلمة السرية" + +#: front/src/views/auth/EmailConfirm.vue:7 +msgid "Error while confirming your email" +msgstr "حدث خطأ أثناء تأكيد عنوان بريدك الإلكتروني" + +#: front/src/components/manage/users/InvitationForm.vue:4 +msgid "Error while creating invitation" +msgstr "حدث خطأ أثناء إنشاء الدعوة" + +#: front/src/components/admin/SettingsGroup.vue:5 +msgid "Error while saving settings" +msgstr "حدث خطأ أثناء حفظ الإعدادات" + +#: front/src/components/federation/LibraryForm.vue:10 +msgid "Error while scanning library" +msgstr "حدث خطأ أثناء عملية مسح المكتبة" + +#: front/src/components/library/import/BatchDetail.vue:41 +#: front/src/components/library/import/BatchDetail.vue:70 +#: front/src/components/library/import/BatchList.vue:15 +msgid "Errored" +msgstr "فيه خطأ" + +#: front/src/components/playlists/Form.vue:89 +msgid "Everyone" +msgstr "الجميع" + +#: front/src/components/playlists/Form.vue:85 +msgid "Everyone on this instance" +msgstr "كل مَن هم على مثيل الخادوم هذا" + +#: front/src/components/library/radios/Builder.vue:57 +msgid "Exclude" +msgstr "إستثني" + +#: front/src/components/discussion/Comment.vue:14 +msgid "Expand" +msgstr "توسيع" + +#: front/src/components/manage/users/InvitationsTable.vue:41 +msgid "Expiration date" +msgstr "تاريخ نهاية الصلاحية" + +#: front/src/components/manage/users/InvitationsTable.vue:50 +msgid "Expired" +msgstr "منتهية الصلاحيّة" + +#: front/src/components/manage/users/InvitationsTable.vue:21 +msgid "Expired/used" +msgstr "إنتهت صلاحيتها/ أو مستعمَلة" + +#: front/src/components/library/import/Main.vue:65 +msgid "External source. Supported backends" +msgstr "مصدر خارجي. الخدمات المدعومة" + +#: front/src/components/Sidebar.vue:51 +msgid "Favorites" +msgstr "المفضلة" + +#: front/src/components/federation/LibraryForm.vue:3 +msgid "Federate with a new instance" +msgstr "إتّحد مع مثيل خادوم جديد" + +#: front/src/views/federation/LibraryTrackList.vue:21 +msgid "Federated tracks" +msgstr "المَقاطع الموسيقية المتحدة" + +#: front/src/components/Sidebar.vue:87 +#: src/components/library/import/BatchList.vue:25 +#: front/src/components/manage/users/UsersTable.vue:180 +#: front/src/views/admin/Settings.vue:84 +#: src/views/admin/users/UsersDetail.vue:161 +#: front/src/views/federation/Base.vue:35 +#: src/views/federation/LibraryDetail.vue:40 +msgid "Federation" +msgstr "الفديرالية" + +#: front/src/views/federation/LibraryDetail.vue:3 +msgid "File mirroring" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:43 +msgid "File name" +msgstr "إسم الملفّ" + +#: front/src/components/library/import/Main.vue:76 +msgid "File upload" +msgstr "إرسال ملفّ" + +#: front/src/views/admin/library/Base.vue:5 +#: src/views/admin/library/FilesList.vue:21 +msgid "Files" +msgstr "الملفّات" + +#: front/src/components/library/import/ArtistImport.vue:7 +msgid "Filter album types" +msgstr "تصفية نوع الألبومات" + +#: front/src/components/library/radios/Builder.vue:56 +msgid "Filter name" +msgstr "إسم عامل التصفية" + +#: front/src/components/library/import/Main.vue:52 +msgid "Finish import" +msgstr "إنهاء الإستيراد" + +#: front/src/components/library/import/BatchDetail.vue:54 +msgid "Finished" +msgstr "إكتمل" + +#: front/src/components/library/import/Main.vue:59 +msgid "First, choose where you want to import the music from" +msgstr "أولًا قم باختيار أسلوب استيراد و جلب الموسيقى" + +#: front/src/components/federation/LibraryCard.vue:44 +msgid "Follow" +msgstr "إتبع" + +#: front/src/components/federation/LibraryCard.vue:36 +msgid "Follow request pending approval" +msgstr "طلبات متابعة مُعلّقة" + +#: front/src/views/federation/LibraryDetail.vue:21 +msgid "Follow status" +msgstr "حالة الإشتراك" + +#: front/src/views/federation/Base.vue:13 +#: front/src/views/federation/LibraryFollowersList.vue:24 +msgid "Followers" +msgstr "المتابِعون" + +#: front/src/components/federation/LibraryCard.vue:18 +msgid "Followers only" +msgstr "المتابِعون فقط" + +#: front/src/components/federation/LibraryCard.vue:15 +#: front/src/views/federation/LibraryDetail.vue:29 +msgid "Following" +msgstr "يُتابِع" + +#: front/src/components/activity/Like.vue:12 +#: src/components/activity/Listen.vue:12 +msgid "from %{ album } by %{ artist }" +msgstr "مِن %{ album } لِـ %{ artist }" + +#: front/src/components/library/Track.vue:13 +msgid "From album %{ album } by %{ artist }" +msgstr "مِن ألبوم %{ album } لِـ %{ artist }" + +#: front/src/App.vue:56 +msgid "Funkwhale is a free and open-source project run by volunteers. You can help us improve the platform by reporting bugs, suggesting features and share the project with your friends!" +msgstr "فانك وايل Funkwhale مشروع حُر و مفتوح المصدر يديره متطوعون. يمكنك مساعدتنا على تحسين المنصة عن طريق الإبلاغ عن أخطاء، و اقتراح ميزات بما في ذلك مشاركة المشروع مع أصدقائك !" + +#: front/src/components/auth/SubsonicTokenForm.vue:7 +msgid "Funkwhale is compatible with other music players that support the Subsonic API." +msgstr "فانك وايل Funkwhale متوافق مع برمجيات تشغيل الموسيقى التي تدعم واجهة برمجية تطبيقات صاب سونيك." + +#: front/src/components/Home.vue:98 +msgid "Funkwhale is dead simple to use." +msgstr "فانك وايل Funkwhale سهلٌ جدًا للإستخدام." + +#: front/src/components/Home.vue:39 +msgid "Funkwhale is designed to make it easy to listen to music you like, or to discover new artists." +msgstr "طُوِّر فانك وايل Funkwhale لتسهيل الإستماع إلى الموسيقى التي تحبونها و لاكتشاف فنّانين جُدد." + +#: front/src/components/Home.vue:119 +msgid "Funkwhale is free and gives you control on your music." +msgstr "فانك وايل Funkwhale مجاني و يُعيد التحكّم في موسيقاكم بين أيديكم." + +#: front/src/components/Home.vue:66 +msgid "Funkwhale takes care of handling your music" +msgstr "فانك وايل Funkwhale يُحافظ على موسيقاكم" + +#: front/src/components/manage/users/InvitationForm.vue:16 +msgid "Get a new invitation" +msgstr "تحصّل على دعوة جديدة" + +#: front/src/components/Home.vue:13 +msgid "Get me to the library" +msgstr "أنقلني إلى المكتبة" + +#: front/src/components/Home.vue:77 +msgid "" +"Get quality metadata about your music thanks to\n" +" \n" +" MusicBrainz\n" +" " +msgstr "" +"أحصلوا على بيانات وصفية ذات جودة بفضل\n" +" \n" +" MusicBrainz\n" +" " + +#: front/src/components/common/ActionTable.vue:21 +#: front/src/components/common/ActionTable.vue:27 +msgid "Go" +msgstr "هيا" + +#: front/src/components/PageNotFound.vue:14 +msgid "Go to home page" +msgstr "إنتقل إلى الصفحة الرئيسية" + +#: front/src/components/library/import/Main.vue:13 +msgid "Grab corresponding metadata" +msgstr "جلب البيانات الوصفية ذات الصّلة" + +#: front/src/App.vue:74 +msgid "Help us translate Funkwhale" +msgstr "" + +#: front/src/components/library/Home.vue:65 +msgid "Home" +msgstr "الرئيسية" + +#: front/src/components/instance/Stats.vue:36 +msgid "Hours of music" +msgstr "ساعات مِن الموسيقى" + +#: front/src/components/auth/SubsonicTokenForm.vue:11 +msgid "However, accessing Funkwhale from those clients require a separate password you can set below." +msgstr "" + +#: front/src/components/library/import/BatchList.vue:34 +msgid "ID" +msgstr "المعرّف" + +#: front/src/views/auth/PasswordResetConfirm.vue:24 +msgid "If the email address provided in the previous step is valid and binded to a user account, you should receive an email with reset instructions in the next couple of minutes." +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:196 +#: front/src/components/library/Library.vue:17 +msgid "Import" +msgstr "استيراد" + +#: front/src/components/federation/LibraryTrackTable.vue:57 +msgid "Import #%{ id } launched" +msgstr "إنطلَقت عملية الإستيراد #%{ id }" + +#: front/src/components/library/import/Main.vue:38 +msgid "Import %{ count } track" +msgid_plural "Import %{ count } tracks" +msgstr[0] "إستيراد %{ count } مَقطَع" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "إستيراد %{ count } مَقاطِع" +msgstr[4] "إستيراد %{ count } مَقاطِع" +msgstr[5] "إستيراد %{ count } مَقاطِع" + +#: front/src/components/library/import/BatchDetail.vue:10 +msgid "Import batch" +msgstr "إستيراد بالجملة" + +#: front/src/components/library/import/BatchDetail.vue:185 +msgid "Import Batch #%{ id }" +msgstr "" + +#: front/src/components/library/Library.vue:20 +msgid "Import batches" +msgstr "حُزم الإستيراد بالجملة" + +#: front/src/components/library/import/BatchList.vue:117 +msgid "Import Batches" +msgstr "" + +#: front/src/components/manage/library/FilesTable.vue:40 +#: front/src/components/manage/library/RequestsTable.vue:53 +msgid "Import date" +msgstr "تاريخ الإستيراد" + +#: front/src/components/library/import/FileUpload.vue:38 +msgid "Import detail page" +msgstr "إستيراد تفاصيل الصفحة" + +#: front/src/components/Sidebar.vue:81 +msgid "Import music" +msgstr "استيراد الموسيقى" + +#: front/src/components/library/import/Main.vue:267 +msgid "Import Music" +msgstr "استيراد الموسيقى" + +#: front/src/components/Home.vue:71 +msgid "Import music from various platforms, such as YouTube or SoundCloud" +msgstr "استيراد الموسيقى من منصات مختلفة، مثل يوتيوب أو ساوند كلاود" + +#: front/src/components/federation/LibraryTrackTable.vue:14 +#: front/src/components/federation/LibraryTrackTable.vue:66 +msgid "Import pending" +msgstr "الواردات المعلّقة" + +#: front/src/views/admin/library/Base.vue:9 +#: front/src/views/admin/library/RequestsList.vue:3 +#: front/src/views/admin/library/RequestsList.vue:21 +msgid "Import requests" +msgstr "طلبات الإستيراد" + +#: front/src/components/library/import/BatchList.vue:20 +#: front/src/components/library/import/Main.vue:6 +msgid "Import source" +msgstr "مصدر الإستيراد" + +#: front/src/components/federation/LibraryTrackTable.vue:9 +msgid "Import status" +msgstr "حالة الإستيراد" + +#: front/src/components/library/import/ReleaseImport.vue:14 +msgid "Import this release" +msgstr "أجلب هذا الألبوم" + +#: front/src/components/library/import/TrackImport.vue:11 +msgid "Import this track" +msgstr "استورد هذا المَقطع" + +#: front/src/components/federation/LibraryTrackTable.vue:12 +#: front/src/components/manage/library/RequestsTable.vue:29 +#: front/src/components/manage/library/RequestsTable.vue:61 +msgid "Imported" +msgstr "تم استيراده" + +#: front/src/components/library/import/TrackImport.vue:44 +msgid "Imported URL" +msgstr "تم استيراد عنوان الرابط" + +#: front/src/views/admin/Settings.vue:82 +msgid "Imports" +msgstr "" + +#: front/src/components/favorites/TrackFavoriteIcon.vue:3 +msgid "In favorites" +msgstr "في المفضلة" + +#: front/src/components/federation/LibraryTrackTable.vue:65 +msgid "In library" +msgstr "على المكتبة" + +#: front/src/components/manage/users/UsersTable.vue:54 +msgid "Inactive" +msgstr "غير ناشط" + +#: front/src/components/library/import/Main.vue:96 +msgid "Input a MusicBrainz ID manually:" +msgstr "أدخِل يدويًا مُعرّف MusicBrainz ID :" + +#: front/src/views/auth/PasswordReset.vue:53 +msgid "Input the email address binded to your account" +msgstr "أدخِل عنوان البريد الإلكتروني المتّصل بحسابك" + +#: front/src/components/playlists/Editor.vue:31 +msgid "Insert from queue (%{ count } track)" +msgid_plural "Insert from queue (%{ count } tracks)" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: front/src/views/admin/Settings.vue:80 +msgid "Instance information" +msgstr "معلومات عن مثيل الخادوم" + +#: front/src/components/library/Radios.vue:9 +#, fuzzy +msgid "Instance radios" +msgstr "معلومات عن مثيل الخادوم" + +#: front/src/views/admin/Settings.vue:75 +msgid "Instance settings" +msgstr "إعدادات مثيل الخادوم" + +#: front/src/views/instance/Timeline.vue:57 +msgid "Instance Timeline" +msgstr "الخيط الزمني لمثيل الخادوم" + +#: front/src/components/auth/Signup.vue:42 +#: front/src/components/manage/users/InvitationForm.vue:11 +msgid "Invitation code" +msgstr "رمز الدعوة" + +#: front/src/components/auth/Signup.vue:43 +msgid "Invitation code (optional)" +msgstr "رمز الدعوة (اختياري)" + +#: front/src/views/admin/users/Base.vue:8 +#: src/views/admin/users/InvitationsList.vue:3 +#: front/src/views/admin/users/InvitationsList.vue:24 +msgid "Invitations" +msgstr "الدعوات" + +#: front/src/App.vue:43 +msgid "Issue tracker" +msgstr "متعقّب المشاكل" + +#: front/src/components/library/import/BatchDetail.vue:80 +msgid "Job ID" +msgstr "مُعرّف الإجراء" + +#: front/src/components/library/import/BatchList.vue:36 +msgid "Jobs" +msgstr "الإجراءات" + +#: front/src/components/Home.vue:50 +msgid "Keep a track of your favorite songs" +msgstr "حافظوا على أثر موسيقاكم و أغانيكم المفضّلة" + +#: front/src/components/audio/track/Table.vue:33 +msgid "Keep your PRIVATE_TOKEN secret as it gives access to your account." +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:41 +#: front/src/views/admin/users/UsersDetail.vue:45 +msgid "Last activity" +msgstr "آخر نشاط" + +#: front/src/views/federation/LibraryDetail.vue:101 +msgid "Last fetched" +msgstr "آخِر عملية جلب" + +#: front/src/components/playlists/PlaylistModal.vue:32 +msgid "Last modification" +msgstr "آخر تعديل" + +#: front/src/components/common/ActionTable.vue:39 +msgid "Launch" +msgstr "إبدأ" + +#: front/src/components/library/import/BatchDetail.vue:18 +#: front/src/components/library/import/BatchList.vue:35 +msgid "Launch date" +msgstr "تاريخ الإطلاق" + +#: front/src/components/federation/LibraryForm.vue:31 +msgid "Launch scan" +msgstr "إبدأ المسح" + +#: front/src/components/Home.vue:10 +msgid "Learn more about this instance" +msgstr "إعرف المزيد عن مثيل الخادوم هذا" + +#: front/src/components/manage/users/InvitationForm.vue:58 +msgid "Leave empty for a random code" +msgstr "أتركه فارغًا للحصول على رمز عشوائي" + +#: front/src/components/requests/Form.vue:10 +msgid "Leave this field empty if you're requesting the whole discography." +msgstr "دع هذا الحقل فارغا إن كنت ترغب في كافة الألبومات." + +#: front/src/views/federation/Base.vue:5 +#: src/views/federation/LibraryList.vue:123 +msgid "Libraries" +msgstr "المكتبات" + +#: front/src/components/Sidebar.vue:70 +#: front/src/components/federation/LibraryTrackTable.vue:51 +#: front/src/components/instance/Stats.vue:30 +#: front/src/components/manage/users/UsersTable.vue:176 +#: front/src/views/admin/users/UsersDetail.vue:157 +#: front/src/views/federation/LibraryDetail.vue:194 +msgid "Library" +msgstr "المكتبة" + +#: front/src/views/admin/library/FilesList.vue:3 +msgid "Library files" +msgstr "ملفّات المكتبة" + +#: front/src/components/federation/LibraryForm.vue:20 +msgid "Library name" +msgstr "إسم المكتبة" + +#: front/src/views/federation/LibraryDetail.vue:84 +msgid "Library size" +msgstr "حجم المكتبة" + +#: front/src/components/federation/LibraryForm.vue:96 +msgid "library@demo.funkwhale.audio" +msgstr "library@demo.funkwhale.audio" + +#: front/src/App.vue:29 +msgid "Links" +msgstr "الروابط" + +#: front/src/views/instance/Timeline.vue:4 +msgid "Loading timeline..." +msgstr "عملية تحميل الخيط الزمني جارية …" + +#: front/src/components/favorites/List.vue:5 +msgid "Loading your favorites..." +msgstr "جارٍ تحميل مفضلاتك …" + +#: front/src/components/auth/Login.vue:78 +msgid "Log In" +msgstr "الدخول" + +#: front/src/components/auth/Login.vue:4 +msgid "Log in to your Funkwhale account" +msgstr "الدخول إلى حسابك على فانك وايل Funkwhale" + +#: front/src/components/auth/Logout.vue:20 +msgid "Log Out" +msgstr "الخروج" + +#: front/src/components/Sidebar.vue:38 +msgid "Logged in as %{ username }" +msgstr "مُتّصل كـ %{ username }" + +#: front/src/components/Sidebar.vue:44 src/components/auth/Login.vue:41 +msgid "Login" +msgstr "الدخول" + +#: front/src/components/Sidebar.vue:43 +msgid "Logout" +msgstr "خروج" + +#: front/src/components/audio/Player.vue:266 +msgid "Looping disabled. Click to switch to single-track looping." +msgstr "" + +#: front/src/components/audio/Player.vue:267 +msgid "Looping on a single track. Click to switch to whole queue looping." +msgstr "" + +#: front/src/components/audio/Player.vue:268 +msgid "Looping on whole queue. Click to disable looping." +msgstr "" + +#: front/src/components/library/Track.vue:94 +msgid "Lyrics" +msgstr "الكلمات" + +#: front/src/views/admin/library/Base.vue:25 +msgid "Manage library" +msgstr "إدارة المكتبة" + +#: front/src/components/playlists/PlaylistModal.vue:3 +msgid "Manage playlists" +msgstr "إدارة قوائم المَقاطِع الموسيقية" + +#: front/src/views/admin/users/Base.vue:20 +msgid "Manage users" +msgstr "إدارة المستخدِمين" + +#: front/src/views/playlists/List.vue:8 +msgid "Manage your playlists" +msgstr "إدارة القوائم الخاصة الموسيقى" + +#: front/src/components/manage/library/RequestsTable.vue:197 +msgid "Mark as closed" +msgstr "" + +#: front/src/components/manage/library/RequestsTable.vue:196 +msgid "Mark as imported" +msgstr "" + +#: front/src/components/library/import/Main.vue:12 +msgid "Metadata" +msgstr "البيانات الوصفية" + +#: front/src/components/library/import/Main.vue:115 +msgid "" +"Metadata is the data related to the music you want to import. This includes all the information about the artists, albums and tracks. In order to have a high quality library, it is recommended to grab data from the\n" +" \n" +" MusicBrainz\n" +" \n" +" project, which you can think about as the Wikipedia of music." +msgstr "" + +#: front/src/components/Sidebar.vue:48 +#: src/components/library/import/Main.vue:18 +msgid "Music" +msgstr "الموسيقى" + +#: front/src/components/library/import/Main.vue:147 +msgid "Music request" +msgstr "طلب موسيقى" + +#: front/src/components/audio/Player.vue:265 +msgid "Mute" +msgstr "كتم" + +#: front/src/components/Sidebar.vue:34 +msgid "My account" +msgstr "حسابي" + +#: front/src/components/playlists/Form.vue:74 +msgid "My awesome playlist" +msgstr "قائمتي الرائعة للمَقاطِع الموسيقية" + +#: front/src/components/library/radios/Builder.vue:227 +msgid "My awesome radio" +msgstr "إذاعتي الرائعة" + +#: front/src/components/library/Track.vue:64 +#: src/components/library/Track.vue:75 +#: front/src/components/library/Track.vue:86 +#: front/src/components/manage/library/FilesTable.vue:63 +#: front/src/components/manage/library/FilesTable.vue:69 +#: front/src/components/manage/library/FilesTable.vue:75 +#: front/src/components/manage/library/FilesTable.vue:81 +#: front/src/components/manage/library/RequestsTable.vue:71 +#: front/src/components/manage/library/RequestsTable.vue:75 +#: front/src/components/manage/library/RequestsTable.vue:82 +#: front/src/components/manage/users/UsersTable.vue:61 +#: front/src/views/admin/users/UsersDetail.vue:49 +msgid "N/A" +msgstr "غير متوفر" + +#: front/src/components/playlists/PlaylistModal.vue:31 +#: front/src/views/admin/users/UsersDetail.vue:21 +msgid "Name" +msgstr "الإسم" + +#: front/src/components/auth/Settings.vue:88 +#: front/src/views/auth/PasswordResetConfirm.vue:14 +msgid "New password" +msgstr "الكلمة السرية الجديدة" + +#: front/src/components/Sidebar.vue:158 +msgid "New tracks will be appended here automatically." +msgstr "سوف يتم إضافة المَقاطِع الجديدة هنا آليًا." + +#: front/src/components/library/import/Main.vue:29 +msgid "Next step" +msgstr "الخطوة التالية" + +#: front/src/components/audio/Player.vue:263 +msgid "Next track" +msgstr "المَقطَع التالي" + +#: front/src/components/Sidebar.vue:125 +msgid "No" +msgstr "لا" + +#: front/src/components/Home.vue:103 +msgid "No add-ons, no plugins : you only need a web library" +msgstr "لا تحتاج إلى تنصيب إضافاتٍ أو مُلحَقاتٍ : كل ما تحتاج إليه هي مكتبة موسيقية على الويب" + +#: front/src/components/library/Track.vue:102 +msgid "No lyrics available for this track." +msgstr "لا تتوفّر هناك كلمات لهذا المَقطَع." + +#: front/src/components/playlists/Form.vue:81 +msgid "Nobody except me" +msgstr "لا أحد غيري" + +#: front/src/views/federation/LibraryDetail.vue:32 +msgid "Not following" +msgstr "غير مشترِك" + +#: front/src/components/federation/LibraryTrackTable.vue:13 +#: front/src/components/federation/LibraryTrackTable.vue:67 +msgid "Not imported" +msgstr "غير مُستورَد" + +#: front/src/components/manage/users/InvitationsTable.vue:51 +msgid "Not used" +msgstr "غير مستعمَل" + +#: front/src/App.vue:37 +msgid "Official website" +msgstr "موقع الويب الرسمي" + +#: front/src/components/auth/Settings.vue:83 +msgid "Old password" +msgstr "الكلمة السرية الجديدة" + +#: front/src/components/library/import/FileUpload.vue:36 +msgid "Once all your files are uploaded, simply click the following button to check the import status." +msgstr "" + +#: front/src/components/federation/LibraryCard.vue:21 +#: front/src/components/manage/users/InvitationsTable.vue:20 +msgid "Open" +msgstr "مفتوح" + +#: front/src/App.vue:63 +msgid "Options" +msgstr "الخيارات" + +#: front/src/components/library/import/Main.vue:93 +msgid "Or" +msgstr "أو" + +#: front/src/components/favorites/List.vue:23 +#: front/src/components/federation/LibraryTrackTable.vue:18 +#: front/src/components/library/Artists.vue:15 +#: src/components/library/Radios.vue:33 +#: front/src/components/manage/library/FilesTable.vue:9 +#: front/src/components/manage/library/RequestsTable.vue:9 +#: front/src/components/manage/users/InvitationsTable.vue:9 +#: front/src/components/manage/users/UsersTable.vue:9 +#: front/src/views/federation/LibraryList.vue:18 +#: src/views/playlists/List.vue:17 +msgid "Ordering" +msgstr "الترتيب" + +#: front/src/components/favorites/List.vue:31 +#: front/src/components/federation/LibraryTrackTable.vue:26 +#: front/src/components/library/Artists.vue:23 +#: src/components/library/Radios.vue:41 +#: front/src/components/manage/library/FilesTable.vue:17 +#: front/src/components/manage/library/RequestsTable.vue:17 +#: front/src/components/manage/users/UsersTable.vue:17 +#: front/src/views/federation/LibraryList.vue:26 +#: src/views/playlists/List.vue:25 +msgid "Ordering direction" +msgstr "اتجاه الترتيب" + +#: front/src/components/manage/users/InvitationsTable.vue:38 +msgid "Owner" +msgstr "المالك" + +#: front/src/components/PageNotFound.vue:33 +msgid "Page Not Found" +msgstr "الصفحة غير موجودة" + +#: front/src/components/PageNotFound.vue:7 +msgid "Page not found!" +msgstr "الصفحة غير موجودة !" + +#: front/src/components/auth/Login.vue:32 src/components/auth/Signup.vue:38 +msgid "Password" +msgstr "كلمة السر" + +#: front/src/components/auth/SubsonicTokenForm.vue:95 +msgid "Password updated" +msgstr "تم تحديث كلمة السر" + +#: front/src/views/auth/PasswordResetConfirm.vue:28 +msgid "Password updated successfully" +msgstr "تم تحديث كلمة السر بنجاح" + +#: front/src/components/audio/Player.vue:262 +msgid "Pause track" +msgstr "ألبِث المَقطَع" + +#: front/src/components/federation/LibraryFollowTable.vue:46 +#: front/src/components/library/import/BatchDetail.vue:33 +#: front/src/components/library/import/BatchDetail.vue:69 +#: front/src/components/library/import/BatchList.vue:14 +#: front/src/components/library/import/FileUpload.vue:59 +#: front/src/components/manage/library/RequestsTable.vue:27 +#: front/src/components/manage/library/RequestsTable.vue:63 +msgid "Pending" +msgstr "معلّق" + +#: front/src/components/federation/LibraryFollowTable.vue:11 +#: front/src/views/federation/LibraryDetail.vue:26 +msgid "Pending approval" +msgstr "في انتظار التسريح" + +#: front/src/components/Sidebar.vue:217 +msgid "Pending follow requests" +msgstr "طلبات المتابَعة المعلَّقة" + +#: front/src/components/Sidebar.vue:216 src/views/admin/library/Base.vue:26 +msgid "Pending import requests" +msgstr "طلبات الإستيراد المعلّقة" + +#: front/src/components/requests/Form.vue:26 src/views/federation/Base.vue:36 +msgid "Pending requests" +msgstr "الطلبات المعلَّقة" + +#: front/src/components/manage/users/UsersTable.vue:42 +#: front/src/views/admin/users/UsersDetail.vue:68 +msgid "Permissions" +msgstr "الصّلاحيّات" + +#: front/src/components/audio/PlayButton.vue:9 +#: src/components/library/Track.vue:30 +msgid "Play" +msgstr "غنّي" + +#: front/src/components/audio/album/Card.vue:50 +#: front/src/components/audio/artist/Card.vue:44 +#: src/components/library/Album.vue:28 front/src/views/playlists/Detail.vue:23 +msgid "Play all" +msgstr "تشغيل الكل" + +#: front/src/components/library/Artist.vue:26 +msgid "Play all albums" +msgstr "إعزف كافة الألبومات" + +#: front/src/components/audio/PlayButton.vue:58 +msgid "Play immediatly" +msgstr "إعزف في الحين" + +#: front/src/components/audio/PlayButton.vue:15 +msgid "Play next" +msgstr "إعزف التالي" + +#: front/src/components/audio/PlayButton.vue:16 +msgid "Play now" +msgstr "إعزف الآن" + +#: front/src/components/audio/Player.vue:261 +msgid "Play track" +msgstr "إعزف المَقطَع" + +#: front/src/views/playlists/Detail.vue:90 +msgid "Playlist" +msgstr "قائمة المَقاطِع" + +#: front/src/views/playlists/Detail.vue:12 +msgid "Playlist containing %{ count } track, by %{ username }" +msgid_plural "Playlist containing %{ count } tracks, by %{ username }" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: front/src/components/playlists/Form.vue:9 +msgid "Playlist created" +msgstr "تم إنشاء قائمة تشغيل الموسيقى" + +#: front/src/components/playlists/Editor.vue:4 +msgid "Playlist editor" +msgstr "محرّر قوائم تشغيل الموسيقى" + +#: front/src/components/playlists/Form.vue:21 +msgid "Playlist name" +msgstr "إسم قائمة المَقاطِع" + +#: front/src/components/playlists/Form.vue:6 +msgid "Playlist updated" +msgstr "تم تحديث قائمة تشغيل الموسيقى" + +#: front/src/components/playlists/Form.vue:25 +msgid "Playlist visibility" +msgstr "مدى رؤية القائمة" + +#: front/src/components/Sidebar.vue:56 src/components/library/Home.vue:16 +#: front/src/components/library/Library.vue:13 src/views/admin/Settings.vue:83 +#: front/src/views/playlists/List.vue:103 +msgid "Playlists" +msgstr "قوائم المَقاطِع" + +#: front/src/components/Home.vue:56 +msgid "Playlists? We got them" +msgstr "قوائم تشغيل الموسيقى ؟ متوفّرة لدينا" + +#: front/src/components/auth/Settings.vue:79 +msgid "Please double-check your password is correct" +msgstr "يرجى التأكّد مِن صحة الكلمة السرية" + +#: front/src/components/auth/Login.vue:9 +msgid "Please double-check your username/password couple is correct" +msgstr "الرجاء التأكّد مِن صحة اسم المستخدِم و الكلمة السرية" + +#: front/src/components/auth/Settings.vue:46 +msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px." +msgstr "" + +#: front/src/components/library/import/Main.vue:26 +msgid "Previous step" +msgstr "الخطوة السابقة" + +#: front/src/components/audio/Player.vue:260 +msgid "Previous track" +msgstr "المَقطَع السابق" + +#: front/src/views/auth/EmailConfirm.vue:26 +#: front/src/views/auth/PasswordResetConfirm.vue:31 +msgid "Proceed to login" +msgstr "المواصلة إلى صفحة تسجيل الدخول" + +#: front/src/components/federation/LibraryTrackTable.vue:50 +msgid "Published date" +msgstr "تاريخ النشر" + +#: front/src/components/library/import/ArtistImport.vue:17 +msgid "Query template" +msgstr "نموذج البحث" + +#: front/src/components/Sidebar.vue:20 +msgid "Queue" +msgstr "قائمة الإنتظار" + +#: front/src/components/audio/Player.vue:203 +msgid "Queue shuffled!" +msgstr "تم خلط قائمة الإنتظار !" + +#: front/src/views/radios/Detail.vue:80 +msgid "Radio" +msgstr "الإذاعة" + +#: front/src/components/library/radios/Builder.vue:226 +msgid "Radio Builder" +msgstr "مُنشِئ الإذاعات و الراديو" + +#: front/src/components/library/radios/Builder.vue:15 +#, fuzzy +msgid "Radio created" +msgstr "إسم الإذاعة" + +#: front/src/components/library/radios/Builder.vue:21 +msgid "Radio name" +msgstr "إسم الإذاعة" + +#: front/src/components/library/radios/Builder.vue:12 +#, fuzzy +msgid "Radio updated" +msgstr "إسم الإذاعة" + +#: front/src/components/library/Library.vue:10 +#: src/components/library/Radios.vue:141 +msgid "Radios" +msgstr "الإذاعات" + +#: front/src/views/instance/Timeline.vue:7 +msgid "Recent activity on this instance" +msgstr "أحدث الأنشطة على مثيل الخادوم هذا" + +#: front/src/components/library/Home.vue:24 +msgid "Recently added" +msgstr "" + +#: front/src/components/library/Home.vue:11 +#, fuzzy +msgid "Recently favorited" +msgstr "في المفضلة" + +#: front/src/components/library/Home.vue:6 +msgid "Recently listened" +msgstr "مَقاطِع أستُمِع إليها مؤخرا" + +#: front/src/components/library/import/BatchDetail.vue:81 +msgid "Recording MusicBrainz ID" +msgstr "مُعرّف التسجيل الصوتي على ميوزيك براينز MusicBrainz" + +#: front/src/views/admin/users/UsersDetail.vue:84 +#: front/src/views/federation/LibraryDetail.vue:122 +msgid "Refresh" +msgstr "إنعاش" + +#: front/src/components/federation/LibraryFollowTable.vue:42 +msgid "Refused" +msgstr "رفض" + +#: front/src/components/auth/Profile.vue:12 +msgid "Registered since %{ date }" +msgstr "مُسجّل منذ %{ date }" + +#: front/src/components/auth/Signup.vue:9 +msgid "Registration are closed on this instance, you will need an invitation code to signup." +msgstr "إنّ التسجيلات مُغلَقة حاليًا على هذا الخادوم، يلزمك رمز دعوة للتسجيل فيه." + +#: front/src/components/manage/users/UsersTable.vue:71 +msgid "regular user" +msgstr "مستخدِم عادي" + +#: front/src/components/library/radios/Filter.vue:59 +msgid "Remove" +msgstr "حذف" + +#: front/src/components/auth/Settings.vue:58 +#, fuzzy +msgid "Remove avatar" +msgstr "حذف" + +#: front/src/components/favorites/TrackFavoriteIcon.vue:19 +msgid "Remove from favorites" +msgstr "حذف مِن المفضلة" + +#: front/src/components/auth/SubsonicTokenForm.vue:34 +#: front/src/components/auth/SubsonicTokenForm.vue:37 +msgid "Request a new password" +msgstr "طلب كلمة سرية جديدة" + +#: front/src/components/auth/SubsonicTokenForm.vue:35 +msgid "Request a new Subsonic API password?" +msgstr "متأكد مِن أنك تريد إعادة طلب كلمة سرية جديدة لواجهة برمجة تطبيقات صاب سونيك API ؟" + +#: front/src/components/auth/SubsonicTokenForm.vue:43 +msgid "Request a password" +msgstr "طلب كلمة سرية" + +#: front/src/App.vue:35 +msgid "Request music" +msgstr "طلب موسيقى" + +#: front/src/views/library/MusicRequest.vue:4 +#: src/views/library/MusicRequest.vue:21 +msgid "Request some music" +msgstr "طلب بعض مِن الموسيقى" + +#: front/src/components/requests/Form.vue:20 +msgid "Request submitted!" +msgstr "تم إرسال الطلب !" + +#: front/src/components/library/import/BatchDetail.vue:49 +msgid "Rerun errored jobs" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:187 +msgid "Rerun job" +msgstr "" + +#: front/src/components/auth/Login.vue:34 src/views/auth/PasswordReset.vue:4 +#: front/src/views/auth/PasswordReset.vue:52 +msgid "Reset your password" +msgstr "إعادة تعيين كلمتك السرية" + +#: front/src/components/library/import/TrackImport.vue:31 +msgid "Result %{ current }/%{ total }" +msgstr "النتيجة %{ current }/%{ total }" + +#: front/src/components/favorites/List.vue:38 +#: src/components/library/Artists.vue:30 +#: front/src/components/library/Radios.vue:52 +#: src/views/federation/LibraryList.vue:33 +#: front/src/views/playlists/List.vue:32 +msgid "Results per page" +msgstr "عدد نتائج البحث في كل صفحة" + +#: front/src/components/admin/SettingsGroup.vue:63 +#: front/src/components/library/radios/Builder.vue:29 +msgid "Save" +msgstr "احفظ" + +#: front/src/views/federation/LibraryDetail.vue:112 +msgid "Scan triggered!" +msgstr "إنطَلَقَ المسح !" + +#: front/src/components/federation/LibraryTrackTable.vue:5 +#: front/src/components/library/Artists.vue:10 +#: src/components/library/Radios.vue:29 +#: front/src/components/library/import/BatchDetail.vue:62 +#: front/src/components/library/import/BatchList.vue:7 +#: front/src/components/manage/library/FilesTable.vue:5 +#: front/src/components/manage/library/RequestsTable.vue:5 +#: front/src/components/manage/users/InvitationsTable.vue:5 +#: front/src/components/manage/users/UsersTable.vue:5 +#: front/src/views/federation/LibraryList.vue:14 +#: src/views/playlists/List.vue:13 +msgid "Search" +msgstr "البحث" + +#: front/src/components/library/import/Main.vue:85 +msgid "Search an entity you want to import:" +msgstr "" + +#: front/src/components/manage/library/RequestsTable.vue:180 +msgid "Search by artist, username, comment..." +msgstr "البحث باستخدام إسم فنان أو مستخدِم أو تعليق …" + +#: front/src/components/library/import/BatchDetail.vue:188 +msgid "Search by source..." +msgstr "البحث حسب المصدر …" + +#: front/src/components/library/import/BatchList.vue:116 +msgid "Search by submitter, source..." +msgstr "البحث حسب المستخدِم أو المصدر …" + +#: front/src/components/federation/LibraryTrackTable.vue:182 +#: front/src/components/manage/library/FilesTable.vue:175 +msgid "Search by title, artist, domain..." +msgstr "البحث حسب العنوان أو إسم فنان أو نطاق …" + +#: front/src/components/federation/LibraryFollowTable.vue:140 +msgid "Search by username, domain..." +msgstr "البحث حسب إسم المستخدِم أو النطاق …" + +#: front/src/components/manage/users/InvitationsTable.vue:152 +msgid "Search by username, email, code..." +msgstr "البحث باسم مستخدِم أو عنوان بريد إلكتروني أو رمز …" + +#: front/src/components/manage/users/UsersTable.vue:162 +msgid "Search by username, email, name..." +msgstr "البحث باسم مستخدِم أو عنوان بريد إلكتروني أو إسم …" + +#: front/src/components/audio/SearchBar.vue:20 +msgid "Search for artists, albums, tracks..." +msgstr "البحث عن فنانين أو ألبومات أو مَقاطِع موسيقية …" + +#: front/src/components/audio/Search.vue:2 +msgid "Search for some music" +msgstr "البحث عن بعض مِن الموسيقى" + +#: front/src/components/library/Track.vue:105 +msgid "Search on lyrics.wikia.com" +msgstr "البحث في lyrics.wikia.com" + +#: front/src/components/library/Album.vue:33 +#: src/components/library/Artist.vue:31 +#: front/src/components/library/Track.vue:40 +msgid "Search on Wikipedia" +msgstr "البحث في ويكيبيديا" + +#: front/src/components/library/import/TrackImport.vue:42 +msgid "Search query" +msgstr "البحث" + +#: front/src/views/admin/Settings.vue:15 +msgid "Sections" +msgstr "الأقسام" + +#: front/src/components/library/radios/Builder.vue:41 +msgid "Select a filter" +msgstr "إختيار عامل تصفية" + +#: front/src/components/common/ActionTable.vue:61 +msgid "Select all %{ total } elements" +msgid_plural "Select all %{ total } elements" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: front/src/components/library/import/FileUpload.vue:22 +msgid "Select files to upload..." +msgstr "إختيار الملفات الجاهزة للإرسال …" + +#: front/src/components/common/ActionTable.vue:69 +msgid "Select only current page" +msgstr "تحديد الصفحة الحالية فقط" + +#: front/src/components/library/import/Main.vue:19 +msgid "Select relevant sources or files for import" +msgstr "إختيار المصادر أو الملفات الجاهزة للإستيراد" + +#: front/src/components/federation/LibraryCard.vue:43 +msgid "Send a follow request" +msgstr "إرسال طلب متابَعة" + +#: front/src/components/Sidebar.vue:97 +#: src/components/manage/users/UsersTable.vue:184 +#: front/src/views/admin/users/UsersDetail.vue:165 +msgid "Settings" +msgstr "الإعدادات" + +#: front/src/components/auth/Settings.vue:10 +msgid "Settings updated" +msgstr "تم تحديث الإعدادات" + +#: front/src/components/admin/SettingsGroup.vue:11 +msgid "Settings updated successfully." +msgstr "تم تحديث الإعدادات بنجاح." + +#: front/src/components/auth/Profile.vue:24 +msgid "Settings..." +msgstr "الإعدادات …" + +#: front/src/components/manage/users/InvitationForm.vue:27 +msgid "Share link" +msgstr "رابط المشاركة" + +#: front/src/components/audio/artist/Card.vue:30 +msgid "Show 1 more album" +msgid_plural "Show %{ count } more albums" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: front/src/components/audio/album/Card.vue:40 +msgid "Show 1 more track" +msgid_plural "Show %{ count } more tracks" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: front/src/components/forms/PasswordInput.vue:25 +msgid "Show/hide password" +msgstr "إظهار/إخفاء الكلمة السرية" + +#: front/src/components/federation/LibraryFollowTable.vue:97 +#: front/src/components/federation/LibraryTrackTable.vue:98 +#: front/src/components/library/import/BatchDetail.vue:128 +#: front/src/components/library/import/BatchList.vue:73 +#: front/src/components/manage/library/FilesTable.vue:97 +#: front/src/components/manage/library/RequestsTable.vue:104 +#: front/src/components/manage/users/InvitationsTable.vue:76 +#: front/src/components/manage/users/UsersTable.vue:87 +msgid "Showing results %{ start }-%{ end } on %{ total }" +msgstr "عرض النتائج %{ start }-%{ end } مِن %{ total }" + +#: front/src/components/audio/Player.vue:269 +msgid "Shuffle your queue" +msgstr "خلط قائمة الإنتظار" + +#: front/src/components/auth/Signup.vue:95 +msgid "Sign Up" +msgstr "التسجيل" + +#: front/src/components/manage/users/UsersTable.vue:40 +#: front/src/views/admin/users/UsersDetail.vue:37 +msgid "Sign-up" +msgstr "التسجيل" + +#: front/src/components/audio/track/Table.vue:31 +msgid "Simply copy paste the snippet below into a terminal to launch the download." +msgstr "" + +#: front/src/components/library/Track.vue:69 +#: front/src/components/library/import/FileUpload.vue:44 +#: front/src/components/manage/library/FilesTable.vue:44 +msgid "Size" +msgstr "الحجم" + +#: front/src/components/library/import/BatchDetail.vue:37 +#: front/src/components/library/import/BatchDetail.vue:72 +msgid "Skipped" +msgstr "تمّ تجاهله" + +#: front/src/components/requests/Form.vue:3 +msgid "Something's missing in the library? Let us know what you would like to listen!" +msgstr "هناك شيء ما ناقص في هذه المكتبة ؟ أبلغنا عما تريد الإستماع إليه !" + +#: front/src/components/audio/Search.vue:25 +msgid "Sorry, we did not found any album matching your query" +msgstr "المعذرة، لم نتمكّن مِن العثور على أي ألبوم يناسب طلب بحثك" + +#: front/src/components/audio/Search.vue:16 +msgid "Sorry, we did not found any artist matching your query" +msgstr "المعذرة، لم نتمكّن مِن العثور على أي فنان يناسب طلب بحثك" + +#: front/src/components/library/import/BatchDetail.vue:82 +#: front/src/components/library/import/BatchList.vue:38 +#: front/src/components/library/import/TrackImport.vue:17 +msgid "Source" +msgstr "المصدر" + +#: front/src/App.vue:41 +msgid "Source code" +msgstr "شفرة المصدر" + +#: front/src/App.vue:40 +msgid "Source code (%{version})" +msgstr "الشفرة المصدرية (%{version})" + +#: front/src/components/auth/Profile.vue:20 +#: front/src/components/manage/users/UsersTable.vue:70 +msgid "Staff member" +msgstr "عضو في الفريق" + +#: front/src/components/radios/Button.vue:4 +msgid "Start" +msgstr "إبدأ" + +#: front/src/components/library/import/FileUpload.vue:28 +msgid "Start Upload" +msgstr "إبدأ الإرسال" + +#: front/src/views/admin/Settings.vue:86 +msgid "Statistics" +msgstr "الإحصائيات" + +#: front/src/components/federation/LibraryFollowTable.vue:23 +#: front/src/components/federation/LibraryTrackTable.vue:46 +#: front/src/components/library/import/BatchDetail.vue:66 +#: front/src/components/library/import/BatchDetail.vue:83 +#: front/src/components/library/import/BatchList.vue:11 +#: front/src/components/library/import/BatchList.vue:37 +#: front/src/components/library/import/FileUpload.vue:45 +#: front/src/components/manage/library/RequestsTable.vue:24 +#: front/src/components/manage/library/RequestsTable.vue:48 +#: front/src/components/manage/users/InvitationsTable.vue:17 +#: front/src/components/manage/users/InvitationsTable.vue:39 +#: front/src/components/manage/users/UsersTable.vue:43 +msgid "Status" +msgstr "الحالة" + +#: front/src/components/radios/Button.vue:3 +msgid "Stop" +msgstr "إيقاف" + +#: front/src/components/Sidebar.vue:159 +msgid "Stop radio" +msgstr "إيقاف الإذاعة" + +#: front/src/components/library/import/FileUpload.vue:32 +msgid "Stop Upload" +msgstr "إيقاف الإرسال" + +#: front/src/App.vue:9 src/components/requests/Form.vue:17 +msgid "Submit" +msgstr "إرسال" + +#: front/src/components/requests/Form.vue:22 +msgid "Submit another request" +msgstr "إرسال طلب جديد آخَر" + +#: front/src/components/library/import/BatchDetail.vue:26 +#: front/src/components/library/import/BatchList.vue:39 +msgid "Submitted by" +msgstr "إقترَحه" + +#: front/src/views/admin/Settings.vue:85 +msgid "Subsonic" +msgstr "صاب سونيك" + +#: front/src/components/auth/SubsonicTokenForm.vue:2 +msgid "Subsonic API password" +msgstr "الكلمة السرية لواجهة برمجة التطبيقات صاب سونيك Subsonic" + +#: front/src/components/library/import/BatchDetail.vue:71 +#: front/src/components/library/import/BatchList.vue:16 +#: front/src/components/library/import/FileUpload.vue:56 +msgid "Success" +msgstr "نجح" + +#: front/src/App.vue:11 +msgid "Suggested choices" +msgstr "الخيارات المتاحة" + +#: front/src/components/playlists/Editor.vue:9 +msgid "Syncing changes to server..." +msgstr "مزامنة التغييرات مع الخادم …" + +#: front/src/components/Home.vue:26 +msgid "That's simple: we loved Grooveshark and we want to build something even better." +msgstr "حسنًا الأمر سهل : أحببنا غروف شارْك و أردنا تصميم مشروع أحسَن منه بكثير." + +#: front/src/components/requests/Form.vue:73 +msgid "The Beatles, Mickael Jackson…" +msgstr "The Beatles, Mickael Jackson…" + +#: front/src/App.vue:59 +msgid "The funkwhale logo was kindly designed and provided by Francis Gading." +msgstr "تم تصميم شعار فانك وايل funkwhale بفضل و كَرَم Francis Gading." + +#: front/src/components/Home.vue:124 +msgid "The plaform is free and open-source, you can install it and modify it without worries" +msgstr "المنصّة مجانية و مفتوحة المصدر، بإمكانكم تنصيبها و تعديلها كما يحلو لكم دون قيود" + +#: front/src/components/auth/SubsonicTokenForm.vue:4 +msgid "The Subsonic API is not available on this Funkwhale instance." +msgstr "" + +#: front/src/components/requests/Form.vue:74 +msgid "The White Album, Thriller…" +msgstr "The White Album, Thriller…" + +#: front/src/components/audio/track/Table.vue:30 +msgid "There is currently no way to download directly multiple tracks from funkwhale as a ZIP archive. However, you can use a command line tools such as cURL to easily download a list of tracks." +msgstr "" + +#: front/src/components/library/import/Main.vue:149 +msgid "This import will be associated with the music request below. After the import is finished, the request will be marked as fulfilled." +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:195 +msgid "This indicate if the remote library granted you access" +msgstr "" + +#: front/src/components/auth/Profile.vue:16 +msgid "This is you!" +msgstr "هذا أنت !" + +#: front/src/components/common/ActionTable.vue:37 +msgid "This may affect a lot of elements, please double check this is really what you want." +msgstr "" + +#: front/src/components/audio/PlayButton.vue:61 +msgid "This track is not imported and cannot be played" +msgstr "لم يتم استيراد هذا المَقطَع لذا لا يمكن الإستماع إليه" + +#: front/src/views/playlists/Detail.vue:37 +msgid "This will completely delete this playlist and cannot be undone." +msgstr "سوف يؤدي ذلك إلى الحذف الكُلّي لقائمة التشغيل هذه و لا يُمكن إلغاء العملية و العودة." + +#: front/src/views/radios/Detail.vue:27 +msgid "This will completely delete this radio and cannot be undone." +msgstr "سوف يؤدي ذلك إلى الحذف الكُلّي لهذه الإذاعة و لا يُمكن إلغاء العملية و العودة." + +#: front/src/components/auth/SubsonicTokenForm.vue:51 +msgid "This will completely disable access to the Subsonic API using from account." +msgstr "" + +#: front/src/App.vue:137 +msgid "This will erase your local data and disconnect you, do you want to continue?" +msgstr "ذلك سوف يؤدي إلى حذف بياناتك المحلية نهائيا و إخراجك. أمتأكد أنك ترغب في المواصلة ؟" + +#: front/src/components/auth/SubsonicTokenForm.vue:36 +msgid "This will log you out from existing devices that use the current password." +msgstr "" + +#: front/src/components/playlists/Editor.vue:44 +msgid "This will remove all tracks from this playlist and cannot be undone." +msgstr "" + +#: front/src/components/audio/track/Table.vue:6 +#: front/src/components/federation/LibraryTrackTable.vue:47 +#: front/src/components/manage/library/FilesTable.vue:37 +msgid "Title" +msgstr "العنوان" + +#: front/src/components/audio/SearchBar.vue:27 +#: src/components/library/Track.vue:174 +#: front/src/components/library/import/BatchDetail.vue:84 +#: front/src/components/metadata/Search.vue:138 +msgid "Track" +msgstr "المَقطَع" + +#: front/src/components/library/Track.vue:53 +msgid "Track information" +msgstr "معلومات عن المَقطَع" + +#: front/src/components/library/radios/Filter.vue:44 +msgid "Track matching filter" +msgstr "مقطع يناسب عامل التصفية" + +#: front/src/components/instance/Stats.vue:54 +msgid "tracks" +msgstr "مَقاطِع" + +#: front/src/components/library/Album.vue:43 +#: front/src/components/playlists/PlaylistModal.vue:33 +#: front/src/views/federation/Base.vue:8 src/views/playlists/Detail.vue:50 +#: front/src/views/radios/Detail.vue:34 +msgid "Tracks" +msgstr "المَقاطِع" + +#: front/src/views/federation/LibraryDetail.vue:125 +msgid "Tracks available in this library" +msgstr "المَقاطِع المتوفّرة في هذه المكتبة" + +#: front/src/components/library/Artist.vue:54 +#, fuzzy +msgid "Tracks by this artist" +msgstr "مِن ألبومات هذا الفنان" + +#: front/src/components/instance/Stats.vue:25 +msgid "Tracks favorited" +msgstr "مَقاطِع تم الإعجاب بها" + +#: front/src/components/instance/Stats.vue:19 +msgid "tracks listened" +msgstr "مَقاطِع أستُمِع إليها" + +#: front/src/views/federation/LibraryDetail.vue:109 +msgid "Trigger scan" +msgstr "" + +#: front/src/components/manage/library/FilesTable.vue:41 +msgid "Type" +msgstr "" + +#: front/src/components/About.vue:15 +msgid "Unfortunately, owners of this instance did not yet take the time to complete this page." +msgstr "لسوء الحظ، لم يأخذ أصحاب مثيل الخادوم هذا الوقت الكافي لاستكمال هذه الصفحة." + +#: front/src/views/federation/LibraryDetail.vue:95 +msgid "Unknown" +msgstr "مجهول" + +#: front/src/components/Home.vue:37 +msgid "Unlimited music" +msgstr "موسيقى بلا حدود" + +#: front/src/components/audio/Player.vue:264 +msgid "Unmute" +msgstr "إلغاء الكتم" + +#: front/src/components/auth/Settings.vue:50 +#, fuzzy +msgid "Update avatar" +msgstr "تحديث قائمة المَقاطِع الموسيقية" + +#: front/src/components/playlists/Form.vue:33 +msgid "Update playlist" +msgstr "تحديث قائمة المَقاطِع الموسيقية" + +#: front/src/components/auth/Settings.vue:27 +msgid "Update settings" +msgstr "تحديث الإعدادات" + +#: front/src/views/auth/PasswordResetConfirm.vue:21 +msgid "Update your password" +msgstr "قم بتحديث كلمتك السرية" + +#: front/src/components/manage/users/UsersTable.vue:172 +#: front/src/views/admin/users/UsersDetail.vue:153 +msgid "Upload" +msgstr "أرسل" + +#: front/src/components/auth/Settings.vue:45 +msgid "Upload a new avatar" +msgstr "" + +#: front/src/components/library/import/Main.vue:7 +msgid "Uploaded files or external source" +msgstr "ملفات مُرسَلة أو مصدر خارجي" + +#: front/src/components/library/import/FileUpload.vue:57 +msgid "Uploading..." +msgstr "عملية الإرسال جارية …" + +#: front/src/App.vue:45 +msgid "Use another instance" +msgstr "إستخدم مثيل خادوم آخَر" + +#: front/src/components/requests/Form.vue:75 +msgid "Use this comment box to add details to your request if needed" +msgstr "استخدم علبة التعليق هذه، إن دعت الحاجة، لإضافة تفاصيل طلبك" + +#: front/src/views/federation/LibraryDetail.vue:196 +msgid "Use this flag to enable/disable federation with this library" +msgstr "" + +#: front/src/views/auth/PasswordReset.vue:12 +msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password." +msgstr "استخدم هذه الإستمارة لطلب إعادة ضبط كلمة المرور. سنرسل بريدا الكترونيا إلى العنوان المعين مرفوقا بتعليمات لإعادة ضبط كلمتك السرية." + +#: front/src/components/federation/LibraryForm.vue:6 +msgid "Use this form to scan an instance and setup federation." +msgstr "" + +#: front/src/components/manage/users/InvitationsTable.vue:49 +msgid "Used" +msgstr "" + +#: front/src/components/manage/library/RequestsTable.vue:47 +msgid "User" +msgstr "المستخدِم" + +#: front/src/components/instance/Stats.vue:5 +msgid "User activity" +msgstr "نشاط المستخدِم" + +#: front/src/components/library/Radios.vue:20 +#, fuzzy +msgid "User radios" +msgstr "المستخدِمون" + +#: front/src/components/auth/Signup.vue:19 +#: front/src/components/manage/users/UsersTable.vue:37 +msgid "Username" +msgstr "إسم المستخدِم" + +#: front/src/components/auth/Login.vue:15 +msgid "Username or email" +msgstr "إسم المستخدِم أو عنوان البريد الإلكتروني" + +#: front/src/components/instance/Stats.vue:13 +msgid "users" +msgstr "مستخدِم" + +#: front/src/components/Sidebar.vue:103 src/views/admin/Settings.vue:81 +#: front/src/views/admin/users/Base.vue:5 src/views/admin/users/UsersList.vue:3 +#: front/src/views/admin/users/UsersList.vue:21 +msgid "Users" +msgstr "المستخدِمون" + +#: front/src/components/library/Album.vue:37 +#: src/components/library/Artist.vue:35 +#: front/src/components/library/Track.vue:44 +#: front/src/components/library/import/ArtistImport.vue:131 +#: front/src/components/metadata/ArtistCard.vue:49 +#: front/src/components/metadata/ReleaseCard.vue:53 +msgid "View on MusicBrainz" +msgstr "إطّلع عليه على ميوزيك براينز" + +#: front/src/components/playlists/PlaylistModal.vue:20 +msgid "We cannot add the track to a playlist" +msgstr "" + +#: front/src/components/playlists/Form.vue:14 +msgid "We cannot create the playlist" +msgstr "" + +#: front/src/components/auth/Signup.vue:13 +msgid "We cannot create your account" +msgstr "" + +#: front/src/components/auth/Login.vue:7 +msgid "We cannot log you in" +msgstr "" + +#: front/src/components/auth/Settings.vue:38 +#, fuzzy +msgid "We cannot save your avatar" +msgstr "تعذّر علينا حفظ إعداداتك" + +#: front/src/components/auth/Settings.vue:14 +msgid "We cannot save your settings" +msgstr "تعذّر علينا حفظ إعداداتك" + +#: front/src/components/Home.vue:130 +msgid "We do not track you or bother you with ads" +msgstr "لا نتعقّبك و لا نزعجك بالإعلانات" + +#: front/src/components/library/import/FileUpload.vue:5 +msgid "We recommend using Picard for that purpose." +msgstr "ننصحكم باستخدام برنامج Picard لهذا الغرض." + +#: front/src/components/Home.vue:7 +msgid "We think listening to music should be simple." +msgstr "نعتقد أنّ الاستماع إلى الموسيقى ينبغي أن يكون سهلًا." + +#: front/src/components/PageNotFound.vue:10 +msgid "We're sorry, the page you asked for does not exist:" +msgstr "" + +#: front/src/components/requests/Form.vue:21 +msgid "We've received your request, you'll get some groove soon ;)" +msgstr "" + +#: front/src/components/Home.vue:152 +msgid "Welcome" +msgstr "مرحبًا" + +#: front/src/components/Home.vue:5 +msgid "Welcome on Funkwhale" +msgstr "أهلا وسهلا بك على فانك وايل Funkwhale" + +#: front/src/components/library/import/Main.vue:114 +msgid "What is metadata?" +msgstr "ما المقصود بالبيانات الوصفية ؟" + +#: front/src/views/federation/LibraryDetail.vue:197 +msgid "When enabled, auto importing will automatically import new tracks published in this library" +msgstr "" + +#: front/src/components/Home.vue:24 +msgid "Why funkwhale?" +msgstr "لماذا فانك وايل Funkwhale ؟" + +#: front/src/components/Sidebar.vue:124 +msgid "Yes" +msgstr "نعم" + +#: front/src/components/auth/Logout.vue:8 +msgid "Yes, log me out!" +msgstr "" + +#: front/src/components/auth/Logout.vue:7 +msgid "You are currently logged in as %{ username }" +msgstr "" + +#: front/src/components/library/import/Main.vue:111 +msgid "You can also skip this step and enter metadata manually." +msgstr "" + +#: front/src/components/Home.vue:136 +msgid "You can invite friends and family to your instance so they can enjoy your music" +msgstr "يمكِنك دعوة أصدقائك و عائلتك للإنظمام إلى مثيل خادومك للإستمتاع بموسيقاك" + +#: front/src/components/library/radios/Builder.vue:7 +msgid "You can use this interface to build your own custom radio, which will play tracks according to your criteria." +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:8 +msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance." +msgstr "" + +#: front/src/components/Sidebar.vue:156 +msgid "You have a radio playing" +msgstr "" + +#: front/src/App.vue:6 +msgid "You need to select an instance in order to continue" +msgstr "يلزمك اختيار مثيل خادوم قصد المواصلة" + +#: front/src/components/auth/Settings.vue:100 +msgid "You will be logged out from this session and have to log in with the new one" +msgstr "" + +#: front/src/components/auth/Settings.vue:71 +msgid "You will have to update your password on your clients that use this password." +msgstr "" + +#: front/src/components/library/import/Main.vue:103 +msgid "You will import:" +msgstr "أنت بصدد استيراد :" + +#: front/src/views/auth/EmailConfirm.vue:24 +msgid "Your email address was confirmed, you can now use the service without limitations." +msgstr "تمّ تأكيد عنوان بريدك الإلكتروني، بإمكانك الآن استعمال الخدمة مِن دون قيود." + +#: front/src/components/favorites/List.vue:109 +msgid "Your Favorites" +msgstr "مفضّلاتك" + +#: front/src/components/Home.vue:117 +msgid "Your music, your way" +msgstr "موسيقاك، كما يحلو لك" + +#: front/src/views/auth/PasswordResetConfirm.vue:29 +msgid "Your password has been updated successfully." +msgstr "تم تحديث كلمتك السرية بنجاح." + +#: front/src/components/auth/Settings.vue:101 +msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password" +msgstr "" + +#: front/src/components/audio/PlayButton.vue:156 +msgid "%{ count } track was added to your queue" +msgid_plural "%{ count } tracks were added to your queue" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" diff --git a/front/locales/eo/LC_MESSAGES/app.po b/front/locales/eo/LC_MESSAGES/app.po new file mode 100644 index 000000000..d4fc38a86 --- /dev/null +++ b/front/locales/eo/LC_MESSAGES/app.po @@ -0,0 +1,2451 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the front package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: front 1.0.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-07-22 14:12+0200\n" +"PO-Revision-Date: 2018-07-22 15:50+0000\n" +"Last-Translator: Baptiste Gelez \n" +"Language-Team: none\n" +"Language: eo\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 2.20\n" + +#: front/src/components/playlists/PlaylistModal.vue:9 +msgid "\"%{ title }\", by %{ artist }" +msgstr "\"%{title}\" je %{artist}" + +#: front/src/components/Sidebar.vue:24 +msgid "(%{ index } of %{ length })" +msgstr "(%{index} da %{length})" + +#: front/src/components/Sidebar.vue:22 +msgid "(empty)" +msgstr "(malplena)" + +#: front/src/components/common/ActionTable.vue:43 +#: front/src/components/common/ActionTable.vue:51 +msgid "%{ count } on %{ total } selected" +msgid_plural "%{ count } on %{ total } selected" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/Sidebar.vue:116 +#: src/views/federation/LibraryDetail.vue:87 +msgid "%{ count } track" +msgid_plural "%{ count } tracks" +msgstr[0] "%{count} kanto" +msgstr[1] "%{count} kantoj" + +#: front/src/components/library/Artist.vue:13 +msgid "%{ count } track in %{ albumsCount } albums" +msgid_plural "%{ count } tracks in %{ albumsCount } albums" +msgstr[0] "%{count} kanto en %{albumsCount} albumo" +msgstr[1] "%{count} kantoj en %{albumsCount} albumoj" + +#: front/src/components/library/radios/Builder.vue:76 +msgid "%{ count } track matching combined filters" +msgid_plural "%{ count } tracks matching combined filters" +msgstr[0] "%{count} kanto kongruas kun la tutaj filtriloj" +msgstr[1] "%{count} kantoj kongruas kun la tutaj filtriloj" + +#: front/src/components/playlists/Card.vue:18 +msgid "%{ count} track" +msgid_plural "%{ count } tracks" +msgstr[0] "%{count} kanto" +msgstr[1] "%{count} kantoj" + +#: front/src/components/common/Duration.vue:2 +msgid "%{ hours } h %{ minutes } min" +msgstr "%{hours} h %{minutes} min" + +#: front/src/components/common/Duration.vue:5 +msgid "%{ minutes } min" +msgstr "%{minutes} min" + +#: front/src/components/activity/Like.vue:7 +msgid "%{ user } favorited a track" +msgstr "%{user} stelumis kanton" + +#: front/src/components/activity/Listen.vue:7 +msgid "%{ user } listened to a track" +msgstr "%{user} aŭskultis kanton" + +#: front/src/components/auth/Profile.vue:49 +msgid "%{ username }'s profile" +msgstr "Profilo de %{username}" + +#: front/src/components/audio/artist/Card.vue:41 +msgid "1 album" +msgid_plural "%{ count } albums" +msgstr[0] "Unu albumo" +msgstr[1] "%{count} albumoj" + +#: front/src/components/favorites/List.vue:10 +msgid "1 favorite" +msgid_plural "%{ count } favorites" +msgstr[0] "Unu stelumo" +msgstr[1] "%{count} stelumoj" + +#: front/src/components/audio/album/Card.vue:54 +#: front/src/components/federation/LibraryCard.vue:25 +msgid "1 track" +msgid_plural "%{ count } tracks" +msgstr[0] "Unu kanto" +msgstr[1] "%{count} kantoj" + +#: front/src/components/About.vue:5 +msgid "About %{ instance }" +msgstr "Pri %{instance}" + +#: front/src/App.vue:54 +msgid "About Funkwhale" +msgstr "Pri Funkwhale" + +#: front/src/App.vue:32 src/components/About.vue:8 src/components/About.vue:55 +msgid "About this instance" +msgstr "Pri tiu instanco" + +#: front/src/components/manage/library/RequestsTable.vue:28 +#: front/src/components/manage/library/RequestsTable.vue:62 +msgid "Accepted" +msgstr "akceptanta" + +#: front/src/components/auth/SubsonicTokenForm.vue:111 +msgid "Access disabled" +msgstr "Atingo malaktivigas" + +#: front/src/components/Home.vue:109 +msgid "Access your music from a clean interface that focus on what really matters" +msgstr "Atingas vian muzikon kun pura interfaco ke koncentras ĝin sur gravaĵo" + +#: front/src/views/admin/users/UsersDetail.vue:54 +msgid "Account active" +msgstr "Aktiva konto" + +#: front/src/components/auth/Settings.vue:5 +msgid "Account settings" +msgstr "Preferoj de via konto" + +#: front/src/components/auth/Settings.vue:257 +msgid "Account Settings" +msgstr "Preferoj de via konto" + +#: front/src/components/manage/users/UsersTable.vue:39 +msgid "Account status" +msgstr "Pozicio de via konto" + +#: front/src/views/auth/PasswordReset.vue:14 +msgid "Account's email" +msgstr "Retadreso de via konto" + +#: front/src/components/common/ActionTable.vue:82 +msgid "Action %{ action } was launched successfully on %{ count } element" +msgid_plural "Action %{ action } was launched successfully on %{ count } elements" +msgstr[0] "Ago %{action} sukcese komenciĝis por %{count} ero" +msgstr[1] "Ago %{action} sukcese komenciĝis por %{count} eroj" + +#: front/src/components/common/ActionTable.vue:8 +#: front/src/components/federation/LibraryFollowTable.vue:24 +#: front/src/components/library/radios/Builder.vue:60 +#: front/src/components/manage/library/RequestsTable.vue:54 +msgid "Actions" +msgstr "Agoj" + +#: front/src/components/manage/users/UsersTable.vue:53 +msgid "Active" +msgstr "Aktiva" + +#: front/src/components/Sidebar.vue:60 +msgid "Activity" +msgstr "Aktivo" + +#: front/src/components/federation/LibraryFollowTable.vue:21 +msgid "Actor" +msgstr "Aktoro" + +#: front/src/views/federation/LibraryList.vue:8 +msgid "Add a new library" +msgstr "Aldoni nova muzikejo" + +#: front/src/components/library/radios/Builder.vue:46 +msgid "Add filter" +msgstr "Aldoni filtrilo" + +#: front/src/components/library/radios/Builder.vue:36 +msgid "Add filters to customize your radio" +msgstr "Aldonu filtriloj por agordi vian radion" + +#: front/src/components/audio/PlayButton.vue:53 +msgid "Add to current queue" +msgstr "Aldoni al aktuala atendovico" + +#: front/src/components/favorites/TrackFavoriteIcon.vue:4 +#: front/src/components/favorites/TrackFavoriteIcon.vue:21 +msgid "Add to favorites" +msgstr "Aldoni al stelumoj" + +#: front/src/components/playlists/TrackPlaylistIcon.vue:6 +#: front/src/components/playlists/TrackPlaylistIcon.vue:32 +msgid "Add to playlist..." +msgstr "Aldoni al ludlisto…" + +#: front/src/components/audio/PlayButton.vue:14 +msgid "Add to queue" +msgstr "Aldoni al atendovico" + +#: front/src/components/playlists/PlaylistModal.vue:116 +msgid "Add to this playlist" +msgstr "Aldoni al tiu ludlisto" + +#: front/src/components/playlists/PlaylistModal.vue:54 +msgid "Add track" +msgstr "Aldoni kanton" + +#: front/src/components/manage/users/UsersTable.vue:69 +msgid "Admin" +msgstr "Administranto" + +#: front/src/components/Sidebar.vue:64 +msgid "Administration" +msgstr "Administrejo" + +#: front/src/components/audio/SearchBar.vue:26 +#: src/components/audio/track/Table.vue:8 +#: front/src/components/federation/LibraryTrackTable.vue:49 +#: front/src/components/library/Album.vue:91 +#: front/src/components/manage/library/FilesTable.vue:39 +#: front/src/components/metadata/Search.vue:134 +msgid "Album" +msgstr "Albumo" + +#: front/src/components/library/import/ReleaseImport.vue:3 +msgid "Album %{ title } (%{ count } track) by %{ artist }" +msgid_plural "Album %{ title } (%{ count } tracks) by %{ artist }" +msgstr[0] "Albumo %{title} (%{count} kanto) je %{artist}" +msgstr[1] "Albumo %{title} (%{count} kantoj) je %{artist}" + +#: front/src/components/library/Album.vue:12 +msgid "Album containing %{ count } track, by %{ artist }" +msgid_plural "Album containing %{ count } tracks, by %{ artist }" +msgstr[0] "Albumo kun %{count} kanto, je %{artist}" +msgstr[1] "Albumo kun %{count} kantoj, je %{artist}" + +#: front/src/components/library/Track.vue:20 +msgid "Album page" +msgstr "Albumpagô" + +#: front/src/components/audio/Search.vue:19 +#: src/components/instance/Stats.vue:48 +#: front/src/components/manage/library/RequestsTable.vue:50 +#: front/src/components/requests/Form.vue:9 +msgid "Albums" +msgstr "Albumoj" + +#: front/src/components/library/Artist.vue:44 +msgid "Albums by this artist" +msgstr "Albumoj je ĉi-tiu artisto" + +#: front/src/components/manage/library/RequestsTable.vue:26 +#: front/src/components/manage/users/InvitationsTable.vue:19 +msgid "All" +msgstr "Ĉia" + +#: front/src/components/playlists/Editor.vue:13 +msgid "An error occured while saving your changes" +msgstr "Eraro okazis kiam konservi viajn ŝanĝojn" + +#: front/src/components/auth/Login.vue:10 +msgid "An unknown error happend, this can mean the server is down or cannot be reached" +msgstr "Nekonata eraro okazis, povus signifi ke la servilo paneas aŭ ne estas atingebla" + +#: front/src/components/federation/LibraryTrackTable.vue:11 +#: front/src/components/library/import/BatchDetail.vue:68 +#: front/src/components/library/import/BatchList.vue:13 +#: front/src/components/library/import/BatchList.vue:22 +msgid "Any" +msgstr "Ajn" + +#: front/src/components/library/import/BatchList.vue:24 +msgid "API" +msgstr "API" + +#: front/src/components/federation/LibraryFollowTable.vue:68 +#: front/src/components/federation/LibraryFollowTable.vue:78 +msgid "Approve" +msgstr "Aprobi" + +#: front/src/components/federation/LibraryFollowTable.vue:70 +msgid "Approve access?" +msgstr "Aprobi atingo?" + +#: front/src/components/federation/LibraryFollowTable.vue:38 +msgid "Approved" +msgstr "Aprobanta" + +#: front/src/components/auth/Logout.vue:5 +msgid "Are you sure you want to log out?" +msgstr "Ĉu vi vere volas elsaluti?" + +#: front/src/components/audio/SearchBar.vue:25 +#: src/components/audio/track/Table.vue:7 +#: front/src/components/federation/LibraryTrackTable.vue:48 +#: front/src/components/library/Artist.vue:119 +#: front/src/components/manage/library/FilesTable.vue:38 +#: front/src/components/manage/library/RequestsTable.vue:49 +#: front/src/components/metadata/Search.vue:130 +msgid "Artist" +msgstr "Artisto" + +#: front/src/components/requests/Form.vue:5 +msgid "Artist name" +msgstr "Nomo de artisto" + +#: front/src/components/library/Album.vue:22 +#: src/components/library/Track.vue:23 +msgid "Artist page" +msgstr "Artistpaĝo" + +#: front/src/components/audio/Search.vue:65 +msgid "Artist, album, track..." +msgstr "Artisto, albumo, kanto…" + +#: front/src/components/audio/Search.vue:10 +#: src/components/instance/Stats.vue:42 +#: front/src/components/library/Artists.vue:119 +#: src/components/library/Library.vue:7 +msgid "Artists" +msgstr "Artistoj" + +#: front/src/components/favorites/List.vue:33 +#: front/src/components/federation/LibraryTrackTable.vue:28 +#: front/src/components/library/Artists.vue:25 +#: src/components/library/Radios.vue:44 +#: front/src/components/manage/library/FilesTable.vue:19 +#: front/src/components/manage/library/RequestsTable.vue:19 +#: front/src/components/manage/users/UsersTable.vue:19 +#: front/src/views/federation/LibraryList.vue:28 +#: src/views/playlists/List.vue:27 +msgid "Ascending" +msgstr "Foste" + +#: front/src/views/auth/PasswordReset.vue:27 +#, fuzzy +msgid "Ask for a password reset" +msgstr "Demandi pasvorto renuligado" + +#: front/src/views/federation/LibraryDetail.vue:56 +msgid "Auto importing" +msgstr "Aŭtomata importado" + +#: front/src/components/playlists/PlaylistModal.vue:26 +msgid "Available playlists" +msgstr "Disponeblaj ludlistoj" + +#: front/src/components/auth/Settings.vue:34 +msgid "Avatar" +msgstr "Avataro" + +#: front/src/views/auth/EmailConfirm.vue:17 src/views/auth/PasswordReset.vue:24 +#: front/src/views/auth/PasswordResetConfirm.vue:18 +msgid "Back to login" +msgstr "Reiri al ensalutpaĝo" + +#: front/src/views/federation/LibraryFollowersList.vue:5 +msgid "Be careful when accepting follow requests, as it means the follower will have access to your entire library." +msgstr "Zorgu kiam vi akceptas petoj da sekvado, ĉar ĝi signifas ke la sekvanto atingos vian tutan muzikejo." + +#: front/src/components/library/Track.vue:80 +#: front/src/components/manage/library/FilesTable.vue:42 +msgid "Bitrate" +msgstr "Bitrapido" + +#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4 +msgid "Browse" +msgstr "Folii" + +#: front/src/components/Sidebar.vue:50 +msgid "Browse library" +msgstr "Folii muzikejon" + +#: front/src/components/library/Artists.vue:4 +msgid "Browsing artists" +msgstr "Folii artistojn" + +#: front/src/views/federation/LibraryTrackList.vue:3 +msgid "Browsing federated tracks" +msgstr "Folii federantajn kantojn" + +#: front/src/views/federation/LibraryFollowersList.vue:3 +msgid "Browsing followers" +msgstr "Folii sekvadojn" + +#: front/src/views/federation/LibraryList.vue:3 +msgid "Browsing libraries" +msgstr "Folii muzikejojn" + +#: front/src/views/playlists/List.vue:3 +msgid "Browsing playlists" +msgstr "Folii ludlistojn" + +#: front/src/components/library/Radios.vue:4 +msgid "Browsing radios" +msgstr "Folii radiojn" + +#: front/src/components/library/radios/Builder.vue:5 +msgid "Builder" +msgstr "Konstruilo" + +#: front/src/components/audio/album/Card.vue:13 +msgid "By %{ artist }" +msgstr "Je %{artist}" + +#: front/src/components/federation/LibraryFollowTable.vue:57 +msgid "By confirming, %{ username } will be denied access to your library." +msgstr "Konfirmante, %{username} ne plu rajtos atingi vian muzikejo." + +#: front/src/components/federation/LibraryFollowTable.vue:73 +msgid "By confirming, %{ username } will be granted access to your library." +msgstr "Konfirmante, %{username} rajtos atingi vian muzikejo." + +#: front/src/components/audio/track/Table.vue:43 +#: front/src/components/common/DangerousButton.vue:17 +#: front/src/components/library/radios/Filter.vue:53 +#: front/src/components/playlists/PlaylistModal.vue:63 +msgid "Cancel" +msgstr "Nuligi" + +#: front/src/components/library/radios/Builder.vue:59 +msgid "Candidates" +msgstr "Kandidatoj" + +#: front/src/components/auth/Settings.vue:76 +msgid "Cannot change your password" +msgstr "Ne eblas ŝanĝi vian pasvorton" + +#: front/src/App.vue:66 +msgid "Change language" +msgstr "Ŝanĝi lingvon" + +#: front/src/components/auth/Settings.vue:67 +msgid "Change my password" +msgstr "Ŝanĝi mian pasvorton" + +#: front/src/components/auth/Settings.vue:95 +msgid "Change password" +msgstr "Ŝanĝi pasvorton" + +#: front/src/views/auth/PasswordResetConfirm.vue:4 +#: front/src/views/auth/PasswordResetConfirm.vue:62 +msgid "Change your password" +msgstr "Ŝanĝi vian pasvorton" + +#: front/src/components/auth/Settings.vue:96 +msgid "Change your password?" +msgstr "Ĉu vi volas ŝanĝi vian pasvorton?" + +#: front/src/components/playlists/Editor.vue:21 +msgid "Changes synced with server" +msgstr "Konservis ŝanĝoj" + +#: front/src/components/auth/Settings.vue:70 +msgid "Changing your password will also change your Subsonic API password if you have requested one." +msgstr "Ŝanĝi vian pasvorton ankaŭ ŝanĝos vian Subsonic API pasvorto se vi petis tiun." + +#: front/src/components/auth/Settings.vue:98 +msgid "Changing your password will have the following consequences" +msgstr "Ŝanĝi vian pasvorton tiel rezultigos" + +#: front/src/App.vue:4 +msgid "Choose your instance" +msgstr "Elekti vian instanco" + +#: front/src/components/Home.vue:64 +msgid "Clean library" +msgstr "Purigi muzikejon" + +#: front/src/components/manage/users/InvitationForm.vue:37 +msgid "Clear" +msgstr "Purigi" + +#: front/src/components/playlists/Editor.vue:40 +#: front/src/components/playlists/Editor.vue:45 +msgid "Clear playlist" +msgstr "Purigi ludliston" + +#: front/src/components/audio/Player.vue:270 +msgid "Clear your queue" +msgstr "Purigi vian atendovico" + +#: front/src/components/library/import/BatchList.vue:23 +msgid "CLI" +msgstr "Komandlinia interfaco" + +#: front/src/components/Home.vue:44 +msgid "Click once, listen for hours using built-in radios" +msgstr "Alklaki unu foje, aŭskulti enkonstruitajn radiojn dum horoj" + +#: front/src/components/manage/library/RequestsTable.vue:30 +#: front/src/components/manage/library/RequestsTable.vue:64 +msgid "Closed" +msgstr "Fermanta" + +#: front/src/components/manage/users/InvitationForm.vue:26 +#: front/src/components/manage/users/InvitationsTable.vue:42 +msgid "Code" +msgstr "Kodo" + +#: front/src/components/audio/album/Card.vue:43 +#: front/src/components/audio/artist/Card.vue:33 +#: front/src/components/discussion/Comment.vue:20 +msgid "Collapse" +msgstr "Malgrandigi" + +#: front/src/components/manage/library/RequestsTable.vue:51 +#: front/src/components/requests/Form.vue:14 +msgid "Comment" +msgstr "Komenti" + +#: front/src/components/library/radios/Builder.vue:58 +msgid "Config" +msgstr "Preferoj" + +#: front/src/components/common/DangerousButton.vue:21 +msgid "Confirm" +msgstr "Konfirmi" + +#: front/src/views/auth/EmailConfirm.vue:4 src/views/auth/EmailConfirm.vue:20 +#: front/src/views/auth/EmailConfirm.vue:51 +msgid "Confirm your email" +msgstr "Konfirmi vian retadreson" + +#: front/src/views/auth/EmailConfirm.vue:13 +msgid "Confirmation code" +msgstr "Konfirmada kodo" + +#: front/src/components/playlists/Editor.vue:163 +msgid "Copy tracks from current queue to playlist" +msgstr "Kopii kantojn el la aktuala atendovico en tiu ludlisto" + +#: front/src/components/Home.vue:88 +msgid "Covers, lyrics, our goal is to have them all ;)" +msgstr "Reludversioj, kantparoloj, nian celon estas havi ĉiujn ;)" + +#: front/src/components/auth/Signup.vue:4 +msgid "Create a funkwhale account" +msgstr "Krei Funkwhale konton" + +#: front/src/components/playlists/Form.vue:2 +msgid "Create a new playlist" +msgstr "Krei novan ludliston" + +#: front/src/components/auth/Login.vue:17 +msgid "Create an account" +msgstr "Krei konton" + +#: front/src/components/manage/library/RequestsTable.vue:88 +#: front/src/components/requests/Card.vue:25 +msgid "Create import" +msgstr "Krei importadon" + +#: front/src/components/auth/Signup.vue:51 +msgid "Create my account" +msgstr "Kreu mian konton" + +#: front/src/components/playlists/Form.vue:34 +msgid "Create playlist" +msgstr "Krei ludliston" + +#: front/src/components/library/Radios.vue:23 +msgid "Create your own radio" +msgstr "Krei vian propran radion" + +#: front/src/components/federation/LibraryFollowTable.vue:22 +#: front/src/components/manage/library/RequestsTable.vue:52 +#: front/src/components/manage/users/InvitationsTable.vue:40 +msgid "Creation date" +msgstr "Kreodato" + +#: front/src/components/auth/Settings.vue:54 +msgid "Current avatar" +msgstr "Aktuala avataro" + +#: front/src/components/playlists/PlaylistModal.vue:8 +msgid "Current track" +msgstr "Aktuala kanto" + +#: front/src/components/manage/library/FilesTable.vue:189 +#: front/src/components/manage/library/RequestsTable.vue:195 +#: front/src/components/manage/users/InvitationsTable.vue:166 +#: front/src/views/playlists/Detail.vue:33 +msgid "Delete" +msgstr "Forigi" + +#: front/src/views/playlists/Detail.vue:38 +msgid "Delete playlist" +msgstr "Forigi ludliston" + +#: front/src/views/radios/Detail.vue:28 +msgid "Delete radio" +msgstr "Forigi radion" + +#: front/src/components/federation/LibraryFollowTable.vue:52 +#: front/src/components/federation/LibraryFollowTable.vue:63 +msgid "Deny" +msgstr "Malrajtu" + +#: front/src/components/federation/LibraryFollowTable.vue:54 +msgid "Deny access?" +msgstr "Malrajti atingado?" + +#: front/src/components/favorites/List.vue:34 +#: front/src/components/federation/LibraryTrackTable.vue:29 +#: front/src/components/library/Artists.vue:26 +#: src/components/library/Radios.vue:47 +#: front/src/components/manage/library/FilesTable.vue:20 +#: front/src/components/manage/library/RequestsTable.vue:20 +#: front/src/components/manage/users/UsersTable.vue:20 +#: front/src/views/federation/LibraryList.vue:29 +#: src/views/playlists/List.vue:28 +msgid "Descending" +msgstr "Malfoste" + +#: front/src/components/federation/LibraryCard.vue:50 +msgid "Detail" +msgstr "Detalo" + +#: front/src/views/admin/users/UsersDetail.vue:146 +msgid "Determine if the user account is active or not. Inactive users cannot login or use the service." +msgstr "Elekti ĉu la konton aktivas aŭ ne. Malaktivaj konton ne eblas ensaluti aŭ uzi la servico." + +#: front/src/components/auth/Settings.vue:104 +#: front/src/components/auth/SubsonicTokenForm.vue:52 +msgid "Disable access" +msgstr "Malatingeblu" + +#: front/src/components/auth/SubsonicTokenForm.vue:49 +msgid "Disable Subsonic access" +msgstr "Malatingeblu Subsonic" + +#: front/src/components/auth/SubsonicTokenForm.vue:50 +msgid "Disable Subsonic API access?" +msgstr "Ĉu vi volas malatingeblu la Subsonic API?" + +#: front/src/components/auth/SubsonicTokenForm.vue:14 +msgid "Discover how to use Funkwhale from other apps" +msgstr "Malkovri kiel vi povas uzi Funkwhale el aliaj aplikaĵoj" + +#: front/src/components/library/radios/Builder.vue:26 +msgid "Display publicly" +msgstr "Publike montri" + +#: front/src/components/playlists/Editor.vue:42 +msgid "Do you want to clear the playlist \"%{ playlist }\"?" +msgstr "Ĉu vi volas purigi la \"%{playlist}\" ludliston?" + +#: front/src/components/common/DangerousButton.vue:7 +msgid "Do you want to confirm this action?" +msgstr "Ĉu vi volas konfirmi tiun akton?" + +#: front/src/views/playlists/Detail.vue:35 +msgid "Do you want to delete the playlist \"%{ playlist }\"?" +msgstr "Ĉu vi volas forigi la \"%{playlist}\" ludliston?" + +#: front/src/views/radios/Detail.vue:26 +#, fuzzy +msgid "Do you want to delete the radio \"%{ radio }\"?" +msgstr "Ĉu vi volas forigi la \"%{playlist}\" ludliston?" + +#: front/src/components/common/ActionTable.vue:29 +msgid "Do you want to launch %{ action } on %{ count } element?" +msgid_plural "Do you want to launch %{ action } on %{ count } elements?" +msgstr[0] "Ĉu vi volas komenci %{action} por %{count} ero?" +msgstr[1] "Ĉu vi volas komenci %{action} por %{count} eroj?" + +#: front/src/components/Sidebar.vue:113 +msgid "Do you want to restore your previous queue?" +msgstr "Ĉu vi volas reŝargi vian antaŭan atendovicon?" + +#: front/src/App.vue:38 +msgid "Documentation" +msgstr "Dokumentaro" + +#: front/src/components/audio/track/Table.vue:24 +#: src/components/library/Track.vue:48 +msgid "Download" +msgstr "Elŝuti" + +#: front/src/components/audio/track/Table.vue:27 +msgid "Download tracks" +msgstr "Elŝuti kantojn" + +#: front/src/components/playlists/Editor.vue:49 +msgid "Drag and drop rows to reorder tracks in the playlist" +msgstr "Treni kaj guti horizontaloj por reordigi kantojn en la ludlisto" + +#: front/src/components/library/Track.vue:58 +#: front/src/components/manage/library/FilesTable.vue:43 +msgid "Duration" +msgstr "Daŭro" + +#: front/src/components/Home.vue:96 +msgid "Easy to use" +msgstr "Facila uzo" + +#: front/src/components/About.vue:21 +msgid "Edit instance info" +msgstr "Redakti informoj de instanco" + +#: front/src/components/radios/Card.vue:20 src/views/playlists/Detail.vue:30 +msgid "Edit..." +msgstr "Redakti…" + +#: front/src/components/auth/Signup.vue:29 +#: front/src/components/manage/users/UsersTable.vue:38 +msgid "Email" +msgstr "Retmesaĝo" + +#: front/src/views/admin/users/UsersDetail.vue:29 +msgid "Email address" +msgstr "Retadreso" + +#: front/src/views/auth/EmailConfirm.vue:23 +msgid "Email confirmed" +msgstr "Konfirmis retadreso" + +#: front/src/views/playlists/Detail.vue:29 +msgid "End edition" +msgstr "Fini redakto" + +#: front/src/components/library/import/FileUpload.vue:4 +msgid "Ensure your music files are properly tagged before uploading them." +msgstr "" +"Zorgu ke viajn muzikdosierojn estas korekte etikedanta antaŭ alŝutis ilin." + +#: front/src/components/library/Radios.vue:140 +msgid "Enter a radio name..." +msgstr "Tajpu nomon de radio…" + +#: front/src/components/library/Artists.vue:118 +msgid "Enter an artist name..." +msgstr "Tajpu nomon de artisto…" + +#: front/src/views/federation/LibraryList.vue:122 +msgid "Enter an library domain name..." +msgstr "" + +#: front/src/views/playlists/List.vue:104 +msgid "Enter an playlist name..." +msgstr "" + +#: front/src/components/auth/Signup.vue:98 +msgid "Enter your email" +msgstr "Tajpu vian retadreson" + +#: front/src/components/auth/Signup.vue:96 +msgid "Enter your invitation code (case insensitive)" +msgstr "Tajpu vian invitkodon (usklecoblindan)" + +#: front/src/components/metadata/Search.vue:114 +msgid "Enter your search query..." +msgstr "Tajpu vian serĉon…" + +#: front/src/components/auth/Signup.vue:97 +msgid "Enter your username" +msgstr "Tajpu vian uzantnomon" + +#: front/src/components/auth/Login.vue:77 +msgid "Enter your username or email" +msgstr "Tajpu vian uzantnomon aŭ retadreson" + +#: front/src/components/auth/SubsonicTokenForm.vue:20 +msgid "Error" +msgstr "Eraro" + +#: front/src/views/admin/Settings.vue:87 +msgid "Error reporting" +msgstr "Eraroraportado" + +#: front/src/components/common/ActionTable.vue:75 +msgid "Error while applying action" +msgstr "Eraro kiam ruli akton" + +#: front/src/views/auth/PasswordReset.vue:7 +msgid "Error while asking for a password reset" +msgstr "Eraro kiam demandi renuligadon de pasvorto" + +#: front/src/views/auth/PasswordResetConfirm.vue:7 +msgid "Error while changing your password" +msgstr "Eraro kiam ŝanĝi vian pasvorton" + +#: front/src/views/auth/EmailConfirm.vue:7 +msgid "Error while confirming your email" +msgstr "Eraro kiam konfirmi vian retadreson" + +#: front/src/components/manage/users/InvitationForm.vue:4 +msgid "Error while creating invitation" +msgstr "Eraro kiam krei inviton" + +#: front/src/components/admin/SettingsGroup.vue:5 +msgid "Error while saving settings" +msgstr "Eraro kiam konservi preferojn" + +#: front/src/components/federation/LibraryForm.vue:10 +msgid "Error while scanning library" +msgstr "Eraro kiam skani muzikejon" + +#: front/src/components/library/import/BatchDetail.vue:41 +#: front/src/components/library/import/BatchDetail.vue:70 +#: front/src/components/library/import/BatchList.vue:15 +msgid "Errored" +msgstr "Eraris" + +#: front/src/components/playlists/Form.vue:89 +msgid "Everyone" +msgstr "Ĉiu" + +#: front/src/components/playlists/Form.vue:85 +msgid "Everyone on this instance" +msgstr "Ĉiu en ĉi-tiu instanco" + +#: front/src/components/library/radios/Builder.vue:57 +msgid "Exclude" +msgstr "Ekskluzivi" + +#: front/src/components/discussion/Comment.vue:14 +msgid "Expand" +msgstr "Grandigi" + +#: front/src/components/manage/users/InvitationsTable.vue:41 +msgid "Expiration date" +msgstr "Fortempiĝa dato" + +#: front/src/components/manage/users/InvitationsTable.vue:50 +msgid "Expired" +msgstr "Fortempiĝis" + +#: front/src/components/manage/users/InvitationsTable.vue:21 +msgid "Expired/used" +msgstr "Fortempiĝis aŭ uzantiĝis" + +#: front/src/components/library/import/Main.vue:65 +msgid "External source. Supported backends" +msgstr "Ekstera fonto. Kompateblaj servicoj" + +#: front/src/components/Sidebar.vue:51 +msgid "Favorites" +msgstr "Stelumoj" + +#: front/src/components/federation/LibraryForm.vue:3 +msgid "Federate with a new instance" +msgstr "Federi kun nova instanco" + +#: front/src/views/federation/LibraryTrackList.vue:21 +msgid "Federated tracks" +msgstr "Federataj kantoj" + +#: front/src/components/Sidebar.vue:87 +#: src/components/library/import/BatchList.vue:25 +#: front/src/components/manage/users/UsersTable.vue:180 +#: front/src/views/admin/Settings.vue:84 +#: src/views/admin/users/UsersDetail.vue:161 +#: front/src/views/federation/Base.vue:35 +#: src/views/federation/LibraryDetail.vue:40 +msgid "Federation" +msgstr "Federo" + +#: front/src/views/federation/LibraryDetail.vue:3 +msgid "File mirroring" +msgstr "Dosierospegulado" + +#: front/src/components/library/import/FileUpload.vue:43 +msgid "File name" +msgstr "Nomo de la dosiero" + +#: front/src/components/library/import/Main.vue:76 +msgid "File upload" +msgstr "Dosiero alŝutado" + +#: front/src/views/admin/library/Base.vue:5 +#: src/views/admin/library/FilesList.vue:21 +msgid "Files" +msgstr "Dosieroj" + +#: front/src/components/library/import/ArtistImport.vue:7 +msgid "Filter album types" +msgstr "Filtri albumtipoj" + +#: front/src/components/library/radios/Builder.vue:56 +msgid "Filter name" +msgstr "" + +#: front/src/components/library/import/Main.vue:52 +msgid "Finish import" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:54 +msgid "Finished" +msgstr "" + +#: front/src/components/library/import/Main.vue:59 +msgid "First, choose where you want to import the music from" +msgstr "" + +#: front/src/components/federation/LibraryCard.vue:44 +msgid "Follow" +msgstr "" + +#: front/src/components/federation/LibraryCard.vue:36 +msgid "Follow request pending approval" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:21 +msgid "Follow status" +msgstr "" + +#: front/src/views/federation/Base.vue:13 +#: front/src/views/federation/LibraryFollowersList.vue:24 +msgid "Followers" +msgstr "" + +#: front/src/components/federation/LibraryCard.vue:18 +msgid "Followers only" +msgstr "" + +#: front/src/components/federation/LibraryCard.vue:15 +#: front/src/views/federation/LibraryDetail.vue:29 +msgid "Following" +msgstr "" + +#: front/src/components/activity/Like.vue:12 +#: src/components/activity/Listen.vue:12 +msgid "from %{ album } by %{ artist }" +msgstr "" + +#: front/src/components/library/Track.vue:13 +msgid "From album %{ album } by %{ artist }" +msgstr "" + +#: front/src/App.vue:56 +msgid "Funkwhale is a free and open-source project run by volunteers. You can help us improve the platform by reporting bugs, suggesting features and share the project with your friends!" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:7 +msgid "Funkwhale is compatible with other music players that support the Subsonic API." +msgstr "" + +#: front/src/components/Home.vue:98 +msgid "Funkwhale is dead simple to use." +msgstr "" + +#: front/src/components/Home.vue:39 +msgid "Funkwhale is designed to make it easy to listen to music you like, or to discover new artists." +msgstr "" + +#: front/src/components/Home.vue:119 +msgid "Funkwhale is free and gives you control on your music." +msgstr "" + +#: front/src/components/Home.vue:66 +msgid "Funkwhale takes care of handling your music" +msgstr "" + +#: front/src/components/manage/users/InvitationForm.vue:16 +msgid "Get a new invitation" +msgstr "" + +#: front/src/components/Home.vue:13 +msgid "Get me to the library" +msgstr "" + +#: front/src/components/Home.vue:77 +msgid "" +"Get quality metadata about your music thanks to\n" +" \n" +" MusicBrainz\n" +" " +msgstr "" + +#: front/src/components/common/ActionTable.vue:21 +#: front/src/components/common/ActionTable.vue:27 +msgid "Go" +msgstr "" + +#: front/src/components/PageNotFound.vue:14 +msgid "Go to home page" +msgstr "" + +#: front/src/components/library/import/Main.vue:13 +msgid "Grab corresponding metadata" +msgstr "" + +#: front/src/App.vue:74 +msgid "Help us translate Funkwhale" +msgstr "" + +#: front/src/components/library/Home.vue:65 +msgid "Home" +msgstr "" + +#: front/src/components/instance/Stats.vue:36 +msgid "Hours of music" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:11 +msgid "However, accessing Funkwhale from those clients require a separate password you can set below." +msgstr "" + +#: front/src/components/library/import/BatchList.vue:34 +msgid "ID" +msgstr "" + +#: front/src/views/auth/PasswordResetConfirm.vue:24 +msgid "If the email address provided in the previous step is valid and binded to a user account, you should receive an email with reset instructions in the next couple of minutes." +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:196 +#: front/src/components/library/Library.vue:17 +msgid "Import" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:57 +msgid "Import #%{ id } launched" +msgstr "" + +#: front/src/components/library/import/Main.vue:38 +msgid "Import %{ count } track" +msgid_plural "Import %{ count } tracks" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/library/import/BatchDetail.vue:10 +msgid "Import batch" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:185 +msgid "Import Batch #%{ id }" +msgstr "" + +#: front/src/components/library/Library.vue:20 +msgid "Import batches" +msgstr "" + +#: front/src/components/library/import/BatchList.vue:117 +msgid "Import Batches" +msgstr "" + +#: front/src/components/manage/library/FilesTable.vue:40 +#: front/src/components/manage/library/RequestsTable.vue:53 +msgid "Import date" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:38 +msgid "Import detail page" +msgstr "" + +#: front/src/components/Sidebar.vue:81 +msgid "Import music" +msgstr "" + +#: front/src/components/library/import/Main.vue:267 +msgid "Import Music" +msgstr "" + +#: front/src/components/Home.vue:71 +msgid "Import music from various platforms, such as YouTube or SoundCloud" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:14 +#: front/src/components/federation/LibraryTrackTable.vue:66 +msgid "Import pending" +msgstr "" + +#: front/src/views/admin/library/Base.vue:9 +#: front/src/views/admin/library/RequestsList.vue:3 +#: front/src/views/admin/library/RequestsList.vue:21 +msgid "Import requests" +msgstr "" + +#: front/src/components/library/import/BatchList.vue:20 +#: front/src/components/library/import/Main.vue:6 +msgid "Import source" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:9 +msgid "Import status" +msgstr "" + +#: front/src/components/library/import/ReleaseImport.vue:14 +msgid "Import this release" +msgstr "" + +#: front/src/components/library/import/TrackImport.vue:11 +msgid "Import this track" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:12 +#: front/src/components/manage/library/RequestsTable.vue:29 +#: front/src/components/manage/library/RequestsTable.vue:61 +msgid "Imported" +msgstr "" + +#: front/src/components/library/import/TrackImport.vue:44 +msgid "Imported URL" +msgstr "" + +#: front/src/views/admin/Settings.vue:82 +msgid "Imports" +msgstr "" + +#: front/src/components/favorites/TrackFavoriteIcon.vue:3 +msgid "In favorites" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:65 +msgid "In library" +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:54 +msgid "Inactive" +msgstr "" + +#: front/src/components/library/import/Main.vue:96 +msgid "Input a MusicBrainz ID manually:" +msgstr "" + +#: front/src/views/auth/PasswordReset.vue:53 +msgid "Input the email address binded to your account" +msgstr "" + +#: front/src/components/playlists/Editor.vue:31 +msgid "Insert from queue (%{ count } track)" +msgid_plural "Insert from queue (%{ count } tracks)" +msgstr[0] "" +msgstr[1] "" + +#: front/src/views/admin/Settings.vue:80 +msgid "Instance information" +msgstr "" + +#: front/src/components/library/Radios.vue:9 +msgid "Instance radios" +msgstr "" + +#: front/src/views/admin/Settings.vue:75 +msgid "Instance settings" +msgstr "" + +#: front/src/views/instance/Timeline.vue:57 +msgid "Instance Timeline" +msgstr "" + +#: front/src/components/auth/Signup.vue:42 +#: front/src/components/manage/users/InvitationForm.vue:11 +msgid "Invitation code" +msgstr "" + +#: front/src/components/auth/Signup.vue:43 +msgid "Invitation code (optional)" +msgstr "" + +#: front/src/views/admin/users/Base.vue:8 +#: src/views/admin/users/InvitationsList.vue:3 +#: front/src/views/admin/users/InvitationsList.vue:24 +msgid "Invitations" +msgstr "" + +#: front/src/App.vue:43 +msgid "Issue tracker" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:80 +msgid "Job ID" +msgstr "" + +#: front/src/components/library/import/BatchList.vue:36 +msgid "Jobs" +msgstr "" + +#: front/src/components/Home.vue:50 +msgid "Keep a track of your favorite songs" +msgstr "" + +#: front/src/components/audio/track/Table.vue:33 +msgid "Keep your PRIVATE_TOKEN secret as it gives access to your account." +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:41 +#: front/src/views/admin/users/UsersDetail.vue:45 +msgid "Last activity" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:101 +msgid "Last fetched" +msgstr "" + +#: front/src/components/playlists/PlaylistModal.vue:32 +msgid "Last modification" +msgstr "" + +#: front/src/components/common/ActionTable.vue:39 +msgid "Launch" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:18 +#: front/src/components/library/import/BatchList.vue:35 +msgid "Launch date" +msgstr "" + +#: front/src/components/federation/LibraryForm.vue:31 +msgid "Launch scan" +msgstr "" + +#: front/src/components/Home.vue:10 +msgid "Learn more about this instance" +msgstr "" + +#: front/src/components/manage/users/InvitationForm.vue:58 +msgid "Leave empty for a random code" +msgstr "" + +#: front/src/components/requests/Form.vue:10 +msgid "Leave this field empty if you're requesting the whole discography." +msgstr "" + +#: front/src/views/federation/Base.vue:5 +#: src/views/federation/LibraryList.vue:123 +msgid "Libraries" +msgstr "" + +#: front/src/components/Sidebar.vue:70 +#: front/src/components/federation/LibraryTrackTable.vue:51 +#: front/src/components/instance/Stats.vue:30 +#: front/src/components/manage/users/UsersTable.vue:176 +#: front/src/views/admin/users/UsersDetail.vue:157 +#: front/src/views/federation/LibraryDetail.vue:194 +msgid "Library" +msgstr "" + +#: front/src/views/admin/library/FilesList.vue:3 +msgid "Library files" +msgstr "" + +#: front/src/components/federation/LibraryForm.vue:20 +msgid "Library name" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:84 +msgid "Library size" +msgstr "" + +#: front/src/components/federation/LibraryForm.vue:96 +msgid "library@demo.funkwhale.audio" +msgstr "" + +#: front/src/App.vue:29 +msgid "Links" +msgstr "" + +#: front/src/views/instance/Timeline.vue:4 +msgid "Loading timeline..." +msgstr "" + +#: front/src/components/favorites/List.vue:5 +msgid "Loading your favorites..." +msgstr "" + +#: front/src/components/auth/Login.vue:78 +msgid "Log In" +msgstr "" + +#: front/src/components/auth/Login.vue:4 +msgid "Log in to your Funkwhale account" +msgstr "" + +#: front/src/components/auth/Logout.vue:20 +msgid "Log Out" +msgstr "" + +#: front/src/components/Sidebar.vue:38 +msgid "Logged in as %{ username }" +msgstr "" + +#: front/src/components/Sidebar.vue:44 src/components/auth/Login.vue:41 +msgid "Login" +msgstr "" + +#: front/src/components/Sidebar.vue:43 +msgid "Logout" +msgstr "" + +#: front/src/components/audio/Player.vue:266 +msgid "Looping disabled. Click to switch to single-track looping." +msgstr "" + +#: front/src/components/audio/Player.vue:267 +msgid "Looping on a single track. Click to switch to whole queue looping." +msgstr "" + +#: front/src/components/audio/Player.vue:268 +msgid "Looping on whole queue. Click to disable looping." +msgstr "" + +#: front/src/components/library/Track.vue:94 +msgid "Lyrics" +msgstr "" + +#: front/src/views/admin/library/Base.vue:25 +msgid "Manage library" +msgstr "" + +#: front/src/components/playlists/PlaylistModal.vue:3 +msgid "Manage playlists" +msgstr "" + +#: front/src/views/admin/users/Base.vue:20 +msgid "Manage users" +msgstr "" + +#: front/src/views/playlists/List.vue:8 +msgid "Manage your playlists" +msgstr "" + +#: front/src/components/manage/library/RequestsTable.vue:197 +msgid "Mark as closed" +msgstr "" + +#: front/src/components/manage/library/RequestsTable.vue:196 +msgid "Mark as imported" +msgstr "" + +#: front/src/components/library/import/Main.vue:12 +msgid "Metadata" +msgstr "" + +#: front/src/components/library/import/Main.vue:115 +msgid "" +"Metadata is the data related to the music you want to import. This includes all the information about the artists, albums and tracks. In order to have a high quality library, it is recommended to grab data from the\n" +" \n" +" MusicBrainz\n" +" \n" +" project, which you can think about as the Wikipedia of music." +msgstr "" + +#: front/src/components/Sidebar.vue:48 +#: src/components/library/import/Main.vue:18 +msgid "Music" +msgstr "" + +#: front/src/components/library/import/Main.vue:147 +msgid "Music request" +msgstr "" + +#: front/src/components/audio/Player.vue:265 +msgid "Mute" +msgstr "" + +#: front/src/components/Sidebar.vue:34 +msgid "My account" +msgstr "" + +#: front/src/components/playlists/Form.vue:74 +msgid "My awesome playlist" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:227 +msgid "My awesome radio" +msgstr "" + +#: front/src/components/library/Track.vue:64 +#: src/components/library/Track.vue:75 +#: front/src/components/library/Track.vue:86 +#: front/src/components/manage/library/FilesTable.vue:63 +#: front/src/components/manage/library/FilesTable.vue:69 +#: front/src/components/manage/library/FilesTable.vue:75 +#: front/src/components/manage/library/FilesTable.vue:81 +#: front/src/components/manage/library/RequestsTable.vue:71 +#: front/src/components/manage/library/RequestsTable.vue:75 +#: front/src/components/manage/library/RequestsTable.vue:82 +#: front/src/components/manage/users/UsersTable.vue:61 +#: front/src/views/admin/users/UsersDetail.vue:49 +msgid "N/A" +msgstr "" + +#: front/src/components/playlists/PlaylistModal.vue:31 +#: front/src/views/admin/users/UsersDetail.vue:21 +msgid "Name" +msgstr "" + +#: front/src/components/auth/Settings.vue:88 +#: front/src/views/auth/PasswordResetConfirm.vue:14 +msgid "New password" +msgstr "" + +#: front/src/components/Sidebar.vue:158 +msgid "New tracks will be appended here automatically." +msgstr "" + +#: front/src/components/library/import/Main.vue:29 +msgid "Next step" +msgstr "" + +#: front/src/components/audio/Player.vue:263 +msgid "Next track" +msgstr "" + +#: front/src/components/Sidebar.vue:125 +msgid "No" +msgstr "" + +#: front/src/components/Home.vue:103 +msgid "No add-ons, no plugins : you only need a web library" +msgstr "" + +#: front/src/components/library/Track.vue:102 +msgid "No lyrics available for this track." +msgstr "" + +#: front/src/components/playlists/Form.vue:81 +msgid "Nobody except me" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:32 +msgid "Not following" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:13 +#: front/src/components/federation/LibraryTrackTable.vue:67 +msgid "Not imported" +msgstr "" + +#: front/src/components/manage/users/InvitationsTable.vue:51 +msgid "Not used" +msgstr "" + +#: front/src/App.vue:37 +msgid "Official website" +msgstr "" + +#: front/src/components/auth/Settings.vue:83 +msgid "Old password" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:36 +msgid "Once all your files are uploaded, simply click the following button to check the import status." +msgstr "" + +#: front/src/components/federation/LibraryCard.vue:21 +#: front/src/components/manage/users/InvitationsTable.vue:20 +msgid "Open" +msgstr "" + +#: front/src/App.vue:63 +msgid "Options" +msgstr "" + +#: front/src/components/library/import/Main.vue:93 +msgid "Or" +msgstr "" + +#: front/src/components/favorites/List.vue:23 +#: front/src/components/federation/LibraryTrackTable.vue:18 +#: front/src/components/library/Artists.vue:15 +#: src/components/library/Radios.vue:33 +#: front/src/components/manage/library/FilesTable.vue:9 +#: front/src/components/manage/library/RequestsTable.vue:9 +#: front/src/components/manage/users/InvitationsTable.vue:9 +#: front/src/components/manage/users/UsersTable.vue:9 +#: front/src/views/federation/LibraryList.vue:18 +#: src/views/playlists/List.vue:17 +msgid "Ordering" +msgstr "" + +#: front/src/components/favorites/List.vue:31 +#: front/src/components/federation/LibraryTrackTable.vue:26 +#: front/src/components/library/Artists.vue:23 +#: src/components/library/Radios.vue:41 +#: front/src/components/manage/library/FilesTable.vue:17 +#: front/src/components/manage/library/RequestsTable.vue:17 +#: front/src/components/manage/users/UsersTable.vue:17 +#: front/src/views/federation/LibraryList.vue:26 +#: src/views/playlists/List.vue:25 +msgid "Ordering direction" +msgstr "" + +#: front/src/components/manage/users/InvitationsTable.vue:38 +msgid "Owner" +msgstr "" + +#: front/src/components/PageNotFound.vue:33 +msgid "Page Not Found" +msgstr "" + +#: front/src/components/PageNotFound.vue:7 +msgid "Page not found!" +msgstr "" + +#: front/src/components/auth/Login.vue:32 src/components/auth/Signup.vue:38 +msgid "Password" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:95 +msgid "Password updated" +msgstr "" + +#: front/src/views/auth/PasswordResetConfirm.vue:28 +msgid "Password updated successfully" +msgstr "" + +#: front/src/components/audio/Player.vue:262 +msgid "Pause track" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:46 +#: front/src/components/library/import/BatchDetail.vue:33 +#: front/src/components/library/import/BatchDetail.vue:69 +#: front/src/components/library/import/BatchList.vue:14 +#: front/src/components/library/import/FileUpload.vue:59 +#: front/src/components/manage/library/RequestsTable.vue:27 +#: front/src/components/manage/library/RequestsTable.vue:63 +msgid "Pending" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:11 +#: front/src/views/federation/LibraryDetail.vue:26 +msgid "Pending approval" +msgstr "" + +#: front/src/components/Sidebar.vue:217 +msgid "Pending follow requests" +msgstr "" + +#: front/src/components/Sidebar.vue:216 src/views/admin/library/Base.vue:26 +msgid "Pending import requests" +msgstr "" + +#: front/src/components/requests/Form.vue:26 src/views/federation/Base.vue:36 +msgid "Pending requests" +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:42 +#: front/src/views/admin/users/UsersDetail.vue:68 +msgid "Permissions" +msgstr "" + +#: front/src/components/audio/PlayButton.vue:9 +#: src/components/library/Track.vue:30 +msgid "Play" +msgstr "" + +#: front/src/components/audio/album/Card.vue:50 +#: front/src/components/audio/artist/Card.vue:44 +#: src/components/library/Album.vue:28 front/src/views/playlists/Detail.vue:23 +msgid "Play all" +msgstr "" + +#: front/src/components/library/Artist.vue:26 +msgid "Play all albums" +msgstr "" + +#: front/src/components/audio/PlayButton.vue:58 +msgid "Play immediatly" +msgstr "" + +#: front/src/components/audio/PlayButton.vue:15 +msgid "Play next" +msgstr "" + +#: front/src/components/audio/PlayButton.vue:16 +msgid "Play now" +msgstr "" + +#: front/src/components/audio/Player.vue:261 +msgid "Play track" +msgstr "" + +#: front/src/views/playlists/Detail.vue:90 +msgid "Playlist" +msgstr "" + +#: front/src/views/playlists/Detail.vue:12 +msgid "Playlist containing %{ count } track, by %{ username }" +msgid_plural "Playlist containing %{ count } tracks, by %{ username }" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/playlists/Form.vue:9 +msgid "Playlist created" +msgstr "" + +#: front/src/components/playlists/Editor.vue:4 +msgid "Playlist editor" +msgstr "" + +#: front/src/components/playlists/Form.vue:21 +msgid "Playlist name" +msgstr "" + +#: front/src/components/playlists/Form.vue:6 +msgid "Playlist updated" +msgstr "" + +#: front/src/components/playlists/Form.vue:25 +msgid "Playlist visibility" +msgstr "" + +#: front/src/components/Sidebar.vue:56 src/components/library/Home.vue:16 +#: front/src/components/library/Library.vue:13 src/views/admin/Settings.vue:83 +#: front/src/views/playlists/List.vue:103 +msgid "Playlists" +msgstr "" + +#: front/src/components/Home.vue:56 +msgid "Playlists? We got them" +msgstr "" + +#: front/src/components/auth/Settings.vue:79 +msgid "Please double-check your password is correct" +msgstr "" + +#: front/src/components/auth/Login.vue:9 +msgid "Please double-check your username/password couple is correct" +msgstr "" + +#: front/src/components/auth/Settings.vue:46 +msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px." +msgstr "" + +#: front/src/components/library/import/Main.vue:26 +msgid "Previous step" +msgstr "" + +#: front/src/components/audio/Player.vue:260 +msgid "Previous track" +msgstr "" + +#: front/src/views/auth/EmailConfirm.vue:26 +#: front/src/views/auth/PasswordResetConfirm.vue:31 +msgid "Proceed to login" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:50 +msgid "Published date" +msgstr "" + +#: front/src/components/library/import/ArtistImport.vue:17 +msgid "Query template" +msgstr "" + +#: front/src/components/Sidebar.vue:20 +msgid "Queue" +msgstr "" + +#: front/src/components/audio/Player.vue:203 +msgid "Queue shuffled!" +msgstr "" + +#: front/src/views/radios/Detail.vue:80 +msgid "Radio" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:226 +msgid "Radio Builder" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:15 +msgid "Radio created" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:21 +msgid "Radio name" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:12 +#, fuzzy +msgid "Radio updated" +msgstr "Kreodato" + +#: front/src/components/library/Library.vue:10 +#: src/components/library/Radios.vue:141 +msgid "Radios" +msgstr "" + +#: front/src/views/instance/Timeline.vue:7 +msgid "Recent activity on this instance" +msgstr "" + +#: front/src/components/library/Home.vue:24 +msgid "Recently added" +msgstr "" + +#: front/src/components/library/Home.vue:11 +msgid "Recently favorited" +msgstr "" + +#: front/src/components/library/Home.vue:6 +msgid "Recently listened" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:81 +msgid "Recording MusicBrainz ID" +msgstr "" + +#: front/src/views/admin/users/UsersDetail.vue:84 +#: front/src/views/federation/LibraryDetail.vue:122 +msgid "Refresh" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:42 +msgid "Refused" +msgstr "" + +#: front/src/components/auth/Profile.vue:12 +msgid "Registered since %{ date }" +msgstr "" + +#: front/src/components/auth/Signup.vue:9 +msgid "Registration are closed on this instance, you will need an invitation code to signup." +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:71 +msgid "regular user" +msgstr "" + +#: front/src/components/library/radios/Filter.vue:59 +msgid "Remove" +msgstr "" + +#: front/src/components/auth/Settings.vue:58 +msgid "Remove avatar" +msgstr "" + +#: front/src/components/favorites/TrackFavoriteIcon.vue:19 +msgid "Remove from favorites" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:34 +#: front/src/components/auth/SubsonicTokenForm.vue:37 +msgid "Request a new password" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:35 +msgid "Request a new Subsonic API password?" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:43 +msgid "Request a password" +msgstr "" + +#: front/src/App.vue:35 +msgid "Request music" +msgstr "" + +#: front/src/views/library/MusicRequest.vue:4 +#: src/views/library/MusicRequest.vue:21 +msgid "Request some music" +msgstr "" + +#: front/src/components/requests/Form.vue:20 +msgid "Request submitted!" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:49 +msgid "Rerun errored jobs" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:187 +msgid "Rerun job" +msgstr "" + +#: front/src/components/auth/Login.vue:34 src/views/auth/PasswordReset.vue:4 +#: front/src/views/auth/PasswordReset.vue:52 +msgid "Reset your password" +msgstr "" + +#: front/src/components/library/import/TrackImport.vue:31 +msgid "Result %{ current }/%{ total }" +msgstr "" + +#: front/src/components/favorites/List.vue:38 +#: src/components/library/Artists.vue:30 +#: front/src/components/library/Radios.vue:52 +#: src/views/federation/LibraryList.vue:33 +#: front/src/views/playlists/List.vue:32 +msgid "Results per page" +msgstr "" + +#: front/src/components/admin/SettingsGroup.vue:63 +#: front/src/components/library/radios/Builder.vue:29 +msgid "Save" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:112 +msgid "Scan triggered!" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:5 +#: front/src/components/library/Artists.vue:10 +#: src/components/library/Radios.vue:29 +#: front/src/components/library/import/BatchDetail.vue:62 +#: front/src/components/library/import/BatchList.vue:7 +#: front/src/components/manage/library/FilesTable.vue:5 +#: front/src/components/manage/library/RequestsTable.vue:5 +#: front/src/components/manage/users/InvitationsTable.vue:5 +#: front/src/components/manage/users/UsersTable.vue:5 +#: front/src/views/federation/LibraryList.vue:14 +#: src/views/playlists/List.vue:13 +msgid "Search" +msgstr "" + +#: front/src/components/library/import/Main.vue:85 +msgid "Search an entity you want to import:" +msgstr "" + +#: front/src/components/manage/library/RequestsTable.vue:180 +msgid "Search by artist, username, comment..." +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:188 +msgid "Search by source..." +msgstr "" + +#: front/src/components/library/import/BatchList.vue:116 +msgid "Search by submitter, source..." +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:182 +#: front/src/components/manage/library/FilesTable.vue:175 +msgid "Search by title, artist, domain..." +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:140 +msgid "Search by username, domain..." +msgstr "" + +#: front/src/components/manage/users/InvitationsTable.vue:152 +msgid "Search by username, email, code..." +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:162 +msgid "Search by username, email, name..." +msgstr "" + +#: front/src/components/audio/SearchBar.vue:20 +msgid "Search for artists, albums, tracks..." +msgstr "" + +#: front/src/components/audio/Search.vue:2 +msgid "Search for some music" +msgstr "" + +#: front/src/components/library/Track.vue:105 +msgid "Search on lyrics.wikia.com" +msgstr "" + +#: front/src/components/library/Album.vue:33 +#: src/components/library/Artist.vue:31 +#: front/src/components/library/Track.vue:40 +msgid "Search on Wikipedia" +msgstr "" + +#: front/src/components/library/import/TrackImport.vue:42 +msgid "Search query" +msgstr "" + +#: front/src/views/admin/Settings.vue:15 +msgid "Sections" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:41 +msgid "Select a filter" +msgstr "" + +#: front/src/components/common/ActionTable.vue:61 +msgid "Select all %{ total } elements" +msgid_plural "Select all %{ total } elements" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/library/import/FileUpload.vue:22 +msgid "Select files to upload..." +msgstr "" + +#: front/src/components/common/ActionTable.vue:69 +msgid "Select only current page" +msgstr "" + +#: front/src/components/library/import/Main.vue:19 +msgid "Select relevant sources or files for import" +msgstr "" + +#: front/src/components/federation/LibraryCard.vue:43 +msgid "Send a follow request" +msgstr "" + +#: front/src/components/Sidebar.vue:97 +#: src/components/manage/users/UsersTable.vue:184 +#: front/src/views/admin/users/UsersDetail.vue:165 +msgid "Settings" +msgstr "" + +#: front/src/components/auth/Settings.vue:10 +msgid "Settings updated" +msgstr "" + +#: front/src/components/admin/SettingsGroup.vue:11 +msgid "Settings updated successfully." +msgstr "" + +#: front/src/components/auth/Profile.vue:24 +msgid "Settings..." +msgstr "" + +#: front/src/components/manage/users/InvitationForm.vue:27 +msgid "Share link" +msgstr "" + +#: front/src/components/audio/artist/Card.vue:30 +msgid "Show 1 more album" +msgid_plural "Show %{ count } more albums" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/audio/album/Card.vue:40 +msgid "Show 1 more track" +msgid_plural "Show %{ count } more tracks" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/forms/PasswordInput.vue:25 +msgid "Show/hide password" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:97 +#: front/src/components/federation/LibraryTrackTable.vue:98 +#: front/src/components/library/import/BatchDetail.vue:128 +#: front/src/components/library/import/BatchList.vue:73 +#: front/src/components/manage/library/FilesTable.vue:97 +#: front/src/components/manage/library/RequestsTable.vue:104 +#: front/src/components/manage/users/InvitationsTable.vue:76 +#: front/src/components/manage/users/UsersTable.vue:87 +msgid "Showing results %{ start }-%{ end } on %{ total }" +msgstr "" + +#: front/src/components/audio/Player.vue:269 +msgid "Shuffle your queue" +msgstr "" + +#: front/src/components/auth/Signup.vue:95 +msgid "Sign Up" +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:40 +#: front/src/views/admin/users/UsersDetail.vue:37 +msgid "Sign-up" +msgstr "" + +#: front/src/components/audio/track/Table.vue:31 +msgid "Simply copy paste the snippet below into a terminal to launch the download." +msgstr "" + +#: front/src/components/library/Track.vue:69 +#: front/src/components/library/import/FileUpload.vue:44 +#: front/src/components/manage/library/FilesTable.vue:44 +msgid "Size" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:37 +#: front/src/components/library/import/BatchDetail.vue:72 +msgid "Skipped" +msgstr "" + +#: front/src/components/requests/Form.vue:3 +msgid "Something's missing in the library? Let us know what you would like to listen!" +msgstr "" + +#: front/src/components/audio/Search.vue:25 +msgid "Sorry, we did not found any album matching your query" +msgstr "" + +#: front/src/components/audio/Search.vue:16 +msgid "Sorry, we did not found any artist matching your query" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:82 +#: front/src/components/library/import/BatchList.vue:38 +#: front/src/components/library/import/TrackImport.vue:17 +msgid "Source" +msgstr "" + +#: front/src/App.vue:41 +msgid "Source code" +msgstr "" + +#: front/src/App.vue:40 +msgid "Source code (%{version})" +msgstr "" + +#: front/src/components/auth/Profile.vue:20 +#: front/src/components/manage/users/UsersTable.vue:70 +msgid "Staff member" +msgstr "" + +#: front/src/components/radios/Button.vue:4 +msgid "Start" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:28 +msgid "Start Upload" +msgstr "" + +#: front/src/views/admin/Settings.vue:86 +msgid "Statistics" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:23 +#: front/src/components/federation/LibraryTrackTable.vue:46 +#: front/src/components/library/import/BatchDetail.vue:66 +#: front/src/components/library/import/BatchDetail.vue:83 +#: front/src/components/library/import/BatchList.vue:11 +#: front/src/components/library/import/BatchList.vue:37 +#: front/src/components/library/import/FileUpload.vue:45 +#: front/src/components/manage/library/RequestsTable.vue:24 +#: front/src/components/manage/library/RequestsTable.vue:48 +#: front/src/components/manage/users/InvitationsTable.vue:17 +#: front/src/components/manage/users/InvitationsTable.vue:39 +#: front/src/components/manage/users/UsersTable.vue:43 +msgid "Status" +msgstr "" + +#: front/src/components/radios/Button.vue:3 +msgid "Stop" +msgstr "" + +#: front/src/components/Sidebar.vue:159 +msgid "Stop radio" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:32 +msgid "Stop Upload" +msgstr "" + +#: front/src/App.vue:9 src/components/requests/Form.vue:17 +msgid "Submit" +msgstr "" + +#: front/src/components/requests/Form.vue:22 +msgid "Submit another request" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:26 +#: front/src/components/library/import/BatchList.vue:39 +msgid "Submitted by" +msgstr "" + +#: front/src/views/admin/Settings.vue:85 +msgid "Subsonic" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:2 +msgid "Subsonic API password" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:71 +#: front/src/components/library/import/BatchList.vue:16 +#: front/src/components/library/import/FileUpload.vue:56 +msgid "Success" +msgstr "" + +#: front/src/App.vue:11 +msgid "Suggested choices" +msgstr "" + +#: front/src/components/playlists/Editor.vue:9 +msgid "Syncing changes to server..." +msgstr "" + +#: front/src/components/Home.vue:26 +msgid "That's simple: we loved Grooveshark and we want to build something even better." +msgstr "" + +#: front/src/components/requests/Form.vue:73 +msgid "The Beatles, Mickael Jackson…" +msgstr "" + +#: front/src/App.vue:59 +msgid "The funkwhale logo was kindly designed and provided by Francis Gading." +msgstr "" + +#: front/src/components/Home.vue:124 +msgid "The plaform is free and open-source, you can install it and modify it without worries" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:4 +msgid "The Subsonic API is not available on this Funkwhale instance." +msgstr "" + +#: front/src/components/requests/Form.vue:74 +msgid "The White Album, Thriller…" +msgstr "" + +#: front/src/components/audio/track/Table.vue:30 +msgid "There is currently no way to download directly multiple tracks from funkwhale as a ZIP archive. However, you can use a command line tools such as cURL to easily download a list of tracks." +msgstr "" + +#: front/src/components/library/import/Main.vue:149 +msgid "This import will be associated with the music request below. After the import is finished, the request will be marked as fulfilled." +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:195 +msgid "This indicate if the remote library granted you access" +msgstr "" + +#: front/src/components/auth/Profile.vue:16 +msgid "This is you!" +msgstr "" + +#: front/src/components/common/ActionTable.vue:37 +msgid "This may affect a lot of elements, please double check this is really what you want." +msgstr "" + +#: front/src/components/audio/PlayButton.vue:61 +msgid "This track is not imported and cannot be played" +msgstr "" + +#: front/src/views/playlists/Detail.vue:37 +msgid "This will completely delete this playlist and cannot be undone." +msgstr "" + +#: front/src/views/radios/Detail.vue:27 +msgid "This will completely delete this radio and cannot be undone." +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:51 +msgid "This will completely disable access to the Subsonic API using from account." +msgstr "" + +#: front/src/App.vue:137 +msgid "This will erase your local data and disconnect you, do you want to continue?" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:36 +msgid "This will log you out from existing devices that use the current password." +msgstr "" + +#: front/src/components/playlists/Editor.vue:44 +msgid "This will remove all tracks from this playlist and cannot be undone." +msgstr "" + +#: front/src/components/audio/track/Table.vue:6 +#: front/src/components/federation/LibraryTrackTable.vue:47 +#: front/src/components/manage/library/FilesTable.vue:37 +msgid "Title" +msgstr "" + +#: front/src/components/audio/SearchBar.vue:27 +#: src/components/library/Track.vue:174 +#: front/src/components/library/import/BatchDetail.vue:84 +#: front/src/components/metadata/Search.vue:138 +msgid "Track" +msgstr "" + +#: front/src/components/library/Track.vue:53 +msgid "Track information" +msgstr "" + +#: front/src/components/library/radios/Filter.vue:44 +msgid "Track matching filter" +msgstr "" + +#: front/src/components/instance/Stats.vue:54 +msgid "tracks" +msgstr "" + +#: front/src/components/library/Album.vue:43 +#: front/src/components/playlists/PlaylistModal.vue:33 +#: front/src/views/federation/Base.vue:8 src/views/playlists/Detail.vue:50 +#: front/src/views/radios/Detail.vue:34 +msgid "Tracks" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:125 +msgid "Tracks available in this library" +msgstr "" + +#: front/src/components/library/Artist.vue:54 +msgid "Tracks by this artist" +msgstr "" + +#: front/src/components/instance/Stats.vue:25 +msgid "Tracks favorited" +msgstr "" + +#: front/src/components/instance/Stats.vue:19 +msgid "tracks listened" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:109 +msgid "Trigger scan" +msgstr "" + +#: front/src/components/manage/library/FilesTable.vue:41 +msgid "Type" +msgstr "" + +#: front/src/components/About.vue:15 +msgid "Unfortunately, owners of this instance did not yet take the time to complete this page." +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:95 +msgid "Unknown" +msgstr "" + +#: front/src/components/Home.vue:37 +msgid "Unlimited music" +msgstr "" + +#: front/src/components/audio/Player.vue:264 +msgid "Unmute" +msgstr "" + +#: front/src/components/auth/Settings.vue:50 +msgid "Update avatar" +msgstr "" + +#: front/src/components/playlists/Form.vue:33 +msgid "Update playlist" +msgstr "" + +#: front/src/components/auth/Settings.vue:27 +msgid "Update settings" +msgstr "" + +#: front/src/views/auth/PasswordResetConfirm.vue:21 +msgid "Update your password" +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:172 +#: front/src/views/admin/users/UsersDetail.vue:153 +msgid "Upload" +msgstr "" + +#: front/src/components/auth/Settings.vue:45 +msgid "Upload a new avatar" +msgstr "" + +#: front/src/components/library/import/Main.vue:7 +msgid "Uploaded files or external source" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:57 +msgid "Uploading..." +msgstr "" + +#: front/src/App.vue:45 +msgid "Use another instance" +msgstr "" + +#: front/src/components/requests/Form.vue:75 +msgid "Use this comment box to add details to your request if needed" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:196 +msgid "Use this flag to enable/disable federation with this library" +msgstr "" + +#: front/src/views/auth/PasswordReset.vue:12 +msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password." +msgstr "" + +#: front/src/components/federation/LibraryForm.vue:6 +msgid "Use this form to scan an instance and setup federation." +msgstr "" + +#: front/src/components/manage/users/InvitationsTable.vue:49 +msgid "Used" +msgstr "" + +#: front/src/components/manage/library/RequestsTable.vue:47 +msgid "User" +msgstr "" + +#: front/src/components/instance/Stats.vue:5 +msgid "User activity" +msgstr "" + +#: front/src/components/library/Radios.vue:20 +msgid "User radios" +msgstr "" + +#: front/src/components/auth/Signup.vue:19 +#: front/src/components/manage/users/UsersTable.vue:37 +msgid "Username" +msgstr "" + +#: front/src/components/auth/Login.vue:15 +msgid "Username or email" +msgstr "" + +#: front/src/components/instance/Stats.vue:13 +msgid "users" +msgstr "" + +#: front/src/components/Sidebar.vue:103 src/views/admin/Settings.vue:81 +#: front/src/views/admin/users/Base.vue:5 src/views/admin/users/UsersList.vue:3 +#: front/src/views/admin/users/UsersList.vue:21 +msgid "Users" +msgstr "" + +#: front/src/components/library/Album.vue:37 +#: src/components/library/Artist.vue:35 +#: front/src/components/library/Track.vue:44 +#: front/src/components/library/import/ArtistImport.vue:131 +#: front/src/components/metadata/ArtistCard.vue:49 +#: front/src/components/metadata/ReleaseCard.vue:53 +msgid "View on MusicBrainz" +msgstr "" + +#: front/src/components/playlists/PlaylistModal.vue:20 +msgid "We cannot add the track to a playlist" +msgstr "" + +#: front/src/components/playlists/Form.vue:14 +msgid "We cannot create the playlist" +msgstr "" + +#: front/src/components/auth/Signup.vue:13 +msgid "We cannot create your account" +msgstr "" + +#: front/src/components/auth/Login.vue:7 +msgid "We cannot log you in" +msgstr "" + +#: front/src/components/auth/Settings.vue:38 +msgid "We cannot save your avatar" +msgstr "" + +#: front/src/components/auth/Settings.vue:14 +msgid "We cannot save your settings" +msgstr "" + +#: front/src/components/Home.vue:130 +msgid "We do not track you or bother you with ads" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:5 +msgid "We recommend using Picard for that purpose." +msgstr "" + +#: front/src/components/Home.vue:7 +msgid "We think listening to music should be simple." +msgstr "" + +#: front/src/components/PageNotFound.vue:10 +msgid "We're sorry, the page you asked for does not exist:" +msgstr "" + +#: front/src/components/requests/Form.vue:21 +msgid "We've received your request, you'll get some groove soon ;)" +msgstr "" + +#: front/src/components/Home.vue:152 +msgid "Welcome" +msgstr "" + +#: front/src/components/Home.vue:5 +msgid "Welcome on Funkwhale" +msgstr "" + +#: front/src/components/library/import/Main.vue:114 +msgid "What is metadata?" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:197 +msgid "When enabled, auto importing will automatically import new tracks published in this library" +msgstr "" + +#: front/src/components/Home.vue:24 +msgid "Why funkwhale?" +msgstr "" + +#: front/src/components/Sidebar.vue:124 +msgid "Yes" +msgstr "" + +#: front/src/components/auth/Logout.vue:8 +msgid "Yes, log me out!" +msgstr "" + +#: front/src/components/auth/Logout.vue:7 +msgid "You are currently logged in as %{ username }" +msgstr "" + +#: front/src/components/library/import/Main.vue:111 +msgid "You can also skip this step and enter metadata manually." +msgstr "" + +#: front/src/components/Home.vue:136 +msgid "You can invite friends and family to your instance so they can enjoy your music" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:7 +msgid "You can use this interface to build your own custom radio, which will play tracks according to your criteria." +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:8 +msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance." +msgstr "" + +#: front/src/components/Sidebar.vue:156 +msgid "You have a radio playing" +msgstr "" + +#: front/src/App.vue:6 +msgid "You need to select an instance in order to continue" +msgstr "" + +#: front/src/components/auth/Settings.vue:100 +msgid "You will be logged out from this session and have to log in with the new one" +msgstr "" + +#: front/src/components/auth/Settings.vue:71 +msgid "You will have to update your password on your clients that use this password." +msgstr "" + +#: front/src/components/library/import/Main.vue:103 +msgid "You will import:" +msgstr "" + +#: front/src/views/auth/EmailConfirm.vue:24 +msgid "Your email address was confirmed, you can now use the service without limitations." +msgstr "" + +#: front/src/components/favorites/List.vue:109 +msgid "Your Favorites" +msgstr "" + +#: front/src/components/Home.vue:117 +msgid "Your music, your way" +msgstr "" + +#: front/src/views/auth/PasswordResetConfirm.vue:29 +msgid "Your password has been updated successfully." +msgstr "" + +#: front/src/components/auth/Settings.vue:101 +msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password" +msgstr "" + +#: front/src/components/audio/PlayButton.vue:156 +msgid "%{ count } track was added to your queue" +msgid_plural "%{ count } tracks were added to your queue" +msgstr[0] "" +msgstr[1] "" diff --git a/front/locales/fr_FR/LC_MESSAGES/app.po b/front/locales/fr_FR/LC_MESSAGES/app.po new file mode 100644 index 000000000..8c7377570 --- /dev/null +++ b/front/locales/fr_FR/LC_MESSAGES/app.po @@ -0,0 +1,2453 @@ +msgid "" +msgstr "" +"Project-Id-Version: French (Funkwhale)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-07-22 14:12+0200\n" +"PO-Revision-Date: 2018-07-21 21:30+0000\n" +"Last-Translator: Baptiste Gelez \n" +"Language-Team: French \n" +"Language: fr_FR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 2.20\n" + +#: front/src/components/playlists/PlaylistModal.vue:9 +msgid "\"%{ title }\", by %{ artist }" +msgstr "\"%{ title }\", de %{ artist }" + +#: front/src/components/Sidebar.vue:24 +msgid "(%{ index } of %{ length })" +msgstr "(%{ index } sur %{ length })" + +#: front/src/components/Sidebar.vue:22 +msgid "(empty)" +msgstr "(vide)" + +#: front/src/components/common/ActionTable.vue:43 +#: front/src/components/common/ActionTable.vue:51 +msgid "%{ count } on %{ total } selected" +msgid_plural "%{ count } on %{ total } selected" +msgstr[0] "%{ count } sur %{ total } élément sélectionné" +msgstr[1] "%{ count } sur %{ total } éléments sélectionnés" + +#: front/src/components/Sidebar.vue:116 +#: src/views/federation/LibraryDetail.vue:87 +msgid "%{ count } track" +msgid_plural "%{ count } tracks" +msgstr[0] "%{ count } piste" +msgstr[1] "%{ count } pistes" + +#: front/src/components/library/Artist.vue:13 +msgid "%{ count } track in %{ albumsCount } albums" +msgid_plural "%{ count } tracks in %{ albumsCount } albums" +msgstr[0] "%{ count } piste dans %{ albumsCount } albums" +msgstr[1] "%{ count } pistes dans %{ albumsCount } albums" + +#: front/src/components/library/radios/Builder.vue:76 +msgid "%{ count } track matching combined filters" +msgid_plural "%{ count } tracks matching combined filters" +msgstr[0] "%{ count } piste correspondant aux filtres sélectionnés" +msgstr[1] "%{ count } pistes correspondant aux filtres sélectionnés" + +#: front/src/components/playlists/Card.vue:18 +msgid "%{ count} track" +msgid_plural "%{ count } tracks" +msgstr[0] "%{ count} piste" +msgstr[1] "%{ count } pistes" + +#: front/src/components/common/Duration.vue:2 +msgid "%{ hours } h %{ minutes } min" +msgstr "%{hours} h %{minutes} min" + +#: front/src/components/common/Duration.vue:5 +msgid "%{ minutes } min" +msgstr "%{minutes} min" + +#: front/src/components/activity/Like.vue:7 +msgid "%{ user } favorited a track" +msgstr "%{ user } a ajouté une piste a ses favoris" + +#: front/src/components/activity/Listen.vue:7 +msgid "%{ user } listened to a track" +msgstr "%{ user } a écouté une piste" + +#: front/src/components/auth/Profile.vue:49 +msgid "%{ username }'s profile" +msgstr "Profil de %{ username }" + +#: front/src/components/audio/artist/Card.vue:41 +msgid "1 album" +msgid_plural "%{ count } albums" +msgstr[0] "1 album" +msgstr[1] "%{ count } albums" + +#: front/src/components/favorites/List.vue:10 +msgid "1 favorite" +msgid_plural "%{ count } favorites" +msgstr[0] "1 favoris" +msgstr[1] "%{ count } favoris" + +#: front/src/components/audio/album/Card.vue:54 +#: front/src/components/federation/LibraryCard.vue:25 +msgid "1 track" +msgid_plural "%{ count } tracks" +msgstr[0] "1 piste" +msgstr[1] "%{ count } pistes" + +#: front/src/components/About.vue:5 +msgid "About %{ instance }" +msgstr "À propos de cette instance" + +#: front/src/App.vue:54 +msgid "About Funkwhale" +msgstr "À propos de Funkwhale" + +#: front/src/App.vue:32 src/components/About.vue:8 src/components/About.vue:55 +msgid "About this instance" +msgstr "A propos de cette instance" + +#: front/src/components/manage/library/RequestsTable.vue:28 +#: front/src/components/manage/library/RequestsTable.vue:62 +msgid "Accepted" +msgstr "Accepté" + +#: front/src/components/auth/SubsonicTokenForm.vue:111 +msgid "Access disabled" +msgstr "Accès désactivé" + +#: front/src/components/Home.vue:109 +msgid "Access your music from a clean interface that focus on what really matters" +msgstr "Accédez à votre musique depuis une interface épurée, adaptée à ce qui compte vraiment" + +#: front/src/views/admin/users/UsersDetail.vue:54 +msgid "Account active" +msgstr "Compte actif" + +#: front/src/components/auth/Settings.vue:5 +msgid "Account settings" +msgstr "Paramètres du compte" + +#: front/src/components/auth/Settings.vue:257 +msgid "Account Settings" +msgstr "Paramètres du compte" + +#: front/src/components/manage/users/UsersTable.vue:39 +msgid "Account status" +msgstr "Statut du compte" + +#: front/src/views/auth/PasswordReset.vue:14 +msgid "Account's email" +msgstr "Email du compte" + +#: front/src/components/common/ActionTable.vue:82 +msgid "Action %{ action } was launched successfully on %{ count } element" +msgid_plural "Action %{ action } was launched successfully on %{ count } elements" +msgstr[0] "L'action %{ action } a été lancée avec succès sur %{ count } élément" +msgstr[1] "L'action %{ action } a été lancée avec succès sur %{ count } éléments" + +#: front/src/components/common/ActionTable.vue:8 +#: front/src/components/federation/LibraryFollowTable.vue:24 +#: front/src/components/library/radios/Builder.vue:60 +#: front/src/components/manage/library/RequestsTable.vue:54 +msgid "Actions" +msgstr "Actions" + +#: front/src/components/manage/users/UsersTable.vue:53 +#, fuzzy +msgid "Active" +msgstr "Activité" + +#: front/src/components/Sidebar.vue:60 +msgid "Activity" +msgstr "Activité" + +#: front/src/components/federation/LibraryFollowTable.vue:21 +msgid "Actor" +msgstr "Acteur" + +#: front/src/views/federation/LibraryList.vue:8 +msgid "Add a new library" +msgstr "Ajouter une nouvelle bibliothèque" + +#: front/src/components/library/radios/Builder.vue:46 +msgid "Add filter" +msgstr "Ajouter des filtres" + +#: front/src/components/library/radios/Builder.vue:36 +msgid "Add filters to customize your radio" +msgstr "Ajouter des filtres pour personnaliser votre radio" + +#: front/src/components/audio/PlayButton.vue:53 +msgid "Add to current queue" +msgstr "Ajouter à la queue" + +#: front/src/components/favorites/TrackFavoriteIcon.vue:4 +#: front/src/components/favorites/TrackFavoriteIcon.vue:21 +msgid "Add to favorites" +msgstr "Ajouter aux favoris" + +#: front/src/components/playlists/TrackPlaylistIcon.vue:6 +#: front/src/components/playlists/TrackPlaylistIcon.vue:32 +msgid "Add to playlist..." +msgstr "Ajouter à une playlist..." + +#: front/src/components/audio/PlayButton.vue:14 +msgid "Add to queue" +msgstr "Ajouter à la queue" + +#: front/src/components/playlists/PlaylistModal.vue:116 +msgid "Add to this playlist" +msgstr "Ajouter à cette playlist" + +#: front/src/components/playlists/PlaylistModal.vue:54 +msgid "Add track" +msgstr "Ajouter une piste" + +#: front/src/components/manage/users/UsersTable.vue:69 +msgid "Admin" +msgstr "Admin" + +#: front/src/components/Sidebar.vue:64 +msgid "Administration" +msgstr "Administration" + +#: front/src/components/audio/SearchBar.vue:26 +#: src/components/audio/track/Table.vue:8 +#: front/src/components/federation/LibraryTrackTable.vue:49 +#: front/src/components/library/Album.vue:91 +#: front/src/components/manage/library/FilesTable.vue:39 +#: front/src/components/metadata/Search.vue:134 +msgid "Album" +msgstr "Album" + +#: front/src/components/library/import/ReleaseImport.vue:3 +msgid "Album %{ title } (%{ count } track) by %{ artist }" +msgid_plural "Album %{ title } (%{ count } tracks) by %{ artist }" +msgstr[0] "Album %{ title } (%{ count } piste) par %{ artist }" +msgstr[1] "Album %{ title } (%{ count } pistes) by %{ artist }" + +#: front/src/components/library/Album.vue:12 +msgid "Album containing %{ count } track, by %{ artist }" +msgid_plural "Album containing %{ count } tracks, by %{ artist }" +msgstr[0] "Album incluant %{ count } piste, de %{ artist }" +msgstr[1] "Album incluant %{ count } pistes, de %{ artist }" + +#: front/src/components/library/Track.vue:20 +msgid "Album page" +msgstr "Page de l'album" + +#: front/src/components/audio/Search.vue:19 +#: src/components/instance/Stats.vue:48 +#: front/src/components/manage/library/RequestsTable.vue:50 +#: front/src/components/requests/Form.vue:9 +msgid "Albums" +msgstr "Albums" + +#: front/src/components/library/Artist.vue:44 +msgid "Albums by this artist" +msgstr "Albums de cet·te artiste" + +#: front/src/components/manage/library/RequestsTable.vue:26 +#: front/src/components/manage/users/InvitationsTable.vue:19 +msgid "All" +msgstr "Tout" + +#: front/src/components/playlists/Editor.vue:13 +msgid "An error occured while saving your changes" +msgstr "Une erreur s'est produite pendant l'enregistrement de vos modifications" + +#: front/src/components/auth/Login.vue:10 +msgid "An unknown error happend, this can mean the server is down or cannot be reached" +msgstr "Une erreur inconnue a été rencontrée, ce qui peut signifier que le serveur est en panne ou n’a pas pu être atteint" + +#: front/src/components/federation/LibraryTrackTable.vue:11 +#: front/src/components/library/import/BatchDetail.vue:68 +#: front/src/components/library/import/BatchList.vue:13 +#: front/src/components/library/import/BatchList.vue:22 +msgid "Any" +msgstr "Tous" + +#: front/src/components/library/import/BatchList.vue:24 +msgid "API" +msgstr "API" + +#: front/src/components/federation/LibraryFollowTable.vue:68 +#: front/src/components/federation/LibraryFollowTable.vue:78 +msgid "Approve" +msgstr "Approuver" + +#: front/src/components/federation/LibraryFollowTable.vue:70 +msgid "Approve access?" +msgstr "Approuver l'accès ?" + +#: front/src/components/federation/LibraryFollowTable.vue:38 +msgid "Approved" +msgstr "Approuvé" + +#: front/src/components/auth/Logout.vue:5 +msgid "Are you sure you want to log out?" +msgstr "Êtes-vous sur de vouloir vous déconnecter ?" + +#: front/src/components/audio/SearchBar.vue:25 +#: src/components/audio/track/Table.vue:7 +#: front/src/components/federation/LibraryTrackTable.vue:48 +#: front/src/components/library/Artist.vue:119 +#: front/src/components/manage/library/FilesTable.vue:38 +#: front/src/components/manage/library/RequestsTable.vue:49 +#: front/src/components/metadata/Search.vue:130 +msgid "Artist" +msgstr "Artiste" + +#: front/src/components/requests/Form.vue:5 +msgid "Artist name" +msgstr "Nom de l'artiste" + +#: front/src/components/library/Album.vue:22 +#: src/components/library/Track.vue:23 +msgid "Artist page" +msgstr "Page de l'artiste" + +#: front/src/components/audio/Search.vue:65 +msgid "Artist, album, track..." +msgstr "Artiste, album, piste..." + +#: front/src/components/audio/Search.vue:10 +#: src/components/instance/Stats.vue:42 +#: front/src/components/library/Artists.vue:119 +#: src/components/library/Library.vue:7 +msgid "Artists" +msgstr "Artistes" + +#: front/src/components/favorites/List.vue:33 +#: front/src/components/federation/LibraryTrackTable.vue:28 +#: front/src/components/library/Artists.vue:25 +#: src/components/library/Radios.vue:44 +#: front/src/components/manage/library/FilesTable.vue:19 +#: front/src/components/manage/library/RequestsTable.vue:19 +#: front/src/components/manage/users/UsersTable.vue:19 +#: front/src/views/federation/LibraryList.vue:28 +#: src/views/playlists/List.vue:27 +msgid "Ascending" +msgstr "Ascendant" + +#: front/src/views/auth/PasswordReset.vue:27 +msgid "Ask for a password reset" +msgstr "Demander à réinitialiser votre mot de passe" + +#: front/src/views/federation/LibraryDetail.vue:56 +msgid "Auto importing" +msgstr "Import automatique" + +#: front/src/components/playlists/PlaylistModal.vue:26 +msgid "Available playlists" +msgstr "Playlists disponibles" + +#: front/src/components/auth/Settings.vue:34 +msgid "Avatar" +msgstr "Avatar" + +#: front/src/views/auth/EmailConfirm.vue:17 src/views/auth/PasswordReset.vue:24 +#: front/src/views/auth/PasswordResetConfirm.vue:18 +msgid "Back to login" +msgstr "Retour à la page de connexion" + +#: front/src/views/federation/LibraryFollowersList.vue:5 +msgid "Be careful when accepting follow requests, as it means the follower will have access to your entire library." +msgstr "Soyez prudent·es en acceptant les demandes d'abonnements, car vos abonné·es pourront accéder à l'intégralité de votre bibliothèque." + +#: front/src/components/library/Track.vue:80 +#: front/src/components/manage/library/FilesTable.vue:42 +msgid "Bitrate" +msgstr "Bitrate" + +#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4 +msgid "Browse" +msgstr "Parcourir" + +#: front/src/components/Sidebar.vue:50 +msgid "Browse library" +msgstr "Parcourir la bibliothèque" + +#: front/src/components/library/Artists.vue:4 +msgid "Browsing artists" +msgstr "Parcourir les artistes" + +#: front/src/views/federation/LibraryTrackList.vue:3 +msgid "Browsing federated tracks" +msgstr "Parcourir les pistes fédérées" + +#: front/src/views/federation/LibraryFollowersList.vue:3 +msgid "Browsing followers" +msgstr "Parcourir les abonnés" + +#: front/src/views/federation/LibraryList.vue:3 +msgid "Browsing libraries" +msgstr "Parcourir les bibliothèques" + +#: front/src/views/playlists/List.vue:3 +msgid "Browsing playlists" +msgstr "Parcourir les playlists" + +#: front/src/components/library/Radios.vue:4 +msgid "Browsing radios" +msgstr "Parcourir les radios" + +#: front/src/components/library/radios/Builder.vue:5 +msgid "Builder" +msgstr "Éditeur" + +#: front/src/components/audio/album/Card.vue:13 +msgid "By %{ artist }" +msgstr "De %{ artist }" + +#: front/src/components/federation/LibraryFollowTable.vue:57 +msgid "By confirming, %{ username } will be denied access to your library." +msgstr "Si vous confirmez, %{ username } se verra refuser l'accès à votre bibliothèque." + +#: front/src/components/federation/LibraryFollowTable.vue:73 +msgid "By confirming, %{ username } will be granted access to your library." +msgstr "Si vous confirmez, %{ username } se verra accorder l'accès à votre bitliothèque." + +#: front/src/components/audio/track/Table.vue:43 +#: front/src/components/common/DangerousButton.vue:17 +#: front/src/components/library/radios/Filter.vue:53 +#: front/src/components/playlists/PlaylistModal.vue:63 +msgid "Cancel" +msgstr "Annuler" + +#: front/src/components/library/radios/Builder.vue:59 +msgid "Candidates" +msgstr "Pistes candidates" + +#: front/src/components/auth/Settings.vue:76 +msgid "Cannot change your password" +msgstr "Mot de passe ne peut pas être changé" + +#: front/src/App.vue:66 +msgid "Change language" +msgstr "Changer de langue" + +#: front/src/components/auth/Settings.vue:67 +msgid "Change my password" +msgstr "Changer mon mot de passe" + +#: front/src/components/auth/Settings.vue:95 +msgid "Change password" +msgstr "Changer le mot de passe" + +#: front/src/views/auth/PasswordResetConfirm.vue:4 +#: front/src/views/auth/PasswordResetConfirm.vue:62 +msgid "Change your password" +msgstr "Changer votre mot de passe" + +#: front/src/components/auth/Settings.vue:96 +msgid "Change your password?" +msgstr "Changer le mot de passe ?" + +#: front/src/components/playlists/Editor.vue:21 +msgid "Changes synced with server" +msgstr "Changements synchronisés avec le serveur" + +#: front/src/components/auth/Settings.vue:70 +msgid "Changing your password will also change your Subsonic API password if you have requested one." +msgstr "La mise à jour de votre mot de passe impactera également le mot de passe de l'API Subsonic si vous en avez demandé un." + +#: front/src/components/auth/Settings.vue:98 +msgid "Changing your password will have the following consequences" +msgstr "Modifier votre mot de passe aura les conséquences suivantes" + +#: front/src/App.vue:4 +msgid "Choose your instance" +msgstr "Choisissez votre instance" + +#: front/src/components/Home.vue:64 +msgid "Clean library" +msgstr "Une bibliothèque musicale de qualité" + +#: front/src/components/manage/users/InvitationForm.vue:37 +msgid "Clear" +msgstr "Effacer" + +#: front/src/components/playlists/Editor.vue:40 +#: front/src/components/playlists/Editor.vue:45 +msgid "Clear playlist" +msgstr "Vider la playlist" + +#: front/src/components/audio/Player.vue:270 +msgid "Clear your queue" +msgstr "Vider la queue" + +#: front/src/components/library/import/BatchList.vue:23 +msgid "CLI" +msgstr "CLI" + +#: front/src/components/Home.vue:44 +msgid "Click once, listen for hours using built-in radios" +msgstr "Écoutez de la musique pendant des heures, en un clic, grâce aux radios intégrées." + +#: front/src/components/manage/library/RequestsTable.vue:30 +#: front/src/components/manage/library/RequestsTable.vue:64 +msgid "Closed" +msgstr "Fermée" + +#: front/src/components/manage/users/InvitationForm.vue:26 +#: front/src/components/manage/users/InvitationsTable.vue:42 +msgid "Code" +msgstr "Code" + +#: front/src/components/audio/album/Card.vue:43 +#: front/src/components/audio/artist/Card.vue:33 +#: front/src/components/discussion/Comment.vue:20 +msgid "Collapse" +msgstr "Réduire" + +#: front/src/components/manage/library/RequestsTable.vue:51 +#: front/src/components/requests/Form.vue:14 +msgid "Comment" +msgstr "Commentaire" + +#: front/src/components/library/radios/Builder.vue:58 +msgid "Config" +msgstr "Configuration" + +#: front/src/components/common/DangerousButton.vue:21 +msgid "Confirm" +msgstr "Confirmer" + +#: front/src/views/auth/EmailConfirm.vue:4 src/views/auth/EmailConfirm.vue:20 +#: front/src/views/auth/EmailConfirm.vue:51 +msgid "Confirm your email" +msgstr "Confirmer votre email" + +#: front/src/views/auth/EmailConfirm.vue:13 +msgid "Confirmation code" +msgstr "Code de confirmation" + +#: front/src/components/playlists/Editor.vue:163 +msgid "Copy tracks from current queue to playlist" +msgstr "Copier les pistes de la queue dans la playlist" + +#: front/src/components/Home.vue:88 +msgid "Covers, lyrics, our goal is to have them all ;)" +msgstr "Pochettes d'albums, paroles, notre but est de tout implémenter ;)" + +#: front/src/components/auth/Signup.vue:4 +msgid "Create a funkwhale account" +msgstr "Créer un compte funkwhale" + +#: front/src/components/playlists/Form.vue:2 +msgid "Create a new playlist" +msgstr "Créer une nouvelle playlist" + +#: front/src/components/auth/Login.vue:17 +msgid "Create an account" +msgstr "Créer un compte" + +#: front/src/components/manage/library/RequestsTable.vue:88 +#: front/src/components/requests/Card.vue:25 +msgid "Create import" +msgstr "Créer un import" + +#: front/src/components/auth/Signup.vue:51 +msgid "Create my account" +msgstr "Créer mon compte" + +#: front/src/components/playlists/Form.vue:34 +msgid "Create playlist" +msgstr "Créer une playlist" + +#: front/src/components/library/Radios.vue:23 +msgid "Create your own radio" +msgstr "Créer votre propre radio" + +#: front/src/components/federation/LibraryFollowTable.vue:22 +#: front/src/components/manage/library/RequestsTable.vue:52 +#: front/src/components/manage/users/InvitationsTable.vue:40 +msgid "Creation date" +msgstr "Date de création" + +#: front/src/components/auth/Settings.vue:54 +msgid "Current avatar" +msgstr "Avatar actuel" + +#: front/src/components/playlists/PlaylistModal.vue:8 +msgid "Current track" +msgstr "Piste actuelle" + +#: front/src/components/manage/library/FilesTable.vue:189 +#: front/src/components/manage/library/RequestsTable.vue:195 +#: front/src/components/manage/users/InvitationsTable.vue:166 +#: front/src/views/playlists/Detail.vue:33 +msgid "Delete" +msgstr "Supprimer" + +#: front/src/views/playlists/Detail.vue:38 +msgid "Delete playlist" +msgstr "Supprimer la playlist" + +#: front/src/views/radios/Detail.vue:28 +msgid "Delete radio" +msgstr "Supprimer la radio" + +#: front/src/components/federation/LibraryFollowTable.vue:52 +#: front/src/components/federation/LibraryFollowTable.vue:63 +msgid "Deny" +msgstr "Refuser" + +#: front/src/components/federation/LibraryFollowTable.vue:54 +msgid "Deny access?" +msgstr "Refuser l'accès ?" + +#: front/src/components/favorites/List.vue:34 +#: front/src/components/federation/LibraryTrackTable.vue:29 +#: front/src/components/library/Artists.vue:26 +#: src/components/library/Radios.vue:47 +#: front/src/components/manage/library/FilesTable.vue:20 +#: front/src/components/manage/library/RequestsTable.vue:20 +#: front/src/components/manage/users/UsersTable.vue:20 +#: front/src/views/federation/LibraryList.vue:29 +#: src/views/playlists/List.vue:28 +msgid "Descending" +msgstr "Descendant" + +#: front/src/components/federation/LibraryCard.vue:50 +msgid "Detail" +msgstr "Détail" + +#: front/src/views/admin/users/UsersDetail.vue:146 +msgid "Determine if the user account is active or not. Inactive users cannot login or use the service." +msgstr "Détermine si le compte utilisateur est actif ou non. Les comptes inactifs ne peuvent pas se connecter ou utiliser le service." + +#: front/src/components/auth/Settings.vue:104 +#: front/src/components/auth/SubsonicTokenForm.vue:52 +msgid "Disable access" +msgstr "Désactiver l'accès" + +#: front/src/components/auth/SubsonicTokenForm.vue:49 +msgid "Disable Subsonic access" +msgstr "Désactiver l'accès via Subsonic" + +#: front/src/components/auth/SubsonicTokenForm.vue:50 +msgid "Disable Subsonic API access?" +msgstr "Désactiver l'accès à l'API Subsonic ?" + +#: front/src/components/auth/SubsonicTokenForm.vue:14 +msgid "Discover how to use Funkwhale from other apps" +msgstr "Découvrez comment utiliser Funkwhale sur d'autres applications" + +#: front/src/components/library/radios/Builder.vue:26 +msgid "Display publicly" +msgstr "Afficher publiquement" + +#: front/src/components/playlists/Editor.vue:42 +msgid "Do you want to clear the playlist \"%{ playlist }\"?" +msgstr "Voulez-vous vider la playlist \"%{ playlist }\" ?" + +#: front/src/components/common/DangerousButton.vue:7 +msgid "Do you want to confirm this action?" +msgstr "Souhaitez-vous confirmer cette action ?" + +#: front/src/views/playlists/Detail.vue:35 +msgid "Do you want to delete the playlist \"%{ playlist }\"?" +msgstr "Voulez-vous supprimer la playlist \"%{ playlist }\" ?" + +#: front/src/views/radios/Detail.vue:26 +#, fuzzy +msgid "Do you want to delete the radio \"%{ radio }\"?" +msgstr "Voulez-vous supprimer la radio \"%{ radio }\" ?" + +#: front/src/components/common/ActionTable.vue:29 +msgid "Do you want to launch %{ action } on %{ count } element?" +msgid_plural "Do you want to launch %{ action } on %{ count } elements?" +msgstr[0] "Voulez-vous effectuer l'action \"%{ action } sur %{ count } élément ?" +msgstr[1] "Voulez-vous effectuer l'action \"%{ action } sur %{ count } éléments ?" + +#: front/src/components/Sidebar.vue:113 +msgid "Do you want to restore your previous queue?" +msgstr "Souhaitez-vous restaurer votre queue précédente ?" + +#: front/src/App.vue:38 +msgid "Documentation" +msgstr "Documentation" + +#: front/src/components/audio/track/Table.vue:24 +#: src/components/library/Track.vue:48 +msgid "Download" +msgstr "Télécharger" + +#: front/src/components/audio/track/Table.vue:27 +msgid "Download tracks" +msgstr "Télécharger" + +#: front/src/components/playlists/Editor.vue:49 +msgid "Drag and drop rows to reorder tracks in the playlist" +msgstr "Glissez et déposer les lignes pour réordonner les pistes dans la playlist" + +#: front/src/components/library/Track.vue:58 +#: front/src/components/manage/library/FilesTable.vue:43 +msgid "Duration" +msgstr "Durée" + +#: front/src/components/Home.vue:96 +msgid "Easy to use" +msgstr "Simple à utiliser" + +#: front/src/components/About.vue:21 +msgid "Edit instance info" +msgstr "Éditer les informations de cette instance" + +#: front/src/components/radios/Card.vue:20 src/views/playlists/Detail.vue:30 +msgid "Edit..." +msgstr "Éditer..." + +#: front/src/components/auth/Signup.vue:29 +#: front/src/components/manage/users/UsersTable.vue:38 +msgid "Email" +msgstr "Email" + +#: front/src/views/admin/users/UsersDetail.vue:29 +msgid "Email address" +msgstr "Adresse email" + +#: front/src/views/auth/EmailConfirm.vue:23 +msgid "Email confirmed" +msgstr "Email confirmé" + +#: front/src/views/playlists/Detail.vue:29 +msgid "End edition" +msgstr "Terminer l'édition" + +#: front/src/components/library/import/FileUpload.vue:4 +msgid "Ensure your music files are properly tagged before uploading them." +msgstr "Vérifier que vos fichiers musicaux sont correctement taggués avant de les envoyer." + +#: front/src/components/library/Radios.vue:140 +msgid "Enter a radio name..." +msgstr "Saisissez un nom de radio..." + +#: front/src/components/library/Artists.vue:118 +msgid "Enter an artist name..." +msgstr "Saisissez un nom d'artiste..." + +#: front/src/views/federation/LibraryList.vue:122 +msgid "Enter an library domain name..." +msgstr "Saisissez un nom de domaine..." + +#: front/src/views/playlists/List.vue:104 +msgid "Enter an playlist name..." +msgstr "Saisissez un nom de playlist..." + +#: front/src/components/auth/Signup.vue:98 +msgid "Enter your email" +msgstr "Saisissez votre email" + +#: front/src/components/auth/Signup.vue:96 +msgid "Enter your invitation code (case insensitive)" +msgstr "Saisissez votre code d'invitation (insensible à la casse)" + +#: front/src/components/metadata/Search.vue:114 +msgid "Enter your search query..." +msgstr "Saisissez votre recherche..." + +#: front/src/components/auth/Signup.vue:97 +msgid "Enter your username" +msgstr "Saisissez votre nom d'utilisateur·rice" + +#: front/src/components/auth/Login.vue:77 +msgid "Enter your username or email" +msgstr "Saisissez votre nom d'utilisateur·rice ou email" + +#: front/src/components/auth/SubsonicTokenForm.vue:20 +msgid "Error" +msgstr "Erreur" + +#: front/src/views/admin/Settings.vue:87 +msgid "Error reporting" +msgstr "Rapports d'erreur" + +#: front/src/components/common/ActionTable.vue:75 +msgid "Error while applying action" +msgstr "Erreur lors du traitement de l'action" + +#: front/src/views/auth/PasswordReset.vue:7 +msgid "Error while asking for a password reset" +msgstr "Erreur pendant la demande de réinitialisation de mot de passe" + +#: front/src/views/auth/PasswordResetConfirm.vue:7 +msgid "Error while changing your password" +msgstr "Erreur pendant le changement de mot de passe" + +#: front/src/views/auth/EmailConfirm.vue:7 +msgid "Error while confirming your email" +msgstr "Erreur lors de la confirmation de votre email" + +#: front/src/components/manage/users/InvitationForm.vue:4 +msgid "Error while creating invitation" +msgstr "Erreur lors de la création de l'invitation" + +#: front/src/components/admin/SettingsGroup.vue:5 +msgid "Error while saving settings" +msgstr "Erreur pendant l'enregistrement des paramètres" + +#: front/src/components/federation/LibraryForm.vue:10 +msgid "Error while scanning library" +msgstr "Erreur lors du scan de la bibliothèque" + +#: front/src/components/library/import/BatchDetail.vue:41 +#: front/src/components/library/import/BatchDetail.vue:70 +#: front/src/components/library/import/BatchList.vue:15 +msgid "Errored" +msgstr "En erreur" + +#: front/src/components/playlists/Form.vue:89 +msgid "Everyone" +msgstr "Tout le monde" + +#: front/src/components/playlists/Form.vue:85 +msgid "Everyone on this instance" +msgstr "Tout le monde sur cette instance" + +#: front/src/components/library/radios/Builder.vue:57 +msgid "Exclude" +msgstr "Exclure" + +#: front/src/components/discussion/Comment.vue:14 +msgid "Expand" +msgstr "Ouvrir" + +#: front/src/components/manage/users/InvitationsTable.vue:41 +msgid "Expiration date" +msgstr "Date d'expiration" + +#: front/src/components/manage/users/InvitationsTable.vue:50 +msgid "Expired" +msgstr "Expirée" + +#: front/src/components/manage/users/InvitationsTable.vue:21 +msgid "Expired/used" +msgstr "Expirée/utilisée" + +#: front/src/components/library/import/Main.vue:65 +msgid "External source. Supported backends" +msgstr "Source externe. Services supportés" + +#: front/src/components/Sidebar.vue:51 +msgid "Favorites" +msgstr "Favoris" + +#: front/src/components/federation/LibraryForm.vue:3 +msgid "Federate with a new instance" +msgstr "Fédérer avec une nouvelle instance" + +#: front/src/views/federation/LibraryTrackList.vue:21 +msgid "Federated tracks" +msgstr "Pistes fédérées" + +#: front/src/components/Sidebar.vue:87 +#: src/components/library/import/BatchList.vue:25 +#: front/src/components/manage/users/UsersTable.vue:180 +#: front/src/views/admin/Settings.vue:84 +#: src/views/admin/users/UsersDetail.vue:161 +#: front/src/views/federation/Base.vue:35 +#: src/views/federation/LibraryDetail.vue:40 +msgid "Federation" +msgstr "Fédération" + +#: front/src/views/federation/LibraryDetail.vue:3 +msgid "File mirroring" +msgstr "Réplication des fichiers" + +#: front/src/components/library/import/FileUpload.vue:43 +msgid "File name" +msgstr "Nom du fichier" + +#: front/src/components/library/import/Main.vue:76 +msgid "File upload" +msgstr "Envoi de fichier" + +#: front/src/views/admin/library/Base.vue:5 +#: src/views/admin/library/FilesList.vue:21 +msgid "Files" +msgstr "Fichiers" + +#: front/src/components/library/import/ArtistImport.vue:7 +msgid "Filter album types" +msgstr "Filtrer le type d'album" + +#: front/src/components/library/radios/Builder.vue:56 +msgid "Filter name" +msgstr "Nom du filtre" + +#: front/src/components/library/import/Main.vue:52 +msgid "Finish import" +msgstr "Terminer l'import" + +#: front/src/components/library/import/BatchDetail.vue:54 +msgid "Finished" +msgstr "Terminé" + +#: front/src/components/library/import/Main.vue:59 +msgid "First, choose where you want to import the music from" +msgstr "Tout d'abord, choisissez le mode d'import de la musique" + +#: front/src/components/federation/LibraryCard.vue:44 +msgid "Follow" +msgstr "Suivre" + +#: front/src/components/federation/LibraryCard.vue:36 +msgid "Follow request pending approval" +msgstr "Abonnement en attente de validation" + +#: front/src/views/federation/LibraryDetail.vue:21 +msgid "Follow status" +msgstr "Statut de l'abonnement" + +#: front/src/views/federation/Base.vue:13 +#: front/src/views/federation/LibraryFollowersList.vue:24 +msgid "Followers" +msgstr "Abonnés" + +#: front/src/components/federation/LibraryCard.vue:18 +msgid "Followers only" +msgstr "Abonné·es seulement" + +#: front/src/components/federation/LibraryCard.vue:15 +#: front/src/views/federation/LibraryDetail.vue:29 +msgid "Following" +msgstr "Abonné" + +#: front/src/components/activity/Like.vue:12 +#: src/components/activity/Listen.vue:12 +msgid "from %{ album } by %{ artist }" +msgstr "de l'album %{ album } par %{ artist }" + +#: front/src/components/library/Track.vue:13 +msgid "From album %{ album } by %{ artist }" +msgstr "De l'album %{ album } par %{ artist }" + +#: front/src/App.vue:56 +msgid "Funkwhale is a free and open-source project run by volunteers. You can help us improve the platform by reporting bugs, suggesting features and share the project with your friends!" +msgstr "Funkwale est un projet open-source et gratuit, animé par des bénévoles. Vous pouvez nous aider à améliorer le service en remontant les problèmes que vous rencontrez, en suggérant des améliorations et en parlant du projet autour de vous !" + +#: front/src/components/auth/SubsonicTokenForm.vue:7 +msgid "Funkwhale is compatible with other music players that support the Subsonic API." +msgstr "Funkwhale est compatible avec d'autres lecteurs de musique qui supportent l'API Subsonic." + +#: front/src/components/Home.vue:98 +msgid "Funkwhale is dead simple to use." +msgstr "Funkwhale est très simple à utiliser." + +#: front/src/components/Home.vue:39 +msgid "Funkwhale is designed to make it easy to listen to music you like, or to discover new artists." +msgstr "Funkwhale est conçu pour faciliter l'écoute des musiques que vous aimez et découvrir de nouveaux artistes." + +#: front/src/components/Home.vue:119 +msgid "Funkwhale is free and gives you control on your music." +msgstr "Funkwhale est gratuit et vous donne le contrôle sur votre musique." + +#: front/src/components/Home.vue:66 +msgid "Funkwhale takes care of handling your music" +msgstr "Funkwhale prend soin de votre musique" + +#: front/src/components/manage/users/InvitationForm.vue:16 +msgid "Get a new invitation" +msgstr "Obtenir une nouvelle invitation" + +#: front/src/components/Home.vue:13 +msgid "Get me to the library" +msgstr "Amenez moi à la bibliothèque" + +#: front/src/components/Home.vue:77 +msgid "" +"Get quality metadata about your music thanks to\n" +" \n" +" MusicBrainz\n" +" " +msgstr "" +"Obtenez des métadonnées de qualité grâce à \n" +" MusicBrainz\n" +" " + +#: front/src/components/common/ActionTable.vue:21 +#: front/src/components/common/ActionTable.vue:27 +msgid "Go" +msgstr "Aller" + +#: front/src/components/PageNotFound.vue:14 +msgid "Go to home page" +msgstr "Retourner à la page d'accueil" + +#: front/src/components/library/import/Main.vue:13 +msgid "Grab corresponding metadata" +msgstr "Récupérer les métadonnées correspondantes" + +#: front/src/App.vue:74 +msgid "Help us translate Funkwhale" +msgstr "" + +#: front/src/components/library/Home.vue:65 +msgid "Home" +msgstr "Accueil" + +#: front/src/components/instance/Stats.vue:36 +msgid "Hours of music" +msgstr "Heures de musique" + +#: front/src/components/auth/SubsonicTokenForm.vue:11 +msgid "However, accessing Funkwhale from those clients require a separate password you can set below." +msgstr "Cependant, accéder à Funkwhale depuis ces clients requiert un mot de passe distinct que vous pouvez configurer ci-dessous." + +#: front/src/components/library/import/BatchList.vue:34 +msgid "ID" +msgstr "ID" + +#: front/src/views/auth/PasswordResetConfirm.vue:24 +msgid "If the email address provided in the previous step is valid and binded to a user account, you should receive an email with reset instructions in the next couple of minutes." +msgstr "Si l'adresse email que vous avez fournie est valide et associée à un compte utilisateur, vous allez recevoir un email contenant les instructions de réinitialisation au cours des prochaines minutes." + +#: front/src/components/federation/LibraryTrackTable.vue:196 +#: front/src/components/library/Library.vue:17 +msgid "Import" +msgstr "Import" + +#: front/src/components/federation/LibraryTrackTable.vue:57 +msgid "Import #%{ id } launched" +msgstr "Import #%{ id } démarré" + +#: front/src/components/library/import/Main.vue:38 +msgid "Import %{ count } track" +msgid_plural "Import %{ count } tracks" +msgstr[0] "Import %{ count } track" +msgstr[1] "Importer %{ count } pistes" + +#: front/src/components/library/import/BatchDetail.vue:10 +msgid "Import batch" +msgstr "Lot d'import" + +#: front/src/components/library/import/BatchDetail.vue:185 +msgid "Import Batch #%{ id }" +msgstr "Lot d'imports #%{ id }" + +#: front/src/components/library/Library.vue:20 +msgid "Import batches" +msgstr "Lots d'imports" + +#: front/src/components/library/import/BatchList.vue:117 +msgid "Import Batches" +msgstr "Lots d'imports" + +#: front/src/components/manage/library/FilesTable.vue:40 +#: front/src/components/manage/library/RequestsTable.vue:53 +msgid "Import date" +msgstr "Date d'import" + +#: front/src/components/library/import/FileUpload.vue:38 +msgid "Import detail page" +msgstr "Page de détail de l'import" + +#: front/src/components/Sidebar.vue:81 +msgid "Import music" +msgstr "Importer de la musique" + +#: front/src/components/library/import/Main.vue:267 +msgid "Import Music" +msgstr "Importer de la musique" + +#: front/src/components/Home.vue:71 +msgid "Import music from various platforms, such as YouTube or SoundCloud" +msgstr "Importez de la musique de différentes plate-formes, comme YouTube ou Soundcloud" + +#: front/src/components/federation/LibraryTrackTable.vue:14 +#: front/src/components/federation/LibraryTrackTable.vue:66 +msgid "Import pending" +msgstr "Import en attente" + +#: front/src/views/admin/library/Base.vue:9 +#: front/src/views/admin/library/RequestsList.vue:3 +#: front/src/views/admin/library/RequestsList.vue:21 +msgid "Import requests" +msgstr "Requêtes d'import" + +#: front/src/components/library/import/BatchList.vue:20 +#: front/src/components/library/import/Main.vue:6 +msgid "Import source" +msgstr "Source de l'import" + +#: front/src/components/federation/LibraryTrackTable.vue:9 +msgid "Import status" +msgstr "Status de l'import" + +#: front/src/components/library/import/ReleaseImport.vue:14 +msgid "Import this release" +msgstr "Importer cet album" + +#: front/src/components/library/import/TrackImport.vue:11 +msgid "Import this track" +msgstr "Importer cette piste" + +#: front/src/components/federation/LibraryTrackTable.vue:12 +#: front/src/components/manage/library/RequestsTable.vue:29 +#: front/src/components/manage/library/RequestsTable.vue:61 +msgid "Imported" +msgstr "Importé" + +#: front/src/components/library/import/TrackImport.vue:44 +msgid "Imported URL" +msgstr "URL importée" + +#: front/src/views/admin/Settings.vue:82 +msgid "Imports" +msgstr "Imports" + +#: front/src/components/favorites/TrackFavoriteIcon.vue:3 +msgid "In favorites" +msgstr "Dans les favoris" + +#: front/src/components/federation/LibraryTrackTable.vue:65 +msgid "In library" +msgstr "Dans la bibliothèque" + +#: front/src/components/manage/users/UsersTable.vue:54 +msgid "Inactive" +msgstr "Actif" + +#: front/src/components/library/import/Main.vue:96 +msgid "Input a MusicBrainz ID manually:" +msgstr "Saisir manuellement un ID MusicBrainz :" + +#: front/src/views/auth/PasswordReset.vue:53 +msgid "Input the email address binded to your account" +msgstr "Saisissez l'adresse email associée à votre compte" + +#: front/src/components/playlists/Editor.vue:31 +msgid "Insert from queue (%{ count } track)" +msgid_plural "Insert from queue (%{ count } tracks)" +msgstr[0] "Insérer depuis la queue (%{ count } piste)" +msgstr[1] "Insérer depuis la queue (%{ count } pistes)" + +#: front/src/views/admin/Settings.vue:80 +msgid "Instance information" +msgstr "Informations relatives à cette instance" + +#: front/src/components/library/Radios.vue:9 +msgid "Instance radios" +msgstr "Radios de l'instance" + +#: front/src/views/admin/Settings.vue:75 +msgid "Instance settings" +msgstr "Paramètres de l'instance" + +#: front/src/views/instance/Timeline.vue:57 +msgid "Instance Timeline" +msgstr "Fil de l'instance" + +#: front/src/components/auth/Signup.vue:42 +#: front/src/components/manage/users/InvitationForm.vue:11 +msgid "Invitation code" +msgstr "Code d'invitation" + +#: front/src/components/auth/Signup.vue:43 +msgid "Invitation code (optional)" +msgstr "Code d'invitation (optionnel)" + +#: front/src/views/admin/users/Base.vue:8 +#: src/views/admin/users/InvitationsList.vue:3 +#: front/src/views/admin/users/InvitationsList.vue:24 +msgid "Invitations" +msgstr "Invitations" + +#: front/src/App.vue:43 +msgid "Issue tracker" +msgstr "Issue tracker" + +#: front/src/components/library/import/BatchDetail.vue:80 +msgid "Job ID" +msgstr "ID de la tâche" + +#: front/src/components/library/import/BatchList.vue:36 +msgid "Jobs" +msgstr "Tâches" + +#: front/src/components/Home.vue:50 +msgid "Keep a track of your favorite songs" +msgstr "Gardez une trace de vos chansons favorites" + +#: front/src/components/audio/track/Table.vue:33 +msgid "Keep your PRIVATE_TOKEN secret as it gives access to your account." +msgstr "Gardez votre PRIVATE_TOKEN secret étant donné qu'il permet l'accès à votre compte." + +#: front/src/components/manage/users/UsersTable.vue:41 +#: front/src/views/admin/users/UsersDetail.vue:45 +msgid "Last activity" +msgstr "Dernière activité" + +#: front/src/views/federation/LibraryDetail.vue:101 +msgid "Last fetched" +msgstr "Dernière récupération" + +#: front/src/components/playlists/PlaylistModal.vue:32 +msgid "Last modification" +msgstr "Dernière modification" + +#: front/src/components/common/ActionTable.vue:39 +msgid "Launch" +msgstr "Démarrer" + +#: front/src/components/library/import/BatchDetail.vue:18 +#: front/src/components/library/import/BatchList.vue:35 +msgid "Launch date" +msgstr "Date de lancement" + +#: front/src/components/federation/LibraryForm.vue:31 +msgid "Launch scan" +msgstr "Démarrer le scan" + +#: front/src/components/Home.vue:10 +msgid "Learn more about this instance" +msgstr "En apprendre plus à propos de cette instance" + +#: front/src/components/manage/users/InvitationForm.vue:58 +msgid "Leave empty for a random code" +msgstr "Laisser vide pour obtenir un code aléatoire" + +#: front/src/components/requests/Form.vue:10 +msgid "Leave this field empty if you're requesting the whole discography." +msgstr "Laisser ce champ vide si vous voulez suggérer toute la discographie." + +#: front/src/views/federation/Base.vue:5 +#: src/views/federation/LibraryList.vue:123 +msgid "Libraries" +msgstr "Bibliothèques" + +#: front/src/components/Sidebar.vue:70 +#: front/src/components/federation/LibraryTrackTable.vue:51 +#: front/src/components/instance/Stats.vue:30 +#: front/src/components/manage/users/UsersTable.vue:176 +#: front/src/views/admin/users/UsersDetail.vue:157 +#: front/src/views/federation/LibraryDetail.vue:194 +msgid "Library" +msgstr "Bibliothèque" + +#: front/src/views/admin/library/FilesList.vue:3 +msgid "Library files" +msgstr "Fichiers de la bibliothèque" + +#: front/src/components/federation/LibraryForm.vue:20 +msgid "Library name" +msgstr "Nom de la bibliothèque" + +#: front/src/views/federation/LibraryDetail.vue:84 +msgid "Library size" +msgstr "Taille de la bibliothèque" + +#: front/src/components/federation/LibraryForm.vue:96 +msgid "library@demo.funkwhale.audio" +msgstr "library@demo.funkwhale.audio" + +#: front/src/App.vue:29 +msgid "Links" +msgstr "Liens" + +#: front/src/views/instance/Timeline.vue:4 +msgid "Loading timeline..." +msgstr "Chargement de la timeline ..." + +#: front/src/components/favorites/List.vue:5 +msgid "Loading your favorites..." +msgstr "Chargement de vos favoris ..." + +#: front/src/components/auth/Login.vue:78 +msgid "Log In" +msgstr "Connexion" + +#: front/src/components/auth/Login.vue:4 +msgid "Log in to your Funkwhale account" +msgstr "Connectez vous à votre compte Funkwhale" + +#: front/src/components/auth/Logout.vue:20 +msgid "Log Out" +msgstr "Déconnexion" + +#: front/src/components/Sidebar.vue:38 +msgid "Logged in as %{ username }" +msgstr "Connecté·e en tant que %{ username }" + +#: front/src/components/Sidebar.vue:44 src/components/auth/Login.vue:41 +msgid "Login" +msgstr "Connexion" + +#: front/src/components/Sidebar.vue:43 +msgid "Logout" +msgstr "Déconnexion" + +#: front/src/components/audio/Player.vue:266 +msgid "Looping disabled. Click to switch to single-track looping." +msgstr "Répétition désactivée. Cliquez pour activer la répétition sur la piste actuelle." + +#: front/src/components/audio/Player.vue:267 +msgid "Looping on a single track. Click to switch to whole queue looping." +msgstr "Répétition sur la piste en cours. Cliquer pour répêter sur l'intégralité de la queue." + +#: front/src/components/audio/Player.vue:268 +msgid "Looping on whole queue. Click to disable looping." +msgstr "Répétition sur l'intégralité, cliquez pour désactiver la répétition." + +#: front/src/components/library/Track.vue:94 +msgid "Lyrics" +msgstr "Paroles" + +#: front/src/views/admin/library/Base.vue:25 +msgid "Manage library" +msgstr "Gérer la bibliothèque" + +#: front/src/components/playlists/PlaylistModal.vue:3 +msgid "Manage playlists" +msgstr "Gérer les playlists" + +#: front/src/views/admin/users/Base.vue:20 +msgid "Manage users" +msgstr "Gérer les utilisateur·rices" + +#: front/src/views/playlists/List.vue:8 +msgid "Manage your playlists" +msgstr "Gérer vos playlists" + +#: front/src/components/manage/library/RequestsTable.vue:197 +msgid "Mark as closed" +msgstr "Marquer comme fermé" + +#: front/src/components/manage/library/RequestsTable.vue:196 +msgid "Mark as imported" +msgstr "Marquer comme importé" + +#: front/src/components/library/import/Main.vue:12 +msgid "Metadata" +msgstr "Metadonnées" + +#: front/src/components/library/import/Main.vue:115 +msgid "" +"Metadata is the data related to the music you want to import. This includes all the information about the artists, albums and tracks. In order to have a high quality library, it is recommended to grab data from the\n" +" \n" +" MusicBrainz\n" +" \n" +" project, which you can think about as the Wikipedia of music." +msgstr "" +"Les métadonnées sont les informations relatives à la musique que vous souhaitez importer. Cela inclut notamment toutes les informations concernant les artistes, albums et pistes. Afin d'avoir des métadonnées de qualité, il est recommandé d'utiliser les métadonnées du projet \n" +" MusicBrainz\n" +" \n" +" qui est une base de données musicale fonctionnant sur le même modèle que Wikipédia." + +#: front/src/components/Sidebar.vue:48 +#: src/components/library/import/Main.vue:18 +msgid "Music" +msgstr "Musique" + +#: front/src/components/library/import/Main.vue:147 +msgid "Music request" +msgstr "Requête musicale" + +#: front/src/components/audio/Player.vue:265 +msgid "Mute" +msgstr "Couper le son" + +#: front/src/components/Sidebar.vue:34 +msgid "My account" +msgstr "Mon compte" + +#: front/src/components/playlists/Form.vue:74 +msgid "My awesome playlist" +msgstr "Ma playlist d'enfer" + +#: front/src/components/library/radios/Builder.vue:227 +msgid "My awesome radio" +msgstr "Ma radio d'enfer" + +#: front/src/components/library/Track.vue:64 +#: src/components/library/Track.vue:75 +#: front/src/components/library/Track.vue:86 +#: front/src/components/manage/library/FilesTable.vue:63 +#: front/src/components/manage/library/FilesTable.vue:69 +#: front/src/components/manage/library/FilesTable.vue:75 +#: front/src/components/manage/library/FilesTable.vue:81 +#: front/src/components/manage/library/RequestsTable.vue:71 +#: front/src/components/manage/library/RequestsTable.vue:75 +#: front/src/components/manage/library/RequestsTable.vue:82 +#: front/src/components/manage/users/UsersTable.vue:61 +#: front/src/views/admin/users/UsersDetail.vue:49 +msgid "N/A" +msgstr "ND" + +#: front/src/components/playlists/PlaylistModal.vue:31 +#: front/src/views/admin/users/UsersDetail.vue:21 +msgid "Name" +msgstr "Nom" + +#: front/src/components/auth/Settings.vue:88 +#: front/src/views/auth/PasswordResetConfirm.vue:14 +msgid "New password" +msgstr "Nouveau mot de passe" + +#: front/src/components/Sidebar.vue:158 +msgid "New tracks will be appended here automatically." +msgstr "Les nouvelles pistes seront ajoutées ici automatiquement." + +#: front/src/components/library/import/Main.vue:29 +msgid "Next step" +msgstr "Prochaine étape" + +#: front/src/components/audio/Player.vue:263 +msgid "Next track" +msgstr "Piste suivante" + +#: front/src/components/Sidebar.vue:125 +msgid "No" +msgstr "Non" + +#: front/src/components/Home.vue:103 +msgid "No add-ons, no plugins : you only need a web library" +msgstr "Pas d'addons ou d'extension à installer, il vous suffit d'une bibliothèque sur le web" + +#: front/src/components/library/Track.vue:102 +msgid "No lyrics available for this track." +msgstr "Pas de paroles disponibles pour cette piste." + +#: front/src/components/playlists/Form.vue:81 +msgid "Nobody except me" +msgstr "Personne à part moi" + +#: front/src/views/federation/LibraryDetail.vue:32 +msgid "Not following" +msgstr "Non abonné·e" + +#: front/src/components/federation/LibraryTrackTable.vue:13 +#: front/src/components/federation/LibraryTrackTable.vue:67 +msgid "Not imported" +msgstr "Non importé" + +#: front/src/components/manage/users/InvitationsTable.vue:51 +msgid "Not used" +msgstr "Pas utilisé" + +#: front/src/App.vue:37 +msgid "Official website" +msgstr "Site officiel" + +#: front/src/components/auth/Settings.vue:83 +msgid "Old password" +msgstr "Ancien mot de passe" + +#: front/src/components/library/import/FileUpload.vue:36 +msgid "Once all your files are uploaded, simply click the following button to check the import status." +msgstr "Une fois que tous vos fichiers sont chargés, cliquez sur le bouton suivant pour vérifier le statut d'import." + +#: front/src/components/federation/LibraryCard.vue:21 +#: front/src/components/manage/users/InvitationsTable.vue:20 +msgid "Open" +msgstr "Accès libre" + +#: front/src/App.vue:63 +msgid "Options" +msgstr "Options" + +#: front/src/components/library/import/Main.vue:93 +msgid "Or" +msgstr "Ou" + +#: front/src/components/favorites/List.vue:23 +#: front/src/components/federation/LibraryTrackTable.vue:18 +#: front/src/components/library/Artists.vue:15 +#: src/components/library/Radios.vue:33 +#: front/src/components/manage/library/FilesTable.vue:9 +#: front/src/components/manage/library/RequestsTable.vue:9 +#: front/src/components/manage/users/InvitationsTable.vue:9 +#: front/src/components/manage/users/UsersTable.vue:9 +#: front/src/views/federation/LibraryList.vue:18 +#: src/views/playlists/List.vue:17 +msgid "Ordering" +msgstr "Ordre" + +#: front/src/components/favorites/List.vue:31 +#: front/src/components/federation/LibraryTrackTable.vue:26 +#: front/src/components/library/Artists.vue:23 +#: src/components/library/Radios.vue:41 +#: front/src/components/manage/library/FilesTable.vue:17 +#: front/src/components/manage/library/RequestsTable.vue:17 +#: front/src/components/manage/users/UsersTable.vue:17 +#: front/src/views/federation/LibraryList.vue:26 +#: src/views/playlists/List.vue:25 +msgid "Ordering direction" +msgstr "Direction" + +#: front/src/components/manage/users/InvitationsTable.vue:38 +msgid "Owner" +msgstr "Propriétaire" + +#: front/src/components/PageNotFound.vue:33 +msgid "Page Not Found" +msgstr "Page non trouvée" + +#: front/src/components/PageNotFound.vue:7 +msgid "Page not found!" +msgstr "Page non trouvée !" + +#: front/src/components/auth/Login.vue:32 src/components/auth/Signup.vue:38 +msgid "Password" +msgstr "Mot de passe" + +#: front/src/components/auth/SubsonicTokenForm.vue:95 +msgid "Password updated" +msgstr "Mot de passe mis à jour" + +#: front/src/views/auth/PasswordResetConfirm.vue:28 +msgid "Password updated successfully" +msgstr "Mot de passe modifié avec succès" + +#: front/src/components/audio/Player.vue:262 +msgid "Pause track" +msgstr "Mettre en pause" + +#: front/src/components/federation/LibraryFollowTable.vue:46 +#: front/src/components/library/import/BatchDetail.vue:33 +#: front/src/components/library/import/BatchDetail.vue:69 +#: front/src/components/library/import/BatchList.vue:14 +#: front/src/components/library/import/FileUpload.vue:59 +#: front/src/components/manage/library/RequestsTable.vue:27 +#: front/src/components/manage/library/RequestsTable.vue:63 +msgid "Pending" +msgstr "En attente" + +#: front/src/components/federation/LibraryFollowTable.vue:11 +#: front/src/views/federation/LibraryDetail.vue:26 +msgid "Pending approval" +msgstr "En attente de validation" + +#: front/src/components/Sidebar.vue:217 +msgid "Pending follow requests" +msgstr "Demandes d'abonnement en attente" + +#: front/src/components/Sidebar.vue:216 src/views/admin/library/Base.vue:26 +msgid "Pending import requests" +msgstr "Requêtes en attente" + +#: front/src/components/requests/Form.vue:26 src/views/federation/Base.vue:36 +msgid "Pending requests" +msgstr "Requêtes en attente" + +#: front/src/components/manage/users/UsersTable.vue:42 +#: front/src/views/admin/users/UsersDetail.vue:68 +msgid "Permissions" +msgstr "Permissions" + +#: front/src/components/audio/PlayButton.vue:9 +#: src/components/library/Track.vue:30 +msgid "Play" +msgstr "Jouer" + +#: front/src/components/audio/album/Card.vue:50 +#: front/src/components/audio/artist/Card.vue:44 +#: src/components/library/Album.vue:28 front/src/views/playlists/Detail.vue:23 +msgid "Play all" +msgstr "Tout lire" + +#: front/src/components/library/Artist.vue:26 +msgid "Play all albums" +msgstr "Lire tous les albums" + +#: front/src/components/audio/PlayButton.vue:58 +msgid "Play immediatly" +msgstr "Jouer immédiatement" + +#: front/src/components/audio/PlayButton.vue:15 +msgid "Play next" +msgstr "Lire ensuite" + +#: front/src/components/audio/PlayButton.vue:16 +msgid "Play now" +msgstr "Lire maintenant" + +#: front/src/components/audio/Player.vue:261 +msgid "Play track" +msgstr "Jouer" + +#: front/src/views/playlists/Detail.vue:90 +msgid "Playlist" +msgstr "Playlist" + +#: front/src/views/playlists/Detail.vue:12 +msgid "Playlist containing %{ count } track, by %{ username }" +msgid_plural "Playlist containing %{ count } tracks, by %{ username }" +msgstr[0] "Playlist contenant %{ count } piste, par %{ username }" +msgstr[1] "Playlist contenant %{ count } pistes, par %{ username }" + +#: front/src/components/playlists/Form.vue:9 +msgid "Playlist created" +msgstr "Playlist créée" + +#: front/src/components/playlists/Editor.vue:4 +msgid "Playlist editor" +msgstr "Éditeur de playlist" + +#: front/src/components/playlists/Form.vue:21 +msgid "Playlist name" +msgstr "Nom de la playlist" + +#: front/src/components/playlists/Form.vue:6 +msgid "Playlist updated" +msgstr "Playlist mise à jour" + +#: front/src/components/playlists/Form.vue:25 +msgid "Playlist visibility" +msgstr "Visibilité de la playlist" + +#: front/src/components/Sidebar.vue:56 src/components/library/Home.vue:16 +#: front/src/components/library/Library.vue:13 src/views/admin/Settings.vue:83 +#: front/src/views/playlists/List.vue:103 +msgid "Playlists" +msgstr "Playlists" + +#: front/src/components/Home.vue:56 +msgid "Playlists? We got them" +msgstr "Les playlists ? Elles sont là !" + +#: front/src/components/auth/Settings.vue:79 +msgid "Please double-check your password is correct" +msgstr "Merci de vérifier que votre mot de passe est correct" + +#: front/src/components/auth/Login.vue:9 +msgid "Please double-check your username/password couple is correct" +msgstr "Merci de vérifier que votre nom d'utilisateur et mot de passe sont corrects" + +#: front/src/components/auth/Settings.vue:46 +msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px." +msgstr "PNG, GIF ou JPG. 2Mb au plus. L'image sera réduite à 400×400 pixels." + +#: front/src/components/library/import/Main.vue:26 +msgid "Previous step" +msgstr "Étape précédente" + +#: front/src/components/audio/Player.vue:260 +msgid "Previous track" +msgstr "Piste précédente" + +#: front/src/views/auth/EmailConfirm.vue:26 +#: front/src/views/auth/PasswordResetConfirm.vue:31 +msgid "Proceed to login" +msgstr "Poursuivre vers la page de connexion" + +#: front/src/components/federation/LibraryTrackTable.vue:50 +msgid "Published date" +msgstr "Date de sortie" + +#: front/src/components/library/import/ArtistImport.vue:17 +msgid "Query template" +msgstr "Template de recherche" + +#: front/src/components/Sidebar.vue:20 +msgid "Queue" +msgstr "Queue" + +#: front/src/components/audio/Player.vue:203 +msgid "Queue shuffled!" +msgstr "La queue a été mélangée !" + +#: front/src/views/radios/Detail.vue:80 +msgid "Radio" +msgstr "Radio" + +#: front/src/components/library/radios/Builder.vue:226 +msgid "Radio Builder" +msgstr "Éditeur de radio" + +#: front/src/components/library/radios/Builder.vue:15 +#, fuzzy +msgid "Radio created" +msgstr "Nom de la radio" + +#: front/src/components/library/radios/Builder.vue:21 +msgid "Radio name" +msgstr "Nom de la radio" + +#: front/src/components/library/radios/Builder.vue:12 +#, fuzzy +msgid "Radio updated" +msgstr "Nom de la radio" + +#: front/src/components/library/Library.vue:10 +#: src/components/library/Radios.vue:141 +msgid "Radios" +msgstr "Radios" + +#: front/src/views/instance/Timeline.vue:7 +msgid "Recent activity on this instance" +msgstr "Activité récente sur cette instance" + +#: front/src/components/library/Home.vue:24 +msgid "Recently added" +msgstr "Ajoutés récemment" + +#: front/src/components/library/Home.vue:11 +msgid "Recently favorited" +msgstr "Ajoutées à vos favoris récemment" + +#: front/src/components/library/Home.vue:6 +msgid "Recently listened" +msgstr "Écoutées récemment" + +#: front/src/components/library/import/BatchDetail.vue:81 +msgid "Recording MusicBrainz ID" +msgstr "ID MusicBrainz de l'enregistrement" + +#: front/src/views/admin/users/UsersDetail.vue:84 +#: front/src/views/federation/LibraryDetail.vue:122 +msgid "Refresh" +msgstr "Rafraîchir" + +#: front/src/components/federation/LibraryFollowTable.vue:42 +msgid "Refused" +msgstr "Refusé" + +#: front/src/components/auth/Profile.vue:12 +msgid "Registered since %{ date }" +msgstr "Inscrit·e depuis le %{ date }" + +#: front/src/components/auth/Signup.vue:9 +msgid "Registration are closed on this instance, you will need an invitation code to signup." +msgstr "Les inscriptions sont fermées sur cette instance, vous aurez besoin d'un code d'invitation pour vous inscrire." + +#: front/src/components/manage/users/UsersTable.vue:71 +msgid "regular user" +msgstr "utilisateur·rice standard·e" + +#: front/src/components/library/radios/Filter.vue:59 +msgid "Remove" +msgstr "Retirer" + +#: front/src/components/auth/Settings.vue:58 +msgid "Remove avatar" +msgstr "Supprimer mon avatar" + +#: front/src/components/favorites/TrackFavoriteIcon.vue:19 +msgid "Remove from favorites" +msgstr "Retirer des favoris" + +#: front/src/components/auth/SubsonicTokenForm.vue:34 +#: front/src/components/auth/SubsonicTokenForm.vue:37 +msgid "Request a new password" +msgstr "Demander un nouveau mot de passe" + +#: front/src/components/auth/SubsonicTokenForm.vue:35 +msgid "Request a new Subsonic API password?" +msgstr "Demander un nouveau mot de passe pour l'API Subsonic ?" + +#: front/src/components/auth/SubsonicTokenForm.vue:43 +msgid "Request a password" +msgstr "Demander un mot de passe" + +#: front/src/App.vue:35 +msgid "Request music" +msgstr "Demandes de musique" + +#: front/src/views/library/MusicRequest.vue:4 +#: src/views/library/MusicRequest.vue:21 +msgid "Request some music" +msgstr "Demandez de la musique" + +#: front/src/components/requests/Form.vue:20 +msgid "Request submitted!" +msgstr "Requête envoyée" + +#: front/src/components/library/import/BatchDetail.vue:49 +msgid "Rerun errored jobs" +msgstr "Relancer les tâches échouées" + +#: front/src/components/library/import/BatchDetail.vue:187 +msgid "Rerun job" +msgstr "Relancer la tâche" + +#: front/src/components/auth/Login.vue:34 src/views/auth/PasswordReset.vue:4 +#: front/src/views/auth/PasswordReset.vue:52 +msgid "Reset your password" +msgstr "Réinitialiser votre mot de passe" + +#: front/src/components/library/import/TrackImport.vue:31 +msgid "Result %{ current }/%{ total }" +msgstr "Résultat %{ current }/%{ total }" + +#: front/src/components/favorites/List.vue:38 +#: src/components/library/Artists.vue:30 +#: front/src/components/library/Radios.vue:52 +#: src/views/federation/LibraryList.vue:33 +#: front/src/views/playlists/List.vue:32 +msgid "Results per page" +msgstr "Résultats par page" + +#: front/src/components/admin/SettingsGroup.vue:63 +#: front/src/components/library/radios/Builder.vue:29 +msgid "Save" +msgstr "Enregistrer" + +#: front/src/views/federation/LibraryDetail.vue:112 +msgid "Scan triggered!" +msgstr "Scan démarré !" + +#: front/src/components/federation/LibraryTrackTable.vue:5 +#: front/src/components/library/Artists.vue:10 +#: src/components/library/Radios.vue:29 +#: front/src/components/library/import/BatchDetail.vue:62 +#: front/src/components/library/import/BatchList.vue:7 +#: front/src/components/manage/library/FilesTable.vue:5 +#: front/src/components/manage/library/RequestsTable.vue:5 +#: front/src/components/manage/users/InvitationsTable.vue:5 +#: front/src/components/manage/users/UsersTable.vue:5 +#: front/src/views/federation/LibraryList.vue:14 +#: src/views/playlists/List.vue:13 +msgid "Search" +msgstr "Rechercher" + +#: front/src/components/library/import/Main.vue:85 +msgid "Search an entity you want to import:" +msgstr "Rechercher une ressource que vous voulez importer :" + +#: front/src/components/manage/library/RequestsTable.vue:180 +msgid "Search by artist, username, comment..." +msgstr "Rechercher par artiste, nom d'utilisateur·rice, commentaire..." + +#: front/src/components/library/import/BatchDetail.vue:188 +msgid "Search by source..." +msgstr "Rechercher par source..." + +#: front/src/components/library/import/BatchList.vue:116 +msgid "Search by submitter, source..." +msgstr "Rechercher par utilisateur·rice, source..." + +#: front/src/components/federation/LibraryTrackTable.vue:182 +#: front/src/components/manage/library/FilesTable.vue:175 +msgid "Search by title, artist, domain..." +msgstr "Rechercher par titre, artiste, domaine..." + +#: front/src/components/federation/LibraryFollowTable.vue:140 +msgid "Search by username, domain..." +msgstr "Rechercher par nom d'utilisateur·rice, domaine..." + +#: front/src/components/manage/users/InvitationsTable.vue:152 +msgid "Search by username, email, code..." +msgstr "Rechercher par nom d'utilisateur·rice, email, code..." + +#: front/src/components/manage/users/UsersTable.vue:162 +msgid "Search by username, email, name..." +msgstr "Rechercher par nom d'utilisateur·rice, email, nom..." + +#: front/src/components/audio/SearchBar.vue:20 +msgid "Search for artists, albums, tracks..." +msgstr "Rechercher des artistes, des albums, des pistes" + +#: front/src/components/audio/Search.vue:2 +msgid "Search for some music" +msgstr "Rechercher de la musique" + +#: front/src/components/library/Track.vue:105 +msgid "Search on lyrics.wikia.com" +msgstr "Rechercher sur lyrics.wikia.com" + +#: front/src/components/library/Album.vue:33 +#: src/components/library/Artist.vue:31 +#: front/src/components/library/Track.vue:40 +msgid "Search on Wikipedia" +msgstr "Rechercher sur Wikipédia" + +#: front/src/components/library/import/TrackImport.vue:42 +msgid "Search query" +msgstr "Recherche" + +#: front/src/views/admin/Settings.vue:15 +msgid "Sections" +msgstr "Sections" + +#: front/src/components/library/radios/Builder.vue:41 +msgid "Select a filter" +msgstr "Sélectionner un filtre" + +#: front/src/components/common/ActionTable.vue:61 +msgid "Select all %{ total } elements" +msgid_plural "Select all %{ total } elements" +msgstr[0] "Selectionner l'ensemble des %{ total } élément" +msgstr[1] "Selectionner l'ensemble des %{ total } éléments" + +#: front/src/components/library/import/FileUpload.vue:22 +msgid "Select files to upload..." +msgstr "Sélectionner les fichiers à envoyer..." + +#: front/src/components/common/ActionTable.vue:69 +msgid "Select only current page" +msgstr "Sélectionner seulement la page actuelle" + +#: front/src/components/library/import/Main.vue:19 +msgid "Select relevant sources or files for import" +msgstr "Sélectionner les sources ou fichiers à importer" + +#: front/src/components/federation/LibraryCard.vue:43 +msgid "Send a follow request" +msgstr "Envoyer une demande d'abonnement" + +#: front/src/components/Sidebar.vue:97 +#: src/components/manage/users/UsersTable.vue:184 +#: front/src/views/admin/users/UsersDetail.vue:165 +msgid "Settings" +msgstr "Paramètres" + +#: front/src/components/auth/Settings.vue:10 +msgid "Settings updated" +msgstr "Paramètres mis à jour" + +#: front/src/components/admin/SettingsGroup.vue:11 +msgid "Settings updated successfully." +msgstr "Paramètres modifiés avec succès." + +#: front/src/components/auth/Profile.vue:24 +msgid "Settings..." +msgstr "Paramètres..." + +#: front/src/components/manage/users/InvitationForm.vue:27 +msgid "Share link" +msgstr "Lien de partage" + +#: front/src/components/audio/artist/Card.vue:30 +msgid "Show 1 more album" +msgid_plural "Show %{ count } more albums" +msgstr[0] "Montrer 1 album supplémentaire" +msgstr[1] "Montrer %{ count } albums supplémentaires" + +#: front/src/components/audio/album/Card.vue:40 +msgid "Show 1 more track" +msgid_plural "Show %{ count } more tracks" +msgstr[0] "Afficher 1 piste de plus" +msgstr[1] "Afficher %{ count } pistes de plus" + +#: front/src/components/forms/PasswordInput.vue:25 +msgid "Show/hide password" +msgstr "Afficher/masquer le mot de passe" + +#: front/src/components/federation/LibraryFollowTable.vue:97 +#: front/src/components/federation/LibraryTrackTable.vue:98 +#: front/src/components/library/import/BatchDetail.vue:128 +#: front/src/components/library/import/BatchList.vue:73 +#: front/src/components/manage/library/FilesTable.vue:97 +#: front/src/components/manage/library/RequestsTable.vue:104 +#: front/src/components/manage/users/InvitationsTable.vue:76 +#: front/src/components/manage/users/UsersTable.vue:87 +msgid "Showing results %{ start }-%{ end } on %{ total }" +msgstr "Affichage des résultats %{ start }-%{ end } sur %{ total }" + +#: front/src/components/audio/Player.vue:269 +msgid "Shuffle your queue" +msgstr "Mélanger votre queue" + +#: front/src/components/auth/Signup.vue:95 +msgid "Sign Up" +msgstr "Inscription" + +#: front/src/components/manage/users/UsersTable.vue:40 +#: front/src/views/admin/users/UsersDetail.vue:37 +msgid "Sign-up" +msgstr "Inscription" + +#: front/src/components/audio/track/Table.vue:31 +msgid "Simply copy paste the snippet below into a terminal to launch the download." +msgstr "Copiez le texte ci-dessous dans un terminal pour lancer le téléchargement." + +#: front/src/components/library/Track.vue:69 +#: front/src/components/library/import/FileUpload.vue:44 +#: front/src/components/manage/library/FilesTable.vue:44 +msgid "Size" +msgstr "Taille" + +#: front/src/components/library/import/BatchDetail.vue:37 +#: front/src/components/library/import/BatchDetail.vue:72 +msgid "Skipped" +msgstr "Ignoré" + +#: front/src/components/requests/Form.vue:3 +msgid "Something's missing in the library? Let us know what you would like to listen!" +msgstr "Quelque chose manque dans la bibliothèque ? Dîtes nous ce que vous voulez écouter !" + +#: front/src/components/audio/Search.vue:25 +msgid "Sorry, we did not found any album matching your query" +msgstr "Désolé, nous n'avons trouvé aucun album correspondant à votre recherche" + +#: front/src/components/audio/Search.vue:16 +msgid "Sorry, we did not found any artist matching your query" +msgstr "Désolé, nous n'avons trouver aucun·a artiste correspondant à votre recherche" + +#: front/src/components/library/import/BatchDetail.vue:82 +#: front/src/components/library/import/BatchList.vue:38 +#: front/src/components/library/import/TrackImport.vue:17 +msgid "Source" +msgstr "Source" + +#: front/src/App.vue:41 +msgid "Source code" +msgstr "Code source" + +#: front/src/App.vue:40 +msgid "Source code (%{version})" +msgstr "Code source (%{version})" + +#: front/src/components/auth/Profile.vue:20 +#: front/src/components/manage/users/UsersTable.vue:70 +msgid "Staff member" +msgstr "Membre de l'équipe" + +#: front/src/components/radios/Button.vue:4 +msgid "Start" +msgstr "Démarrer" + +#: front/src/components/library/import/FileUpload.vue:28 +msgid "Start Upload" +msgstr "Démarrer l'envoi" + +#: front/src/views/admin/Settings.vue:86 +msgid "Statistics" +msgstr "Statistiques" + +#: front/src/components/federation/LibraryFollowTable.vue:23 +#: front/src/components/federation/LibraryTrackTable.vue:46 +#: front/src/components/library/import/BatchDetail.vue:66 +#: front/src/components/library/import/BatchDetail.vue:83 +#: front/src/components/library/import/BatchList.vue:11 +#: front/src/components/library/import/BatchList.vue:37 +#: front/src/components/library/import/FileUpload.vue:45 +#: front/src/components/manage/library/RequestsTable.vue:24 +#: front/src/components/manage/library/RequestsTable.vue:48 +#: front/src/components/manage/users/InvitationsTable.vue:17 +#: front/src/components/manage/users/InvitationsTable.vue:39 +#: front/src/components/manage/users/UsersTable.vue:43 +msgid "Status" +msgstr "Statut" + +#: front/src/components/radios/Button.vue:3 +msgid "Stop" +msgstr "Arrêter" + +#: front/src/components/Sidebar.vue:159 +msgid "Stop radio" +msgstr "Arrêter la radio" + +#: front/src/components/library/import/FileUpload.vue:32 +msgid "Stop Upload" +msgstr "Arrêter l'envoi" + +#: front/src/App.vue:9 src/components/requests/Form.vue:17 +msgid "Submit" +msgstr "Valider" + +#: front/src/components/requests/Form.vue:22 +msgid "Submit another request" +msgstr "Envoyer une nouvelle requête" + +#: front/src/components/library/import/BatchDetail.vue:26 +#: front/src/components/library/import/BatchList.vue:39 +msgid "Submitted by" +msgstr "Proposé par" + +#: front/src/views/admin/Settings.vue:85 +msgid "Subsonic" +msgstr "Subsonic" + +#: front/src/components/auth/SubsonicTokenForm.vue:2 +msgid "Subsonic API password" +msgstr "Mot de passe de l'API Subsonic" + +#: front/src/components/library/import/BatchDetail.vue:71 +#: front/src/components/library/import/BatchList.vue:16 +#: front/src/components/library/import/FileUpload.vue:56 +msgid "Success" +msgstr "Succès" + +#: front/src/App.vue:11 +msgid "Suggested choices" +msgstr "Suggestions" + +#: front/src/components/playlists/Editor.vue:9 +msgid "Syncing changes to server..." +msgstr "Synchronisation des changements avec le serveur..." + +#: front/src/components/Home.vue:26 +msgid "That's simple: we loved Grooveshark and we want to build something even better." +msgstr "C'est simple : nous adorions Grooveshark et nous voulions construire quelque chose d'encore mieux." + +#: front/src/components/requests/Form.vue:73 +msgid "The Beatles, Mickael Jackson…" +msgstr "Les Beatles, Mickael Jackson..." + +#: front/src/App.vue:59 +msgid "The funkwhale logo was kindly designed and provided by Francis Gading." +msgstr "Le logo de Funkwhale a été généreusement dessiné et fourni par Francis Gading." + +#: front/src/components/Home.vue:124 +msgid "The plaform is free and open-source, you can install it and modify it without worries" +msgstr "La plateforme est gratuite et open-source, vous pouvez l'installer et la modifier sans restrictions" + +#: front/src/components/auth/SubsonicTokenForm.vue:4 +msgid "The Subsonic API is not available on this Funkwhale instance." +msgstr "L'API Subsonic n'est pas disponible sur cette instance Funkwhale." + +#: front/src/components/requests/Form.vue:74 +msgid "The White Album, Thriller…" +msgstr "L'Album Blanc, Thriller..." + +#: front/src/components/audio/track/Table.vue:30 +msgid "There is currently no way to download directly multiple tracks from funkwhale as a ZIP archive. However, you can use a command line tools such as cURL to easily download a list of tracks." +msgstr "Il n'est pas possible pour le moment de télécharger un ensemble de pistes sous forme d'archive. Cependant, vous pouvez utiliser un outil en ligne de commande tel que cURL pour télécharger facilement une liste de pistes." + +#: front/src/components/library/import/Main.vue:149 +msgid "This import will be associated with the music request below. After the import is finished, the request will be marked as fulfilled." +msgstr "Cet import sera associé à la requête ci dessous. Une fois l'import terminé, la requête sera marquée comme complétée." + +#: front/src/views/federation/LibraryDetail.vue:195 +msgid "This indicate if the remote library granted you access" +msgstr "Ceci indique si la bibliothèque distance vous à accordé l'accès" + +#: front/src/components/auth/Profile.vue:16 +msgid "This is you!" +msgstr "C'est vous !" + +#: front/src/components/common/ActionTable.vue:37 +msgid "This may affect a lot of elements, please double check this is really what you want." +msgstr "Cette opération peut affecter de nombreux éléments, merci de vérifier que c'est bien ce que vous souhaitez." + +#: front/src/components/audio/PlayButton.vue:61 +msgid "This track is not imported and cannot be played" +msgstr "Cette piste n'est pas importée et ne peut pas être jouée" + +#: front/src/views/playlists/Detail.vue:37 +msgid "This will completely delete this playlist and cannot be undone." +msgstr "Cela supprimera définitivement cette playlist et ne pourra pas être annulé." + +#: front/src/views/radios/Detail.vue:27 +msgid "This will completely delete this radio and cannot be undone." +msgstr "Cela supprimera définitivement cette radio et ne pourra pas être annulé." + +#: front/src/components/auth/SubsonicTokenForm.vue:51 +msgid "This will completely disable access to the Subsonic API using from account." +msgstr "Cela désactivera complétement l'accès à l'API Subsonic depuis votre compte." + +#: front/src/App.vue:137 +msgid "This will erase your local data and disconnect you, do you want to continue?" +msgstr "Cela va effacer vos données locales et vous déconnecter, voulez-vous continuer ?" + +#: front/src/components/auth/SubsonicTokenForm.vue:36 +msgid "This will log you out from existing devices that use the current password." +msgstr "Cela vous déconnectera sur l'ensemble de vos appareils utilisant ce mot de passe." + +#: front/src/components/playlists/Editor.vue:44 +msgid "This will remove all tracks from this playlist and cannot be undone." +msgstr "Cela supprimera toutes les pistes de la playlist et ne pourra pas être annulé." + +#: front/src/components/audio/track/Table.vue:6 +#: front/src/components/federation/LibraryTrackTable.vue:47 +#: front/src/components/manage/library/FilesTable.vue:37 +msgid "Title" +msgstr "Titre" + +#: front/src/components/audio/SearchBar.vue:27 +#: src/components/library/Track.vue:174 +#: front/src/components/library/import/BatchDetail.vue:84 +#: front/src/components/metadata/Search.vue:138 +msgid "Track" +msgstr "Piste" + +#: front/src/components/library/Track.vue:53 +msgid "Track information" +msgstr "Information de la piste" + +#: front/src/components/library/radios/Filter.vue:44 +msgid "Track matching filter" +msgstr "Piste correspondant au filtre" + +#: front/src/components/instance/Stats.vue:54 +msgid "tracks" +msgstr "pistes" + +#: front/src/components/library/Album.vue:43 +#: front/src/components/playlists/PlaylistModal.vue:33 +#: front/src/views/federation/Base.vue:8 src/views/playlists/Detail.vue:50 +#: front/src/views/radios/Detail.vue:34 +msgid "Tracks" +msgstr "Pistes" + +#: front/src/views/federation/LibraryDetail.vue:125 +msgid "Tracks available in this library" +msgstr "Pistes disponibles dans cette bibliothèque" + +#: front/src/components/library/Artist.vue:54 +msgid "Tracks by this artist" +msgstr "Pistes par cet⋅te artiste" + +#: front/src/components/instance/Stats.vue:25 +msgid "Tracks favorited" +msgstr "Pistes en favoris" + +#: front/src/components/instance/Stats.vue:19 +msgid "tracks listened" +msgstr "pistes écoutées" + +#: front/src/views/federation/LibraryDetail.vue:109 +msgid "Trigger scan" +msgstr "Déclencher un scan" + +#: front/src/components/manage/library/FilesTable.vue:41 +msgid "Type" +msgstr "Type" + +#: front/src/components/About.vue:15 +msgid "Unfortunately, owners of this instance did not yet take the time to complete this page." +msgstr "Malheureusement, les gestionnaires de cette instance n'ont pas encore pris le temps de compléter cette page." + +#: front/src/views/federation/LibraryDetail.vue:95 +msgid "Unknown" +msgstr "Inconnu" + +#: front/src/components/Home.vue:37 +msgid "Unlimited music" +msgstr "Musique illimitée" + +#: front/src/components/audio/Player.vue:264 +msgid "Unmute" +msgstr "Réactiver le son" + +#: front/src/components/auth/Settings.vue:50 +msgid "Update avatar" +msgstr "Mettre à jour l'avatar" + +#: front/src/components/playlists/Form.vue:33 +msgid "Update playlist" +msgstr "Mettre à jour la playlist" + +#: front/src/components/auth/Settings.vue:27 +msgid "Update settings" +msgstr "Mettre à jour les paramètres" + +#: front/src/views/auth/PasswordResetConfirm.vue:21 +msgid "Update your password" +msgstr "Mettre à jour votre mot de passe" + +#: front/src/components/manage/users/UsersTable.vue:172 +#: front/src/views/admin/users/UsersDetail.vue:153 +msgid "Upload" +msgstr "Envoi" + +#: front/src/components/auth/Settings.vue:45 +msgid "Upload a new avatar" +msgstr "Envoyer un nouvel avatar" + +#: front/src/components/library/import/Main.vue:7 +msgid "Uploaded files or external source" +msgstr "Fichiers envoyés ou source externe" + +#: front/src/components/library/import/FileUpload.vue:57 +msgid "Uploading..." +msgstr "Envoi en cours..." + +#: front/src/App.vue:45 +msgid "Use another instance" +msgstr "Utiliser une autre instance" + +#: front/src/components/requests/Form.vue:75 +msgid "Use this comment box to add details to your request if needed" +msgstr "Utilisez ce champ pour ajouter des détails à votre demande, si nécessaire" + +#: front/src/views/federation/LibraryDetail.vue:196 +msgid "Use this flag to enable/disable federation with this library" +msgstr "Utilisez ce réglage pour activer/désactiver la fédération avec cette bibliothèque" + +#: front/src/views/auth/PasswordReset.vue:12 +msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password." +msgstr "Utilisez ce formulaire pour demander à réinitialiser votre mot de passe. Vous recevrez un email à l'adresse indiquée contenant les instructions de réinitialisation." + +#: front/src/components/federation/LibraryForm.vue:6 +msgid "Use this form to scan an instance and setup federation." +msgstr "Utilisez ce formulaire pour scanner le catalogue d'une instance et mettre en place la fédération." + +#: front/src/components/manage/users/InvitationsTable.vue:49 +msgid "Used" +msgstr "Utilisé" + +#: front/src/components/manage/library/RequestsTable.vue:47 +msgid "User" +msgstr "Utilisateur·rice" + +#: front/src/components/instance/Stats.vue:5 +msgid "User activity" +msgstr "Activité des utilisateur·ice·s" + +#: front/src/components/library/Radios.vue:20 +msgid "User radios" +msgstr "Radios des utilisateur·ice·s" + +#: front/src/components/auth/Signup.vue:19 +#: front/src/components/manage/users/UsersTable.vue:37 +msgid "Username" +msgstr "Nom d'utilisateur" + +#: front/src/components/auth/Login.vue:15 +msgid "Username or email" +msgstr "Nom d'utilisateur ou email" + +#: front/src/components/instance/Stats.vue:13 +msgid "users" +msgstr "tilisateur·ice·s" + +#: front/src/components/Sidebar.vue:103 src/views/admin/Settings.vue:81 +#: front/src/views/admin/users/Base.vue:5 src/views/admin/users/UsersList.vue:3 +#: front/src/views/admin/users/UsersList.vue:21 +msgid "Users" +msgstr "Utilisateur·ice·s" + +#: front/src/components/library/Album.vue:37 +#: src/components/library/Artist.vue:35 +#: front/src/components/library/Track.vue:44 +#: front/src/components/library/import/ArtistImport.vue:131 +#: front/src/components/metadata/ArtistCard.vue:49 +#: front/src/components/metadata/ReleaseCard.vue:53 +msgid "View on MusicBrainz" +msgstr "Voir sur MusicBrainz" + +#: front/src/components/playlists/PlaylistModal.vue:20 +msgid "We cannot add the track to a playlist" +msgstr "Nous ne pouvons pas ajouter cette piste à une playlist" + +#: front/src/components/playlists/Form.vue:14 +msgid "We cannot create the playlist" +msgstr "Nous ne pouvons pas créer cette playlist" + +#: front/src/components/auth/Signup.vue:13 +msgid "We cannot create your account" +msgstr "Nous ne pouvons pas créer votre compte" + +#: front/src/components/auth/Login.vue:7 +msgid "We cannot log you in" +msgstr "Erreur lors de la connexion" + +#: front/src/components/auth/Settings.vue:38 +msgid "We cannot save your avatar" +msgstr "Nous ne pouvons pas enregistrer votre avatar" + +#: front/src/components/auth/Settings.vue:14 +msgid "We cannot save your settings" +msgstr "Nous ne pouvons pas enregistrer vos paramètres" + +#: front/src/components/Home.vue:130 +msgid "We do not track you or bother you with ads" +msgstr "Nous ne vous pistons pas et ne vous exposons pas à des publicités" + +#: front/src/components/library/import/FileUpload.vue:5 +msgid "We recommend using Picard for that purpose." +msgstr "Nous recommandons d'utiliser le logiciel Picard pour cela." + +#: front/src/components/Home.vue:7 +msgid "We think listening to music should be simple." +msgstr "Nous pensons que l'accès à la musique devrait être simple." + +#: front/src/components/PageNotFound.vue:10 +msgid "We're sorry, the page you asked for does not exist:" +msgstr "Désolé, la page demandée n’existe pas :" + +#: front/src/components/requests/Form.vue:21 +msgid "We've received your request, you'll get some groove soon ;)" +msgstr "Nous avons bien reçu votre requête, vous aurez bientôt de nos nouvelles ;)" + +#: front/src/components/Home.vue:152 +msgid "Welcome" +msgstr "Bienvenue" + +#: front/src/components/Home.vue:5 +msgid "Welcome on Funkwhale" +msgstr "Bienvenue sur Funkwhale" + +#: front/src/components/library/import/Main.vue:114 +msgid "What is metadata?" +msgstr "Qu'est-ce que les métadonnées ?" + +#: front/src/views/federation/LibraryDetail.vue:197 +msgid "When enabled, auto importing will automatically import new tracks published in this library" +msgstr "Si ce réglage est activé, les nouvelles pistes ajoutées dans cette bibliothèque seront automatiquement importées" + +#: front/src/components/Home.vue:24 +msgid "Why funkwhale?" +msgstr "Pourquoi Funkwhale ?" + +#: front/src/components/Sidebar.vue:124 +msgid "Yes" +msgstr "Oui" + +#: front/src/components/auth/Logout.vue:8 +msgid "Yes, log me out!" +msgstr "Oui, déconnectez-moi !" + +#: front/src/components/auth/Logout.vue:7 +msgid "You are currently logged in as %{ username }" +msgstr "Vous êtes actuellement connecté·e en tant que %{ username }" + +#: front/src/components/library/import/Main.vue:111 +msgid "You can also skip this step and enter metadata manually." +msgstr "Vous pouvez également sauter cette étape et entrer les métadonnées manuellement." + +#: front/src/components/Home.vue:136 +msgid "You can invite friends and family to your instance so they can enjoy your music" +msgstr "Vous pouvez inviter vos ami·es et votre famille sur votre instance pour qu'ils·elles puissent profiter de votre musique" + +#: front/src/components/library/radios/Builder.vue:7 +msgid "You can use this interface to build your own custom radio, which will play tracks according to your criteria." +msgstr "Vous pouvez utiliser cette interface pour réaliser votre propre radio personnalisée, qui jouera les pistes correspondant aux critères indiqués." + +#: front/src/components/auth/SubsonicTokenForm.vue:8 +msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance." +msgstr "Vous pouvez les utiliser pour profiter de vos playlists et de votre musique en mode hors-ligne sur votre smatphone ou tablette, par exemple." + +#: front/src/components/Sidebar.vue:156 +msgid "You have a radio playing" +msgstr "Vous écoutez une radio" + +#: front/src/App.vue:6 +msgid "You need to select an instance in order to continue" +msgstr "Vous devez choisir une instance pour continuer" + +#: front/src/components/auth/Settings.vue:100 +msgid "You will be logged out from this session and have to log in with the new one" +msgstr "Vous allez être déconnecté⋅e de cette session et vous allez devoir vous connecter avec votre nouveau mot de passe" + +#: front/src/components/auth/Settings.vue:71 +msgid "You will have to update your password on your clients that use this password." +msgstr "Vous devrez mettre à jour votre mot de passe sur l'ensemble des clients utilisant ce mot de passe." + +#: front/src/components/library/import/Main.vue:103 +msgid "You will import:" +msgstr "Vous allez importer :" + +#: front/src/views/auth/EmailConfirm.vue:24 +msgid "Your email address was confirmed, you can now use the service without limitations." +msgstr "Votre adresse email a été confirmée, vous pouvez maintenant utiliser le service sans limitations." + +#: front/src/components/favorites/List.vue:109 +msgid "Your Favorites" +msgstr "Vos favoris" + +#: front/src/components/Home.vue:117 +msgid "Your music, your way" +msgstr "Votre musique, à votre façon" + +#: front/src/views/auth/PasswordResetConfirm.vue:29 +msgid "Your password has been updated successfully." +msgstr "Votre mot de passe a été mis à jour avec succès." + +#: front/src/components/auth/Settings.vue:101 +msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password" +msgstr "Votre mot de passe Subsonic sera remplacé par un nouveau mot de passe aléatoire, ce qui vous déconnectera de tous les appareils utilisant l'ancien mot de passe" + +#: front/src/components/audio/PlayButton.vue:156 +msgid "%{ count } track was added to your queue" +msgid_plural "%{ count } tracks were added to your queue" +msgstr[0] "%{ count } piste a été ajouté à votre queue" +msgstr[1] "%{ count } pistes ont été ajoutées à votre queue" diff --git a/front/locales/it/LC_MESSAGES/app.po b/front/locales/it/LC_MESSAGES/app.po new file mode 100644 index 000000000..4e37fb1cd --- /dev/null +++ b/front/locales/it/LC_MESSAGES/app.po @@ -0,0 +1,2461 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the front package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: front 1.0.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-07-22 14:12+0200\n" +"PO-Revision-Date: 2018-07-19 10:49+0000\n" +"Last-Translator: Sylke Vicious \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 2.20\n" + +#: front/src/components/playlists/PlaylistModal.vue:9 +msgid "\"%{ title }\", by %{ artist }" +msgstr "\"%{ title }\", di %{ artist }" + +#: front/src/components/Sidebar.vue:24 +msgid "(%{ index } of %{ length })" +msgstr "(%{ index } su %{ length })" + +#: front/src/components/Sidebar.vue:22 +msgid "(empty)" +msgstr "(vuoto)" + +#: front/src/components/common/ActionTable.vue:43 +#: front/src/components/common/ActionTable.vue:51 +msgid "%{ count } on %{ total } selected" +msgid_plural "%{ count } on %{ total } selected" +msgstr[0] "%{ count } su %{ total } selezionato" +msgstr[1] "%{ count } su %{ total } selezionati" + +#: front/src/components/Sidebar.vue:116 +#: src/views/federation/LibraryDetail.vue:87 +msgid "%{ count } track" +msgid_plural "%{ count } tracks" +msgstr[0] "%{ count } traccia" +msgstr[1] "%{ count } tracce" + +#: front/src/components/library/Artist.vue:13 +msgid "%{ count } track in %{ albumsCount } albums" +msgid_plural "%{ count } tracks in %{ albumsCount } albums" +msgstr[0] "%{ count } traccia in %{ albumsCount } album" +msgstr[1] "%{ count } tracce in %{ albumsCount } album" + +#: front/src/components/library/radios/Builder.vue:76 +msgid "%{ count } track matching combined filters" +msgid_plural "%{ count } tracks matching combined filters" +msgstr[0] "%{ count } traccia corrisponde ai filtri combinati" +msgstr[1] "%{ count } tracce corrispondono ai filtri combinati" + +#: front/src/components/playlists/Card.vue:18 +msgid "%{ count} track" +msgid_plural "%{ count } tracks" +msgstr[0] "%{ count} traccia" +msgstr[1] "%{ count} tracce" + +#: front/src/components/common/Duration.vue:2 +msgid "%{ hours } h %{ minutes } min" +msgstr "" + +#: front/src/components/common/Duration.vue:5 +msgid "%{ minutes } min" +msgstr "" + +#: front/src/components/activity/Like.vue:7 +msgid "%{ user } favorited a track" +msgstr "a %{ user } piace una traccia" + +#: front/src/components/activity/Listen.vue:7 +msgid "%{ user } listened to a track" +msgstr "%{ user } ha ascoltato una traccia" + +#: front/src/components/auth/Profile.vue:49 +msgid "%{ username }'s profile" +msgstr "Profilo di %{ username }" + +#: front/src/components/audio/artist/Card.vue:41 +msgid "1 album" +msgid_plural "%{ count } albums" +msgstr[0] "1 album" +msgstr[1] "%{ count } album" + +#: front/src/components/favorites/List.vue:10 +msgid "1 favorite" +msgid_plural "%{ count } favorites" +msgstr[0] "1 mi piace" +msgstr[1] "%{ count } mi piace" + +#: front/src/components/audio/album/Card.vue:54 +#: front/src/components/federation/LibraryCard.vue:25 +msgid "1 track" +msgid_plural "%{ count } tracks" +msgstr[0] "1 traccia" +msgstr[1] "%{ count } tracce" + +#: front/src/components/About.vue:5 +#, fuzzy +msgid "About %{ instance }" +msgstr "A proposito di questa istanza" + +#: front/src/App.vue:54 +msgid "About Funkwhale" +msgstr "A proposito di Funkwhale" + +#: front/src/App.vue:32 src/components/About.vue:8 src/components/About.vue:55 +msgid "About this instance" +msgstr "A proposito di questa istanza" + +#: front/src/components/manage/library/RequestsTable.vue:28 +#: front/src/components/manage/library/RequestsTable.vue:62 +msgid "Accepted" +msgstr "Accettato" + +#: front/src/components/auth/SubsonicTokenForm.vue:111 +msgid "Access disabled" +msgstr "Accesso disabilitato" + +#: front/src/components/Home.vue:109 +msgid "Access your music from a clean interface that focus on what really matters" +msgstr "Accedi alla tua musica da un'interfaccia pulita che si focalizza su quello che conta davvero" + +#: front/src/views/admin/users/UsersDetail.vue:54 +msgid "Account active" +msgstr "Account attivo" + +#: front/src/components/auth/Settings.vue:5 +msgid "Account settings" +msgstr "Impostazioni dell'account" + +#: front/src/components/auth/Settings.vue:257 +msgid "Account Settings" +msgstr "Impostazioni dell'account" + +#: front/src/components/manage/users/UsersTable.vue:39 +msgid "Account status" +msgstr "Stato dell'account" + +#: front/src/views/auth/PasswordReset.vue:14 +msgid "Account's email" +msgstr "Email dell'account" + +#: front/src/components/common/ActionTable.vue:82 +msgid "Action %{ action } was launched successfully on %{ count } element" +msgid_plural "Action %{ action } was launched successfully on %{ count } elements" +msgstr[0] "L'azione %{ action } è stata lanciata con successo su %{ count } elemento" +msgstr[1] "L'azione %{ action } è stata lanciata con successo su %{ count } elementi" + +#: front/src/components/common/ActionTable.vue:8 +#: front/src/components/federation/LibraryFollowTable.vue:24 +#: front/src/components/library/radios/Builder.vue:60 +#: front/src/components/manage/library/RequestsTable.vue:54 +msgid "Actions" +msgstr "Azioni" + +#: front/src/components/manage/users/UsersTable.vue:53 +#, fuzzy +msgid "Active" +msgstr "Attività" + +#: front/src/components/Sidebar.vue:60 +msgid "Activity" +msgstr "Attività" + +#: front/src/components/federation/LibraryFollowTable.vue:21 +msgid "Actor" +msgstr "" + +#: front/src/views/federation/LibraryList.vue:8 +msgid "Add a new library" +msgstr "Aggiungi una nuova libreria" + +#: front/src/components/library/radios/Builder.vue:46 +msgid "Add filter" +msgstr "Aggiungi filtro" + +#: front/src/components/library/radios/Builder.vue:36 +msgid "Add filters to customize your radio" +msgstr "Aggiungi filtri per personalizzare la tua radio" + +#: front/src/components/audio/PlayButton.vue:53 +msgid "Add to current queue" +msgstr "Aggiungi alla coda corrente" + +#: front/src/components/favorites/TrackFavoriteIcon.vue:4 +#: front/src/components/favorites/TrackFavoriteIcon.vue:21 +msgid "Add to favorites" +msgstr "Aggiungi ai preferiti" + +#: front/src/components/playlists/TrackPlaylistIcon.vue:6 +#: front/src/components/playlists/TrackPlaylistIcon.vue:32 +msgid "Add to playlist..." +msgstr "Aggiungi alla playlist..." + +#: front/src/components/audio/PlayButton.vue:14 +msgid "Add to queue" +msgstr "Aggiungi alla coda" + +#: front/src/components/playlists/PlaylistModal.vue:116 +msgid "Add to this playlist" +msgstr "Aggiungi a questa playlist" + +#: front/src/components/playlists/PlaylistModal.vue:54 +msgid "Add track" +msgstr "Aggiungi traccia" + +#: front/src/components/manage/users/UsersTable.vue:69 +msgid "Admin" +msgstr "Amministratore" + +#: front/src/components/Sidebar.vue:64 +msgid "Administration" +msgstr "Amministrazione" + +#: front/src/components/audio/SearchBar.vue:26 +#: src/components/audio/track/Table.vue:8 +#: front/src/components/federation/LibraryTrackTable.vue:49 +#: front/src/components/library/Album.vue:91 +#: front/src/components/manage/library/FilesTable.vue:39 +#: front/src/components/metadata/Search.vue:134 +msgid "Album" +msgstr "Album" + +#: front/src/components/library/import/ReleaseImport.vue:3 +msgid "Album %{ title } (%{ count } track) by %{ artist }" +msgid_plural "Album %{ title } (%{ count } tracks) by %{ artist }" +msgstr[0] "Album %{ title } (%{ count } traccia) di %{ artist }" +msgstr[1] "Album %{ title } (%{ count } tracce) di %{ artist }" + +#: front/src/components/library/Album.vue:12 +msgid "Album containing %{ count } track, by %{ artist }" +msgid_plural "Album containing %{ count } tracks, by %{ artist }" +msgstr[0] "Album contenente %{ count } traccia, di %{ artist }" +msgstr[1] "Album contenente %{ count } tracce, di %{ artist }" + +#: front/src/components/library/Track.vue:20 +msgid "Album page" +msgstr "Pagina dell'album" + +#: front/src/components/audio/Search.vue:19 +#: src/components/instance/Stats.vue:48 +#: front/src/components/manage/library/RequestsTable.vue:50 +#: front/src/components/requests/Form.vue:9 +msgid "Albums" +msgstr "Albums" + +#: front/src/components/library/Artist.vue:44 +msgid "Albums by this artist" +msgstr "Albums di questo artista" + +#: front/src/components/manage/library/RequestsTable.vue:26 +#: front/src/components/manage/users/InvitationsTable.vue:19 +msgid "All" +msgstr "Tutto" + +#: front/src/components/playlists/Editor.vue:13 +msgid "An error occured while saving your changes" +msgstr "C'è stato un errore durante il salvataggio delle tue modifiche" + +#: front/src/components/auth/Login.vue:10 +msgid "An unknown error happend, this can mean the server is down or cannot be reached" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:11 +#: front/src/components/library/import/BatchDetail.vue:68 +#: front/src/components/library/import/BatchList.vue:13 +#: front/src/components/library/import/BatchList.vue:22 +msgid "Any" +msgstr "Qualsiasi" + +#: front/src/components/library/import/BatchList.vue:24 +msgid "API" +msgstr "API" + +#: front/src/components/federation/LibraryFollowTable.vue:68 +#: front/src/components/federation/LibraryFollowTable.vue:78 +msgid "Approve" +msgstr "Approva" + +#: front/src/components/federation/LibraryFollowTable.vue:70 +msgid "Approve access?" +msgstr "Approvi l'accesso?" + +#: front/src/components/federation/LibraryFollowTable.vue:38 +msgid "Approved" +msgstr "Approvato" + +#: front/src/components/auth/Logout.vue:5 +msgid "Are you sure you want to log out?" +msgstr "Sei sicuro di volerti disconnettere?" + +#: front/src/components/audio/SearchBar.vue:25 +#: src/components/audio/track/Table.vue:7 +#: front/src/components/federation/LibraryTrackTable.vue:48 +#: front/src/components/library/Artist.vue:119 +#: front/src/components/manage/library/FilesTable.vue:38 +#: front/src/components/manage/library/RequestsTable.vue:49 +#: front/src/components/metadata/Search.vue:130 +msgid "Artist" +msgstr "Artista" + +#: front/src/components/requests/Form.vue:5 +msgid "Artist name" +msgstr "Nome dell'artista" + +#: front/src/components/library/Album.vue:22 +#: src/components/library/Track.vue:23 +msgid "Artist page" +msgstr "Pagina dell'artista" + +#: front/src/components/audio/Search.vue:65 +msgid "Artist, album, track..." +msgstr "Artista, album, traccia..." + +#: front/src/components/audio/Search.vue:10 +#: src/components/instance/Stats.vue:42 +#: front/src/components/library/Artists.vue:119 +#: src/components/library/Library.vue:7 +msgid "Artists" +msgstr "Artisti" + +#: front/src/components/favorites/List.vue:33 +#: front/src/components/federation/LibraryTrackTable.vue:28 +#: front/src/components/library/Artists.vue:25 +#: src/components/library/Radios.vue:44 +#: front/src/components/manage/library/FilesTable.vue:19 +#: front/src/components/manage/library/RequestsTable.vue:19 +#: front/src/components/manage/users/UsersTable.vue:19 +#: front/src/views/federation/LibraryList.vue:28 +#: src/views/playlists/List.vue:27 +msgid "Ascending" +msgstr "Crescente" + +#: front/src/views/auth/PasswordReset.vue:27 +msgid "Ask for a password reset" +msgstr "Chiedi un reset della password" + +#: front/src/views/federation/LibraryDetail.vue:56 +msgid "Auto importing" +msgstr "Auto importazione" + +#: front/src/components/playlists/PlaylistModal.vue:26 +msgid "Available playlists" +msgstr "Playlist disponibili" + +#: front/src/components/auth/Settings.vue:34 +msgid "Avatar" +msgstr "" + +#: front/src/views/auth/EmailConfirm.vue:17 src/views/auth/PasswordReset.vue:24 +#: front/src/views/auth/PasswordResetConfirm.vue:18 +msgid "Back to login" +msgstr "Torna alla pagina di accesso" + +#: front/src/views/federation/LibraryFollowersList.vue:5 +msgid "Be careful when accepting follow requests, as it means the follower will have access to your entire library." +msgstr "Fai attenzione quando accetti le richieste di seguirti, perchè significa che quell'utente avrà accesso a tutta la tua libreria." + +#: front/src/components/library/Track.vue:80 +#: front/src/components/manage/library/FilesTable.vue:42 +msgid "Bitrate" +msgstr "Bitrate" + +#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4 +msgid "Browse" +msgstr "Sfoglia" + +#: front/src/components/Sidebar.vue:50 +msgid "Browse library" +msgstr "Sfoglia libreria" + +#: front/src/components/library/Artists.vue:4 +msgid "Browsing artists" +msgstr "Sfogliando artisti" + +#: front/src/views/federation/LibraryTrackList.vue:3 +msgid "Browsing federated tracks" +msgstr "Sfogliando tracce federate" + +#: front/src/views/federation/LibraryFollowersList.vue:3 +msgid "Browsing followers" +msgstr "Sfogliando followers" + +#: front/src/views/federation/LibraryList.vue:3 +msgid "Browsing libraries" +msgstr "Sfogliando librerie" + +#: front/src/views/playlists/List.vue:3 +msgid "Browsing playlists" +msgstr "Sfogliando playlists" + +#: front/src/components/library/Radios.vue:4 +msgid "Browsing radios" +msgstr "Sfogliando radio" + +#: front/src/components/library/radios/Builder.vue:5 +msgid "Builder" +msgstr "Crea" + +#: front/src/components/audio/album/Card.vue:13 +msgid "By %{ artist }" +msgstr "Di %{ artist }" + +#: front/src/components/federation/LibraryFollowTable.vue:57 +msgid "By confirming, %{ username } will be denied access to your library." +msgstr "Confermando, a %{ username } sarà negato l'accesso alla tua libreria." + +#: front/src/components/federation/LibraryFollowTable.vue:73 +msgid "By confirming, %{ username } will be granted access to your library." +msgstr "Confermando, a %{ username } sarà consentito l'accesso alla tua libreria." + +#: front/src/components/audio/track/Table.vue:43 +#: front/src/components/common/DangerousButton.vue:17 +#: front/src/components/library/radios/Filter.vue:53 +#: front/src/components/playlists/PlaylistModal.vue:63 +msgid "Cancel" +msgstr "Annulla" + +#: front/src/components/library/radios/Builder.vue:59 +msgid "Candidates" +msgstr "Candidati" + +#: front/src/components/auth/Settings.vue:76 +msgid "Cannot change your password" +msgstr "Non puoi cambiare la tua password" + +#: front/src/App.vue:66 +msgid "Change language" +msgstr "" + +#: front/src/components/auth/Settings.vue:67 +msgid "Change my password" +msgstr "Cambia la mia password" + +#: front/src/components/auth/Settings.vue:95 +msgid "Change password" +msgstr "Cambia password" + +#: front/src/views/auth/PasswordResetConfirm.vue:4 +#: front/src/views/auth/PasswordResetConfirm.vue:62 +msgid "Change your password" +msgstr "Cambia la tua password" + +#: front/src/components/auth/Settings.vue:96 +msgid "Change your password?" +msgstr "Cambiare la tua password?" + +#: front/src/components/playlists/Editor.vue:21 +msgid "Changes synced with server" +msgstr "Modifiche sincronizzate con il server" + +#: front/src/components/auth/Settings.vue:70 +msgid "Changing your password will also change your Subsonic API password if you have requested one." +msgstr "Cambiando la tua password cambierà anche la password della API Subsonic se ne hai richiesta una." + +#: front/src/components/auth/Settings.vue:98 +msgid "Changing your password will have the following consequences" +msgstr "Cambiare la tua password avrà queste conseguenze" + +#: front/src/App.vue:4 +msgid "Choose your instance" +msgstr "Scegli la tua istanza" + +#: front/src/components/Home.vue:64 +msgid "Clean library" +msgstr "Pulisci libreria" + +#: front/src/components/manage/users/InvitationForm.vue:37 +msgid "Clear" +msgstr "Pulisci" + +#: front/src/components/playlists/Editor.vue:40 +#: front/src/components/playlists/Editor.vue:45 +msgid "Clear playlist" +msgstr "Pulisci playlist" + +#: front/src/components/audio/Player.vue:270 +msgid "Clear your queue" +msgstr "Pulisci la tua coda" + +#: front/src/components/library/import/BatchList.vue:23 +msgid "CLI" +msgstr "CLI" + +#: front/src/components/Home.vue:44 +msgid "Click once, listen for hours using built-in radios" +msgstr "Clicca una volta, ascolta per ore utilizzando le radio integrate" + +#: front/src/components/manage/library/RequestsTable.vue:30 +#: front/src/components/manage/library/RequestsTable.vue:64 +msgid "Closed" +msgstr "Chiuso" + +#: front/src/components/manage/users/InvitationForm.vue:26 +#: front/src/components/manage/users/InvitationsTable.vue:42 +msgid "Code" +msgstr "Codice" + +#: front/src/components/audio/album/Card.vue:43 +#: front/src/components/audio/artist/Card.vue:33 +#: front/src/components/discussion/Comment.vue:20 +msgid "Collapse" +msgstr "Riduci" + +#: front/src/components/manage/library/RequestsTable.vue:51 +#: front/src/components/requests/Form.vue:14 +msgid "Comment" +msgstr "Commenta" + +#: front/src/components/library/radios/Builder.vue:58 +msgid "Config" +msgstr "Configurazione" + +#: front/src/components/common/DangerousButton.vue:21 +msgid "Confirm" +msgstr "Conferma" + +#: front/src/views/auth/EmailConfirm.vue:4 src/views/auth/EmailConfirm.vue:20 +#: front/src/views/auth/EmailConfirm.vue:51 +msgid "Confirm your email" +msgstr "Conferma la tua email" + +#: front/src/views/auth/EmailConfirm.vue:13 +msgid "Confirmation code" +msgstr "Codice di conferma" + +#: front/src/components/playlists/Editor.vue:163 +msgid "Copy tracks from current queue to playlist" +msgstr "Copia tracce dalla tua coda corrente alla playlist" + +#: front/src/components/Home.vue:88 +msgid "Covers, lyrics, our goal is to have them all ;)" +msgstr "Copertine, testi, il nostro obbiettivo è averli tutti ;)" + +#: front/src/components/auth/Signup.vue:4 +msgid "Create a funkwhale account" +msgstr "Crea un account funkwhale" + +#: front/src/components/playlists/Form.vue:2 +msgid "Create a new playlist" +msgstr "Crea una nuova playlist" + +#: front/src/components/auth/Login.vue:17 +msgid "Create an account" +msgstr "Crea un account" + +#: front/src/components/manage/library/RequestsTable.vue:88 +#: front/src/components/requests/Card.vue:25 +msgid "Create import" +msgstr "Crea importazione" + +#: front/src/components/auth/Signup.vue:51 +msgid "Create my account" +msgstr "Crea il mio account" + +#: front/src/components/playlists/Form.vue:34 +msgid "Create playlist" +msgstr "Crea playlist" + +#: front/src/components/library/Radios.vue:23 +msgid "Create your own radio" +msgstr "Crea la tua radio" + +#: front/src/components/federation/LibraryFollowTable.vue:22 +#: front/src/components/manage/library/RequestsTable.vue:52 +#: front/src/components/manage/users/InvitationsTable.vue:40 +msgid "Creation date" +msgstr "Data di creazione" + +#: front/src/components/auth/Settings.vue:54 +#, fuzzy +msgid "Current avatar" +msgstr "Traccia corrente" + +#: front/src/components/playlists/PlaylistModal.vue:8 +msgid "Current track" +msgstr "Traccia corrente" + +#: front/src/components/manage/library/FilesTable.vue:189 +#: front/src/components/manage/library/RequestsTable.vue:195 +#: front/src/components/manage/users/InvitationsTable.vue:166 +#: front/src/views/playlists/Detail.vue:33 +msgid "Delete" +msgstr "Elimina" + +#: front/src/views/playlists/Detail.vue:38 +msgid "Delete playlist" +msgstr "Elimina playlist" + +#: front/src/views/radios/Detail.vue:28 +msgid "Delete radio" +msgstr "Elimina radio" + +#: front/src/components/federation/LibraryFollowTable.vue:52 +#: front/src/components/federation/LibraryFollowTable.vue:63 +msgid "Deny" +msgstr "Nega" + +#: front/src/components/federation/LibraryFollowTable.vue:54 +msgid "Deny access?" +msgstr "Negare accesso?" + +#: front/src/components/favorites/List.vue:34 +#: front/src/components/federation/LibraryTrackTable.vue:29 +#: front/src/components/library/Artists.vue:26 +#: src/components/library/Radios.vue:47 +#: front/src/components/manage/library/FilesTable.vue:20 +#: front/src/components/manage/library/RequestsTable.vue:20 +#: front/src/components/manage/users/UsersTable.vue:20 +#: front/src/views/federation/LibraryList.vue:29 +#: src/views/playlists/List.vue:28 +msgid "Descending" +msgstr "Decrescente" + +#: front/src/components/federation/LibraryCard.vue:50 +msgid "Detail" +msgstr "Dettaglio" + +#: front/src/views/admin/users/UsersDetail.vue:146 +#, fuzzy +msgid "Determine if the user account is active or not. Inactive users cannot login or use the service." +msgstr "Determina se un account utente è attivo o meno. Gli utenti inattivi non possono accedere o utilizzare il servizio." + +#: front/src/components/auth/Settings.vue:104 +#: front/src/components/auth/SubsonicTokenForm.vue:52 +msgid "Disable access" +msgstr "Disabilita accesso" + +#: front/src/components/auth/SubsonicTokenForm.vue:49 +msgid "Disable Subsonic access" +msgstr "Disabilita accesso Subsonic" + +#: front/src/components/auth/SubsonicTokenForm.vue:50 +msgid "Disable Subsonic API access?" +msgstr "Disabilitare l'accesso alle API Subsonic?" + +#: front/src/components/auth/SubsonicTokenForm.vue:14 +msgid "Discover how to use Funkwhale from other apps" +msgstr "Scopri come utilizzare Funkwhale attraverso altre app" + +#: front/src/components/library/radios/Builder.vue:26 +msgid "Display publicly" +msgstr "Mostra pubblicamente" + +#: front/src/components/playlists/Editor.vue:42 +msgid "Do you want to clear the playlist \"%{ playlist }\"?" +msgstr "Vuoi pulire la playlist \"%{ playlist }\"?" + +#: front/src/components/common/DangerousButton.vue:7 +msgid "Do you want to confirm this action?" +msgstr "Vuoi confermare questa azione?" + +#: front/src/views/playlists/Detail.vue:35 +msgid "Do you want to delete the playlist \"%{ playlist }\"?" +msgstr "Vuoi eliminare la playlist \"%{ playlist }\"?" + +#: front/src/views/radios/Detail.vue:26 +#, fuzzy +msgid "Do you want to delete the radio \"%{ radio }\"?" +msgstr "Vuoi eliminare la radio \"{{ radio }}\"?" + +#: front/src/components/common/ActionTable.vue:29 +msgid "Do you want to launch %{ action } on %{ count } element?" +msgid_plural "Do you want to launch %{ action } on %{ count } elements?" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/Sidebar.vue:113 +msgid "Do you want to restore your previous queue?" +msgstr "Vuoi ripristinare la tua coda precedente?" + +#: front/src/App.vue:38 +msgid "Documentation" +msgstr "Documentazione" + +#: front/src/components/audio/track/Table.vue:24 +#: src/components/library/Track.vue:48 +msgid "Download" +msgstr "Scarica" + +#: front/src/components/audio/track/Table.vue:27 +#, fuzzy +msgid "Download tracks" +msgstr "Scarica" + +#: front/src/components/playlists/Editor.vue:49 +msgid "Drag and drop rows to reorder tracks in the playlist" +msgstr "Trascina e rilascia righe per riordinare le tracce nella playlist" + +#: front/src/components/library/Track.vue:58 +#: front/src/components/manage/library/FilesTable.vue:43 +msgid "Duration" +msgstr "Durata" + +#: front/src/components/Home.vue:96 +msgid "Easy to use" +msgstr "Facile da utilizzare" + +#: front/src/components/About.vue:21 +msgid "Edit instance info" +msgstr "Modifica le info dell'istanza" + +#: front/src/components/radios/Card.vue:20 src/views/playlists/Detail.vue:30 +msgid "Edit..." +msgstr "Modifica..." + +#: front/src/components/auth/Signup.vue:29 +#: front/src/components/manage/users/UsersTable.vue:38 +msgid "Email" +msgstr "Email" + +#: front/src/views/admin/users/UsersDetail.vue:29 +msgid "Email address" +msgstr "Indirizzo email" + +#: front/src/views/auth/EmailConfirm.vue:23 +msgid "Email confirmed" +msgstr "Email confermata" + +#: front/src/views/playlists/Detail.vue:29 +msgid "End edition" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:4 +msgid "Ensure your music files are properly tagged before uploading them." +msgstr "Assicurati che i tuoi files musicali siano taggati in modo corretto prima di caricarli." + +#: front/src/components/library/Radios.vue:140 +msgid "Enter a radio name..." +msgstr "Inserisci un nome di una radio..." + +#: front/src/components/library/Artists.vue:118 +msgid "Enter an artist name..." +msgstr "Inserisci il nome di un artista..." + +#: front/src/views/federation/LibraryList.vue:122 +msgid "Enter an library domain name..." +msgstr "Inserisci il nome del dominio di una libreria..." + +#: front/src/views/playlists/List.vue:104 +msgid "Enter an playlist name..." +msgstr "Inserisci il nome di una playlist..." + +#: front/src/components/auth/Signup.vue:98 +msgid "Enter your email" +msgstr "Inserisci la tua email" + +#: front/src/components/auth/Signup.vue:96 +msgid "Enter your invitation code (case insensitive)" +msgstr "Inserisci il tuo codice di invito (non tiene conto di maiuscole o minuscole)" + +#: front/src/components/metadata/Search.vue:114 +msgid "Enter your search query..." +msgstr "Inserisci i tuoi criteri di ricerca..." + +#: front/src/components/auth/Signup.vue:97 +msgid "Enter your username" +msgstr "Inserisci il tuo nome utente" + +#: front/src/components/auth/Login.vue:77 +msgid "Enter your username or email" +msgstr "Inserisci il tuo nome utente o l'email" + +#: front/src/components/auth/SubsonicTokenForm.vue:20 +msgid "Error" +msgstr "Errore" + +#: front/src/views/admin/Settings.vue:87 +msgid "Error reporting" +msgstr "Segnalazione errore" + +#: front/src/components/common/ActionTable.vue:75 +msgid "Error while applying action" +msgstr "Errore durante l'esecuzione dell'azione" + +#: front/src/views/auth/PasswordReset.vue:7 +msgid "Error while asking for a password reset" +msgstr "Errore durante la richiesta di un reset della password" + +#: front/src/views/auth/PasswordResetConfirm.vue:7 +msgid "Error while changing your password" +msgstr "Errore durante la modifica della password" + +#: front/src/views/auth/EmailConfirm.vue:7 +msgid "Error while confirming your email" +msgstr "Errore durante la conferma della tua email" + +#: front/src/components/manage/users/InvitationForm.vue:4 +msgid "Error while creating invitation" +msgstr "Errore durante la creazione dell'invito" + +#: front/src/components/admin/SettingsGroup.vue:5 +msgid "Error while saving settings" +msgstr "Errore durante il salvataggio delle impostazioni" + +#: front/src/components/federation/LibraryForm.vue:10 +msgid "Error while scanning library" +msgstr "Errore durante la scansione della libreria" + +#: front/src/components/library/import/BatchDetail.vue:41 +#: front/src/components/library/import/BatchDetail.vue:70 +#: front/src/components/library/import/BatchList.vue:15 +msgid "Errored" +msgstr "" + +#: front/src/components/playlists/Form.vue:89 +msgid "Everyone" +msgstr "Tutti" + +#: front/src/components/playlists/Form.vue:85 +msgid "Everyone on this instance" +msgstr "Tutti su questa istanza" + +#: front/src/components/library/radios/Builder.vue:57 +msgid "Exclude" +msgstr "Escludi" + +#: front/src/components/discussion/Comment.vue:14 +msgid "Expand" +msgstr "Espandi" + +#: front/src/components/manage/users/InvitationsTable.vue:41 +msgid "Expiration date" +msgstr "Data di scadenza" + +#: front/src/components/manage/users/InvitationsTable.vue:50 +msgid "Expired" +msgstr "Scaduto" + +#: front/src/components/manage/users/InvitationsTable.vue:21 +msgid "Expired/used" +msgstr "Scaduto/utilizzato" + +#: front/src/components/library/import/Main.vue:65 +msgid "External source. Supported backends" +msgstr "Sorgente esterna. Supporta backends" + +#: front/src/components/Sidebar.vue:51 +msgid "Favorites" +msgstr "Preferiti" + +#: front/src/components/federation/LibraryForm.vue:3 +msgid "Federate with a new instance" +msgstr "Unisciti ad una nuova istanza" + +#: front/src/views/federation/LibraryTrackList.vue:21 +msgid "Federated tracks" +msgstr "Tracce federate" + +#: front/src/components/Sidebar.vue:87 +#: src/components/library/import/BatchList.vue:25 +#: front/src/components/manage/users/UsersTable.vue:180 +#: front/src/views/admin/Settings.vue:84 +#: src/views/admin/users/UsersDetail.vue:161 +#: front/src/views/federation/Base.vue:35 +#: src/views/federation/LibraryDetail.vue:40 +msgid "Federation" +msgstr "Federazione" + +#: front/src/views/federation/LibraryDetail.vue:3 +msgid "File mirroring" +msgstr "Mirroring dei file" + +#: front/src/components/library/import/FileUpload.vue:43 +msgid "File name" +msgstr "Nome file" + +#: front/src/components/library/import/Main.vue:76 +msgid "File upload" +msgstr "Carica file" + +#: front/src/views/admin/library/Base.vue:5 +#: src/views/admin/library/FilesList.vue:21 +msgid "Files" +msgstr "Files" + +#: front/src/components/library/import/ArtistImport.vue:7 +msgid "Filter album types" +msgstr "Filtra tipi di album" + +#: front/src/components/library/radios/Builder.vue:56 +msgid "Filter name" +msgstr "Filtra nome" + +#: front/src/components/library/import/Main.vue:52 +msgid "Finish import" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:54 +msgid "Finished" +msgstr "Finito" + +#: front/src/components/library/import/Main.vue:59 +msgid "First, choose where you want to import the music from" +msgstr "Prima, scegli da dove vuoi importare la musica" + +#: front/src/components/federation/LibraryCard.vue:44 +msgid "Follow" +msgstr "Segui" + +#: front/src/components/federation/LibraryCard.vue:36 +msgid "Follow request pending approval" +msgstr "Richiesta di seguire in attesa di approvazione" + +#: front/src/views/federation/LibraryDetail.vue:21 +msgid "Follow status" +msgstr "Stato di segui" + +#: front/src/views/federation/Base.vue:13 +#: front/src/views/federation/LibraryFollowersList.vue:24 +msgid "Followers" +msgstr "Seguito da" + +#: front/src/components/federation/LibraryCard.vue:18 +msgid "Followers only" +msgstr "Solo chi segue" + +#: front/src/components/federation/LibraryCard.vue:15 +#: front/src/views/federation/LibraryDetail.vue:29 +msgid "Following" +msgstr "" + +#: front/src/components/activity/Like.vue:12 +#: src/components/activity/Listen.vue:12 +msgid "from %{ album } by %{ artist }" +msgstr "da %{ album } di %{ artist }" + +#: front/src/components/library/Track.vue:13 +msgid "From album %{ album } by %{ artist }" +msgstr "Dall'album %{ album } di %{ artist }" + +#: front/src/App.vue:56 +msgid "Funkwhale is a free and open-source project run by volunteers. You can help us improve the platform by reporting bugs, suggesting features and share the project with your friends!" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:7 +msgid "Funkwhale is compatible with other music players that support the Subsonic API." +msgstr "" + +#: front/src/components/Home.vue:98 +msgid "Funkwhale is dead simple to use." +msgstr "Funkwhale è semplicissimo da usare." + +#: front/src/components/Home.vue:39 +msgid "Funkwhale is designed to make it easy to listen to music you like, or to discover new artists." +msgstr "" + +#: front/src/components/Home.vue:119 +msgid "Funkwhale is free and gives you control on your music." +msgstr "" + +#: front/src/components/Home.vue:66 +msgid "Funkwhale takes care of handling your music" +msgstr "" + +#: front/src/components/manage/users/InvitationForm.vue:16 +msgid "Get a new invitation" +msgstr "Ottieni un nuovo invito" + +#: front/src/components/Home.vue:13 +msgid "Get me to the library" +msgstr "Portami alla libreria" + +#: front/src/components/Home.vue:77 +msgid "" +"Get quality metadata about your music thanks to\n" +" \n" +" MusicBrainz\n" +" " +msgstr "" + +#: front/src/components/common/ActionTable.vue:21 +#: front/src/components/common/ActionTable.vue:27 +msgid "Go" +msgstr "Vai" + +#: front/src/components/PageNotFound.vue:14 +msgid "Go to home page" +msgstr "Vai alla pagina iniziale" + +#: front/src/components/library/import/Main.vue:13 +msgid "Grab corresponding metadata" +msgstr "" + +#: front/src/App.vue:74 +msgid "Help us translate Funkwhale" +msgstr "" + +#: front/src/components/library/Home.vue:65 +msgid "Home" +msgstr "Pagina Iniziale" + +#: front/src/components/instance/Stats.vue:36 +msgid "Hours of music" +msgstr "Ore di musica" + +#: front/src/components/auth/SubsonicTokenForm.vue:11 +msgid "However, accessing Funkwhale from those clients require a separate password you can set below." +msgstr "" + +#: front/src/components/library/import/BatchList.vue:34 +msgid "ID" +msgstr "" + +#: front/src/views/auth/PasswordResetConfirm.vue:24 +msgid "If the email address provided in the previous step is valid and binded to a user account, you should receive an email with reset instructions in the next couple of minutes." +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:196 +#: front/src/components/library/Library.vue:17 +msgid "Import" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:57 +msgid "Import #%{ id } launched" +msgstr "" + +#: front/src/components/library/import/Main.vue:38 +msgid "Import %{ count } track" +msgid_plural "Import %{ count } tracks" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/library/import/BatchDetail.vue:10 +msgid "Import batch" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:185 +msgid "Import Batch #%{ id }" +msgstr "" + +#: front/src/components/library/Library.vue:20 +msgid "Import batches" +msgstr "" + +#: front/src/components/library/import/BatchList.vue:117 +msgid "Import Batches" +msgstr "" + +#: front/src/components/manage/library/FilesTable.vue:40 +#: front/src/components/manage/library/RequestsTable.vue:53 +msgid "Import date" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:38 +msgid "Import detail page" +msgstr "" + +#: front/src/components/Sidebar.vue:81 +msgid "Import music" +msgstr "" + +#: front/src/components/library/import/Main.vue:267 +msgid "Import Music" +msgstr "" + +#: front/src/components/Home.vue:71 +msgid "Import music from various platforms, such as YouTube or SoundCloud" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:14 +#: front/src/components/federation/LibraryTrackTable.vue:66 +msgid "Import pending" +msgstr "" + +#: front/src/views/admin/library/Base.vue:9 +#: front/src/views/admin/library/RequestsList.vue:3 +#: front/src/views/admin/library/RequestsList.vue:21 +msgid "Import requests" +msgstr "" + +#: front/src/components/library/import/BatchList.vue:20 +#: front/src/components/library/import/Main.vue:6 +msgid "Import source" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:9 +msgid "Import status" +msgstr "" + +#: front/src/components/library/import/ReleaseImport.vue:14 +msgid "Import this release" +msgstr "" + +#: front/src/components/library/import/TrackImport.vue:11 +msgid "Import this track" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:12 +#: front/src/components/manage/library/RequestsTable.vue:29 +#: front/src/components/manage/library/RequestsTable.vue:61 +msgid "Imported" +msgstr "" + +#: front/src/components/library/import/TrackImport.vue:44 +msgid "Imported URL" +msgstr "" + +#: front/src/views/admin/Settings.vue:82 +msgid "Imports" +msgstr "" + +#: front/src/components/favorites/TrackFavoriteIcon.vue:3 +msgid "In favorites" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:65 +msgid "In library" +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:54 +msgid "Inactive" +msgstr "" + +#: front/src/components/library/import/Main.vue:96 +msgid "Input a MusicBrainz ID manually:" +msgstr "" + +#: front/src/views/auth/PasswordReset.vue:53 +msgid "Input the email address binded to your account" +msgstr "" + +#: front/src/components/playlists/Editor.vue:31 +msgid "Insert from queue (%{ count } track)" +msgid_plural "Insert from queue (%{ count } tracks)" +msgstr[0] "" +msgstr[1] "" + +#: front/src/views/admin/Settings.vue:80 +msgid "Instance information" +msgstr "" + +#: front/src/components/library/Radios.vue:9 +#, fuzzy +msgid "Instance radios" +msgstr "Modifica le info dell'istanza" + +#: front/src/views/admin/Settings.vue:75 +msgid "Instance settings" +msgstr "" + +#: front/src/views/instance/Timeline.vue:57 +msgid "Instance Timeline" +msgstr "" + +#: front/src/components/auth/Signup.vue:42 +#: front/src/components/manage/users/InvitationForm.vue:11 +msgid "Invitation code" +msgstr "" + +#: front/src/components/auth/Signup.vue:43 +msgid "Invitation code (optional)" +msgstr "" + +#: front/src/views/admin/users/Base.vue:8 +#: src/views/admin/users/InvitationsList.vue:3 +#: front/src/views/admin/users/InvitationsList.vue:24 +msgid "Invitations" +msgstr "" + +#: front/src/App.vue:43 +msgid "Issue tracker" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:80 +msgid "Job ID" +msgstr "" + +#: front/src/components/library/import/BatchList.vue:36 +msgid "Jobs" +msgstr "" + +#: front/src/components/Home.vue:50 +msgid "Keep a track of your favorite songs" +msgstr "" + +#: front/src/components/audio/track/Table.vue:33 +msgid "Keep your PRIVATE_TOKEN secret as it gives access to your account." +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:41 +#: front/src/views/admin/users/UsersDetail.vue:45 +msgid "Last activity" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:101 +msgid "Last fetched" +msgstr "" + +#: front/src/components/playlists/PlaylistModal.vue:32 +msgid "Last modification" +msgstr "" + +#: front/src/components/common/ActionTable.vue:39 +msgid "Launch" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:18 +#: front/src/components/library/import/BatchList.vue:35 +msgid "Launch date" +msgstr "" + +#: front/src/components/federation/LibraryForm.vue:31 +msgid "Launch scan" +msgstr "" + +#: front/src/components/Home.vue:10 +msgid "Learn more about this instance" +msgstr "" + +#: front/src/components/manage/users/InvitationForm.vue:58 +msgid "Leave empty for a random code" +msgstr "" + +#: front/src/components/requests/Form.vue:10 +msgid "Leave this field empty if you're requesting the whole discography." +msgstr "" + +#: front/src/views/federation/Base.vue:5 +#: src/views/federation/LibraryList.vue:123 +msgid "Libraries" +msgstr "" + +#: front/src/components/Sidebar.vue:70 +#: front/src/components/federation/LibraryTrackTable.vue:51 +#: front/src/components/instance/Stats.vue:30 +#: front/src/components/manage/users/UsersTable.vue:176 +#: front/src/views/admin/users/UsersDetail.vue:157 +#: front/src/views/federation/LibraryDetail.vue:194 +msgid "Library" +msgstr "" + +#: front/src/views/admin/library/FilesList.vue:3 +msgid "Library files" +msgstr "" + +#: front/src/components/federation/LibraryForm.vue:20 +msgid "Library name" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:84 +msgid "Library size" +msgstr "" + +#: front/src/components/federation/LibraryForm.vue:96 +msgid "library@demo.funkwhale.audio" +msgstr "" + +#: front/src/App.vue:29 +msgid "Links" +msgstr "" + +#: front/src/views/instance/Timeline.vue:4 +msgid "Loading timeline..." +msgstr "" + +#: front/src/components/favorites/List.vue:5 +msgid "Loading your favorites..." +msgstr "" + +#: front/src/components/auth/Login.vue:78 +msgid "Log In" +msgstr "" + +#: front/src/components/auth/Login.vue:4 +msgid "Log in to your Funkwhale account" +msgstr "" + +#: front/src/components/auth/Logout.vue:20 +msgid "Log Out" +msgstr "" + +#: front/src/components/Sidebar.vue:38 +msgid "Logged in as %{ username }" +msgstr "" + +#: front/src/components/Sidebar.vue:44 src/components/auth/Login.vue:41 +msgid "Login" +msgstr "" + +#: front/src/components/Sidebar.vue:43 +msgid "Logout" +msgstr "" + +#: front/src/components/audio/Player.vue:266 +msgid "Looping disabled. Click to switch to single-track looping." +msgstr "" + +#: front/src/components/audio/Player.vue:267 +msgid "Looping on a single track. Click to switch to whole queue looping." +msgstr "" + +#: front/src/components/audio/Player.vue:268 +msgid "Looping on whole queue. Click to disable looping." +msgstr "" + +#: front/src/components/library/Track.vue:94 +msgid "Lyrics" +msgstr "" + +#: front/src/views/admin/library/Base.vue:25 +msgid "Manage library" +msgstr "" + +#: front/src/components/playlists/PlaylistModal.vue:3 +msgid "Manage playlists" +msgstr "" + +#: front/src/views/admin/users/Base.vue:20 +msgid "Manage users" +msgstr "" + +#: front/src/views/playlists/List.vue:8 +msgid "Manage your playlists" +msgstr "" + +#: front/src/components/manage/library/RequestsTable.vue:197 +msgid "Mark as closed" +msgstr "" + +#: front/src/components/manage/library/RequestsTable.vue:196 +msgid "Mark as imported" +msgstr "" + +#: front/src/components/library/import/Main.vue:12 +msgid "Metadata" +msgstr "" + +#: front/src/components/library/import/Main.vue:115 +msgid "" +"Metadata is the data related to the music you want to import. This includes all the information about the artists, albums and tracks. In order to have a high quality library, it is recommended to grab data from the\n" +" \n" +" MusicBrainz\n" +" \n" +" project, which you can think about as the Wikipedia of music." +msgstr "" + +#: front/src/components/Sidebar.vue:48 +#: src/components/library/import/Main.vue:18 +msgid "Music" +msgstr "" + +#: front/src/components/library/import/Main.vue:147 +msgid "Music request" +msgstr "" + +#: front/src/components/audio/Player.vue:265 +msgid "Mute" +msgstr "" + +#: front/src/components/Sidebar.vue:34 +msgid "My account" +msgstr "" + +#: front/src/components/playlists/Form.vue:74 +msgid "My awesome playlist" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:227 +msgid "My awesome radio" +msgstr "" + +#: front/src/components/library/Track.vue:64 +#: src/components/library/Track.vue:75 +#: front/src/components/library/Track.vue:86 +#: front/src/components/manage/library/FilesTable.vue:63 +#: front/src/components/manage/library/FilesTable.vue:69 +#: front/src/components/manage/library/FilesTable.vue:75 +#: front/src/components/manage/library/FilesTable.vue:81 +#: front/src/components/manage/library/RequestsTable.vue:71 +#: front/src/components/manage/library/RequestsTable.vue:75 +#: front/src/components/manage/library/RequestsTable.vue:82 +#: front/src/components/manage/users/UsersTable.vue:61 +#: front/src/views/admin/users/UsersDetail.vue:49 +msgid "N/A" +msgstr "" + +#: front/src/components/playlists/PlaylistModal.vue:31 +#: front/src/views/admin/users/UsersDetail.vue:21 +msgid "Name" +msgstr "" + +#: front/src/components/auth/Settings.vue:88 +#: front/src/views/auth/PasswordResetConfirm.vue:14 +msgid "New password" +msgstr "" + +#: front/src/components/Sidebar.vue:158 +msgid "New tracks will be appended here automatically." +msgstr "" + +#: front/src/components/library/import/Main.vue:29 +msgid "Next step" +msgstr "" + +#: front/src/components/audio/Player.vue:263 +msgid "Next track" +msgstr "" + +#: front/src/components/Sidebar.vue:125 +msgid "No" +msgstr "" + +#: front/src/components/Home.vue:103 +msgid "No add-ons, no plugins : you only need a web library" +msgstr "" + +#: front/src/components/library/Track.vue:102 +msgid "No lyrics available for this track." +msgstr "" + +#: front/src/components/playlists/Form.vue:81 +msgid "Nobody except me" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:32 +msgid "Not following" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:13 +#: front/src/components/federation/LibraryTrackTable.vue:67 +msgid "Not imported" +msgstr "" + +#: front/src/components/manage/users/InvitationsTable.vue:51 +msgid "Not used" +msgstr "" + +#: front/src/App.vue:37 +msgid "Official website" +msgstr "" + +#: front/src/components/auth/Settings.vue:83 +#, fuzzy +msgid "Old password" +msgstr "Cambia password" + +#: front/src/components/library/import/FileUpload.vue:36 +msgid "Once all your files are uploaded, simply click the following button to check the import status." +msgstr "" + +#: front/src/components/federation/LibraryCard.vue:21 +#: front/src/components/manage/users/InvitationsTable.vue:20 +msgid "Open" +msgstr "" + +#: front/src/App.vue:63 +msgid "Options" +msgstr "" + +#: front/src/components/library/import/Main.vue:93 +msgid "Or" +msgstr "" + +#: front/src/components/favorites/List.vue:23 +#: front/src/components/federation/LibraryTrackTable.vue:18 +#: front/src/components/library/Artists.vue:15 +#: src/components/library/Radios.vue:33 +#: front/src/components/manage/library/FilesTable.vue:9 +#: front/src/components/manage/library/RequestsTable.vue:9 +#: front/src/components/manage/users/InvitationsTable.vue:9 +#: front/src/components/manage/users/UsersTable.vue:9 +#: front/src/views/federation/LibraryList.vue:18 +#: src/views/playlists/List.vue:17 +msgid "Ordering" +msgstr "" + +#: front/src/components/favorites/List.vue:31 +#: front/src/components/federation/LibraryTrackTable.vue:26 +#: front/src/components/library/Artists.vue:23 +#: src/components/library/Radios.vue:41 +#: front/src/components/manage/library/FilesTable.vue:17 +#: front/src/components/manage/library/RequestsTable.vue:17 +#: front/src/components/manage/users/UsersTable.vue:17 +#: front/src/views/federation/LibraryList.vue:26 +#: src/views/playlists/List.vue:25 +msgid "Ordering direction" +msgstr "" + +#: front/src/components/manage/users/InvitationsTable.vue:38 +msgid "Owner" +msgstr "" + +#: front/src/components/PageNotFound.vue:33 +msgid "Page Not Found" +msgstr "" + +#: front/src/components/PageNotFound.vue:7 +msgid "Page not found!" +msgstr "" + +#: front/src/components/auth/Login.vue:32 src/components/auth/Signup.vue:38 +msgid "Password" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:95 +msgid "Password updated" +msgstr "" + +#: front/src/views/auth/PasswordResetConfirm.vue:28 +msgid "Password updated successfully" +msgstr "" + +#: front/src/components/audio/Player.vue:262 +msgid "Pause track" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:46 +#: front/src/components/library/import/BatchDetail.vue:33 +#: front/src/components/library/import/BatchDetail.vue:69 +#: front/src/components/library/import/BatchList.vue:14 +#: front/src/components/library/import/FileUpload.vue:59 +#: front/src/components/manage/library/RequestsTable.vue:27 +#: front/src/components/manage/library/RequestsTable.vue:63 +msgid "Pending" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:11 +#: front/src/views/federation/LibraryDetail.vue:26 +msgid "Pending approval" +msgstr "" + +#: front/src/components/Sidebar.vue:217 +msgid "Pending follow requests" +msgstr "" + +#: front/src/components/Sidebar.vue:216 src/views/admin/library/Base.vue:26 +msgid "Pending import requests" +msgstr "" + +#: front/src/components/requests/Form.vue:26 src/views/federation/Base.vue:36 +msgid "Pending requests" +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:42 +#: front/src/views/admin/users/UsersDetail.vue:68 +msgid "Permissions" +msgstr "" + +#: front/src/components/audio/PlayButton.vue:9 +#: src/components/library/Track.vue:30 +msgid "Play" +msgstr "" + +#: front/src/components/audio/album/Card.vue:50 +#: front/src/components/audio/artist/Card.vue:44 +#: src/components/library/Album.vue:28 front/src/views/playlists/Detail.vue:23 +msgid "Play all" +msgstr "" + +#: front/src/components/library/Artist.vue:26 +msgid "Play all albums" +msgstr "" + +#: front/src/components/audio/PlayButton.vue:58 +msgid "Play immediatly" +msgstr "" + +#: front/src/components/audio/PlayButton.vue:15 +msgid "Play next" +msgstr "" + +#: front/src/components/audio/PlayButton.vue:16 +msgid "Play now" +msgstr "" + +#: front/src/components/audio/Player.vue:261 +msgid "Play track" +msgstr "" + +#: front/src/views/playlists/Detail.vue:90 +msgid "Playlist" +msgstr "" + +#: front/src/views/playlists/Detail.vue:12 +msgid "Playlist containing %{ count } track, by %{ username }" +msgid_plural "Playlist containing %{ count } tracks, by %{ username }" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/playlists/Form.vue:9 +msgid "Playlist created" +msgstr "" + +#: front/src/components/playlists/Editor.vue:4 +msgid "Playlist editor" +msgstr "" + +#: front/src/components/playlists/Form.vue:21 +msgid "Playlist name" +msgstr "" + +#: front/src/components/playlists/Form.vue:6 +msgid "Playlist updated" +msgstr "" + +#: front/src/components/playlists/Form.vue:25 +msgid "Playlist visibility" +msgstr "" + +#: front/src/components/Sidebar.vue:56 src/components/library/Home.vue:16 +#: front/src/components/library/Library.vue:13 src/views/admin/Settings.vue:83 +#: front/src/views/playlists/List.vue:103 +msgid "Playlists" +msgstr "" + +#: front/src/components/Home.vue:56 +msgid "Playlists? We got them" +msgstr "" + +#: front/src/components/auth/Settings.vue:79 +msgid "Please double-check your password is correct" +msgstr "" + +#: front/src/components/auth/Login.vue:9 +msgid "Please double-check your username/password couple is correct" +msgstr "" + +#: front/src/components/auth/Settings.vue:46 +msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px." +msgstr "" + +#: front/src/components/library/import/Main.vue:26 +msgid "Previous step" +msgstr "" + +#: front/src/components/audio/Player.vue:260 +msgid "Previous track" +msgstr "" + +#: front/src/views/auth/EmailConfirm.vue:26 +#: front/src/views/auth/PasswordResetConfirm.vue:31 +msgid "Proceed to login" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:50 +msgid "Published date" +msgstr "" + +#: front/src/components/library/import/ArtistImport.vue:17 +msgid "Query template" +msgstr "" + +#: front/src/components/Sidebar.vue:20 +msgid "Queue" +msgstr "" + +#: front/src/components/audio/Player.vue:203 +msgid "Queue shuffled!" +msgstr "" + +#: front/src/views/radios/Detail.vue:80 +msgid "Radio" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:226 +msgid "Radio Builder" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:15 +msgid "Radio created" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:21 +msgid "Radio name" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:12 +#, fuzzy +msgid "Radio updated" +msgstr "Data di creazione" + +#: front/src/components/library/Library.vue:10 +#: src/components/library/Radios.vue:141 +msgid "Radios" +msgstr "" + +#: front/src/views/instance/Timeline.vue:7 +msgid "Recent activity on this instance" +msgstr "" + +#: front/src/components/library/Home.vue:24 +msgid "Recently added" +msgstr "" + +#: front/src/components/library/Home.vue:11 +#, fuzzy +msgid "Recently favorited" +msgstr "1 mi piace" + +#: front/src/components/library/Home.vue:6 +msgid "Recently listened" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:81 +msgid "Recording MusicBrainz ID" +msgstr "" + +#: front/src/views/admin/users/UsersDetail.vue:84 +#: front/src/views/federation/LibraryDetail.vue:122 +msgid "Refresh" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:42 +msgid "Refused" +msgstr "" + +#: front/src/components/auth/Profile.vue:12 +msgid "Registered since %{ date }" +msgstr "" + +#: front/src/components/auth/Signup.vue:9 +msgid "Registration are closed on this instance, you will need an invitation code to signup." +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:71 +msgid "regular user" +msgstr "" + +#: front/src/components/library/radios/Filter.vue:59 +msgid "Remove" +msgstr "" + +#: front/src/components/auth/Settings.vue:58 +msgid "Remove avatar" +msgstr "" + +#: front/src/components/favorites/TrackFavoriteIcon.vue:19 +msgid "Remove from favorites" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:34 +#: front/src/components/auth/SubsonicTokenForm.vue:37 +msgid "Request a new password" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:35 +msgid "Request a new Subsonic API password?" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:43 +msgid "Request a password" +msgstr "" + +#: front/src/App.vue:35 +msgid "Request music" +msgstr "" + +#: front/src/views/library/MusicRequest.vue:4 +#: src/views/library/MusicRequest.vue:21 +#, fuzzy +msgid "Request some music" +msgstr "Ore di musica" + +#: front/src/components/requests/Form.vue:20 +msgid "Request submitted!" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:49 +msgid "Rerun errored jobs" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:187 +msgid "Rerun job" +msgstr "" + +#: front/src/components/auth/Login.vue:34 src/views/auth/PasswordReset.vue:4 +#: front/src/views/auth/PasswordReset.vue:52 +msgid "Reset your password" +msgstr "" + +#: front/src/components/library/import/TrackImport.vue:31 +msgid "Result %{ current }/%{ total }" +msgstr "" + +#: front/src/components/favorites/List.vue:38 +#: src/components/library/Artists.vue:30 +#: front/src/components/library/Radios.vue:52 +#: src/views/federation/LibraryList.vue:33 +#: front/src/views/playlists/List.vue:32 +msgid "Results per page" +msgstr "" + +#: front/src/components/admin/SettingsGroup.vue:63 +#: front/src/components/library/radios/Builder.vue:29 +msgid "Save" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:112 +msgid "Scan triggered!" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:5 +#: front/src/components/library/Artists.vue:10 +#: src/components/library/Radios.vue:29 +#: front/src/components/library/import/BatchDetail.vue:62 +#: front/src/components/library/import/BatchList.vue:7 +#: front/src/components/manage/library/FilesTable.vue:5 +#: front/src/components/manage/library/RequestsTable.vue:5 +#: front/src/components/manage/users/InvitationsTable.vue:5 +#: front/src/components/manage/users/UsersTable.vue:5 +#: front/src/views/federation/LibraryList.vue:14 +#: src/views/playlists/List.vue:13 +msgid "Search" +msgstr "" + +#: front/src/components/library/import/Main.vue:85 +msgid "Search an entity you want to import:" +msgstr "" + +#: front/src/components/manage/library/RequestsTable.vue:180 +msgid "Search by artist, username, comment..." +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:188 +msgid "Search by source..." +msgstr "" + +#: front/src/components/library/import/BatchList.vue:116 +msgid "Search by submitter, source..." +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:182 +#: front/src/components/manage/library/FilesTable.vue:175 +msgid "Search by title, artist, domain..." +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:140 +msgid "Search by username, domain..." +msgstr "" + +#: front/src/components/manage/users/InvitationsTable.vue:152 +msgid "Search by username, email, code..." +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:162 +msgid "Search by username, email, name..." +msgstr "" + +#: front/src/components/audio/SearchBar.vue:20 +msgid "Search for artists, albums, tracks..." +msgstr "" + +#: front/src/components/audio/Search.vue:2 +msgid "Search for some music" +msgstr "" + +#: front/src/components/library/Track.vue:105 +msgid "Search on lyrics.wikia.com" +msgstr "" + +#: front/src/components/library/Album.vue:33 +#: src/components/library/Artist.vue:31 +#: front/src/components/library/Track.vue:40 +msgid "Search on Wikipedia" +msgstr "" + +#: front/src/components/library/import/TrackImport.vue:42 +msgid "Search query" +msgstr "" + +#: front/src/views/admin/Settings.vue:15 +msgid "Sections" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:41 +msgid "Select a filter" +msgstr "" + +#: front/src/components/common/ActionTable.vue:61 +msgid "Select all %{ total } elements" +msgid_plural "Select all %{ total } elements" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/library/import/FileUpload.vue:22 +msgid "Select files to upload..." +msgstr "" + +#: front/src/components/common/ActionTable.vue:69 +msgid "Select only current page" +msgstr "" + +#: front/src/components/library/import/Main.vue:19 +msgid "Select relevant sources or files for import" +msgstr "" + +#: front/src/components/federation/LibraryCard.vue:43 +msgid "Send a follow request" +msgstr "" + +#: front/src/components/Sidebar.vue:97 +#: src/components/manage/users/UsersTable.vue:184 +#: front/src/views/admin/users/UsersDetail.vue:165 +msgid "Settings" +msgstr "" + +#: front/src/components/auth/Settings.vue:10 +msgid "Settings updated" +msgstr "" + +#: front/src/components/admin/SettingsGroup.vue:11 +msgid "Settings updated successfully." +msgstr "" + +#: front/src/components/auth/Profile.vue:24 +msgid "Settings..." +msgstr "" + +#: front/src/components/manage/users/InvitationForm.vue:27 +msgid "Share link" +msgstr "" + +#: front/src/components/audio/artist/Card.vue:30 +msgid "Show 1 more album" +msgid_plural "Show %{ count } more albums" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/audio/album/Card.vue:40 +msgid "Show 1 more track" +msgid_plural "Show %{ count } more tracks" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/forms/PasswordInput.vue:25 +msgid "Show/hide password" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:97 +#: front/src/components/federation/LibraryTrackTable.vue:98 +#: front/src/components/library/import/BatchDetail.vue:128 +#: front/src/components/library/import/BatchList.vue:73 +#: front/src/components/manage/library/FilesTable.vue:97 +#: front/src/components/manage/library/RequestsTable.vue:104 +#: front/src/components/manage/users/InvitationsTable.vue:76 +#: front/src/components/manage/users/UsersTable.vue:87 +msgid "Showing results %{ start }-%{ end } on %{ total }" +msgstr "" + +#: front/src/components/audio/Player.vue:269 +msgid "Shuffle your queue" +msgstr "" + +#: front/src/components/auth/Signup.vue:95 +msgid "Sign Up" +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:40 +#: front/src/views/admin/users/UsersDetail.vue:37 +msgid "Sign-up" +msgstr "" + +#: front/src/components/audio/track/Table.vue:31 +msgid "Simply copy paste the snippet below into a terminal to launch the download." +msgstr "" + +#: front/src/components/library/Track.vue:69 +#: front/src/components/library/import/FileUpload.vue:44 +#: front/src/components/manage/library/FilesTable.vue:44 +msgid "Size" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:37 +#: front/src/components/library/import/BatchDetail.vue:72 +msgid "Skipped" +msgstr "" + +#: front/src/components/requests/Form.vue:3 +msgid "Something's missing in the library? Let us know what you would like to listen!" +msgstr "" + +#: front/src/components/audio/Search.vue:25 +msgid "Sorry, we did not found any album matching your query" +msgstr "" + +#: front/src/components/audio/Search.vue:16 +msgid "Sorry, we did not found any artist matching your query" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:82 +#: front/src/components/library/import/BatchList.vue:38 +#: front/src/components/library/import/TrackImport.vue:17 +msgid "Source" +msgstr "" + +#: front/src/App.vue:41 +msgid "Source code" +msgstr "" + +#: front/src/App.vue:40 +msgid "Source code (%{version})" +msgstr "" + +#: front/src/components/auth/Profile.vue:20 +#: front/src/components/manage/users/UsersTable.vue:70 +msgid "Staff member" +msgstr "" + +#: front/src/components/radios/Button.vue:4 +msgid "Start" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:28 +msgid "Start Upload" +msgstr "" + +#: front/src/views/admin/Settings.vue:86 +msgid "Statistics" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:23 +#: front/src/components/federation/LibraryTrackTable.vue:46 +#: front/src/components/library/import/BatchDetail.vue:66 +#: front/src/components/library/import/BatchDetail.vue:83 +#: front/src/components/library/import/BatchList.vue:11 +#: front/src/components/library/import/BatchList.vue:37 +#: front/src/components/library/import/FileUpload.vue:45 +#: front/src/components/manage/library/RequestsTable.vue:24 +#: front/src/components/manage/library/RequestsTable.vue:48 +#: front/src/components/manage/users/InvitationsTable.vue:17 +#: front/src/components/manage/users/InvitationsTable.vue:39 +#: front/src/components/manage/users/UsersTable.vue:43 +msgid "Status" +msgstr "" + +#: front/src/components/radios/Button.vue:3 +msgid "Stop" +msgstr "" + +#: front/src/components/Sidebar.vue:159 +msgid "Stop radio" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:32 +msgid "Stop Upload" +msgstr "" + +#: front/src/App.vue:9 src/components/requests/Form.vue:17 +msgid "Submit" +msgstr "" + +#: front/src/components/requests/Form.vue:22 +msgid "Submit another request" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:26 +#: front/src/components/library/import/BatchList.vue:39 +msgid "Submitted by" +msgstr "" + +#: front/src/views/admin/Settings.vue:85 +msgid "Subsonic" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:2 +msgid "Subsonic API password" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:71 +#: front/src/components/library/import/BatchList.vue:16 +#: front/src/components/library/import/FileUpload.vue:56 +msgid "Success" +msgstr "" + +#: front/src/App.vue:11 +msgid "Suggested choices" +msgstr "" + +#: front/src/components/playlists/Editor.vue:9 +msgid "Syncing changes to server..." +msgstr "" + +#: front/src/components/Home.vue:26 +msgid "That's simple: we loved Grooveshark and we want to build something even better." +msgstr "" + +#: front/src/components/requests/Form.vue:73 +msgid "The Beatles, Mickael Jackson…" +msgstr "" + +#: front/src/App.vue:59 +msgid "The funkwhale logo was kindly designed and provided by Francis Gading." +msgstr "" + +#: front/src/components/Home.vue:124 +msgid "The plaform is free and open-source, you can install it and modify it without worries" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:4 +msgid "The Subsonic API is not available on this Funkwhale instance." +msgstr "" + +#: front/src/components/requests/Form.vue:74 +msgid "The White Album, Thriller…" +msgstr "" + +#: front/src/components/audio/track/Table.vue:30 +msgid "There is currently no way to download directly multiple tracks from funkwhale as a ZIP archive. However, you can use a command line tools such as cURL to easily download a list of tracks." +msgstr "" + +#: front/src/components/library/import/Main.vue:149 +msgid "This import will be associated with the music request below. After the import is finished, the request will be marked as fulfilled." +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:195 +msgid "This indicate if the remote library granted you access" +msgstr "" + +#: front/src/components/auth/Profile.vue:16 +msgid "This is you!" +msgstr "" + +#: front/src/components/common/ActionTable.vue:37 +msgid "This may affect a lot of elements, please double check this is really what you want." +msgstr "" + +#: front/src/components/audio/PlayButton.vue:61 +msgid "This track is not imported and cannot be played" +msgstr "" + +#: front/src/views/playlists/Detail.vue:37 +msgid "This will completely delete this playlist and cannot be undone." +msgstr "" + +#: front/src/views/radios/Detail.vue:27 +msgid "This will completely delete this radio and cannot be undone." +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:51 +msgid "This will completely disable access to the Subsonic API using from account." +msgstr "" + +#: front/src/App.vue:137 +msgid "This will erase your local data and disconnect you, do you want to continue?" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:36 +msgid "This will log you out from existing devices that use the current password." +msgstr "" + +#: front/src/components/playlists/Editor.vue:44 +msgid "This will remove all tracks from this playlist and cannot be undone." +msgstr "" + +#: front/src/components/audio/track/Table.vue:6 +#: front/src/components/federation/LibraryTrackTable.vue:47 +#: front/src/components/manage/library/FilesTable.vue:37 +msgid "Title" +msgstr "" + +#: front/src/components/audio/SearchBar.vue:27 +#: src/components/library/Track.vue:174 +#: front/src/components/library/import/BatchDetail.vue:84 +#: front/src/components/metadata/Search.vue:138 +msgid "Track" +msgstr "" + +#: front/src/components/library/Track.vue:53 +msgid "Track information" +msgstr "" + +#: front/src/components/library/radios/Filter.vue:44 +msgid "Track matching filter" +msgstr "" + +#: front/src/components/instance/Stats.vue:54 +msgid "tracks" +msgstr "" + +#: front/src/components/library/Album.vue:43 +#: front/src/components/playlists/PlaylistModal.vue:33 +#: front/src/views/federation/Base.vue:8 src/views/playlists/Detail.vue:50 +#: front/src/views/radios/Detail.vue:34 +msgid "Tracks" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:125 +msgid "Tracks available in this library" +msgstr "" + +#: front/src/components/library/Artist.vue:54 +#, fuzzy +msgid "Tracks by this artist" +msgstr "Albums di questo artista" + +#: front/src/components/instance/Stats.vue:25 +msgid "Tracks favorited" +msgstr "" + +#: front/src/components/instance/Stats.vue:19 +msgid "tracks listened" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:109 +msgid "Trigger scan" +msgstr "" + +#: front/src/components/manage/library/FilesTable.vue:41 +msgid "Type" +msgstr "" + +#: front/src/components/About.vue:15 +msgid "Unfortunately, owners of this instance did not yet take the time to complete this page." +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:95 +msgid "Unknown" +msgstr "" + +#: front/src/components/Home.vue:37 +msgid "Unlimited music" +msgstr "" + +#: front/src/components/audio/Player.vue:264 +msgid "Unmute" +msgstr "" + +#: front/src/components/auth/Settings.vue:50 +msgid "Update avatar" +msgstr "" + +#: front/src/components/playlists/Form.vue:33 +msgid "Update playlist" +msgstr "" + +#: front/src/components/auth/Settings.vue:27 +msgid "Update settings" +msgstr "" + +#: front/src/views/auth/PasswordResetConfirm.vue:21 +msgid "Update your password" +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:172 +#: front/src/views/admin/users/UsersDetail.vue:153 +msgid "Upload" +msgstr "" + +#: front/src/components/auth/Settings.vue:45 +msgid "Upload a new avatar" +msgstr "" + +#: front/src/components/library/import/Main.vue:7 +msgid "Uploaded files or external source" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:57 +msgid "Uploading..." +msgstr "" + +#: front/src/App.vue:45 +msgid "Use another instance" +msgstr "" + +#: front/src/components/requests/Form.vue:75 +msgid "Use this comment box to add details to your request if needed" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:196 +msgid "Use this flag to enable/disable federation with this library" +msgstr "" + +#: front/src/views/auth/PasswordReset.vue:12 +msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password." +msgstr "" + +#: front/src/components/federation/LibraryForm.vue:6 +msgid "Use this form to scan an instance and setup federation." +msgstr "" + +#: front/src/components/manage/users/InvitationsTable.vue:49 +msgid "Used" +msgstr "" + +#: front/src/components/manage/library/RequestsTable.vue:47 +msgid "User" +msgstr "" + +#: front/src/components/instance/Stats.vue:5 +msgid "User activity" +msgstr "" + +#: front/src/components/library/Radios.vue:20 +#, fuzzy +msgid "User radios" +msgstr "Sfogliando radio" + +#: front/src/components/auth/Signup.vue:19 +#: front/src/components/manage/users/UsersTable.vue:37 +msgid "Username" +msgstr "" + +#: front/src/components/auth/Login.vue:15 +msgid "Username or email" +msgstr "" + +#: front/src/components/instance/Stats.vue:13 +msgid "users" +msgstr "" + +#: front/src/components/Sidebar.vue:103 src/views/admin/Settings.vue:81 +#: front/src/views/admin/users/Base.vue:5 src/views/admin/users/UsersList.vue:3 +#: front/src/views/admin/users/UsersList.vue:21 +msgid "Users" +msgstr "" + +#: front/src/components/library/Album.vue:37 +#: src/components/library/Artist.vue:35 +#: front/src/components/library/Track.vue:44 +#: front/src/components/library/import/ArtistImport.vue:131 +#: front/src/components/metadata/ArtistCard.vue:49 +#: front/src/components/metadata/ReleaseCard.vue:53 +msgid "View on MusicBrainz" +msgstr "" + +#: front/src/components/playlists/PlaylistModal.vue:20 +msgid "We cannot add the track to a playlist" +msgstr "" + +#: front/src/components/playlists/Form.vue:14 +msgid "We cannot create the playlist" +msgstr "" + +#: front/src/components/auth/Signup.vue:13 +msgid "We cannot create your account" +msgstr "" + +#: front/src/components/auth/Login.vue:7 +msgid "We cannot log you in" +msgstr "" + +#: front/src/components/auth/Settings.vue:38 +#, fuzzy +msgid "We cannot save your avatar" +msgstr "Non puoi cambiare la tua password" + +#: front/src/components/auth/Settings.vue:14 +msgid "We cannot save your settings" +msgstr "" + +#: front/src/components/Home.vue:130 +msgid "We do not track you or bother you with ads" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:5 +msgid "We recommend using Picard for that purpose." +msgstr "" + +#: front/src/components/Home.vue:7 +msgid "We think listening to music should be simple." +msgstr "" + +#: front/src/components/PageNotFound.vue:10 +msgid "We're sorry, the page you asked for does not exist:" +msgstr "" + +#: front/src/components/requests/Form.vue:21 +msgid "We've received your request, you'll get some groove soon ;)" +msgstr "" + +#: front/src/components/Home.vue:152 +msgid "Welcome" +msgstr "" + +#: front/src/components/Home.vue:5 +msgid "Welcome on Funkwhale" +msgstr "" + +#: front/src/components/library/import/Main.vue:114 +msgid "What is metadata?" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:197 +msgid "When enabled, auto importing will automatically import new tracks published in this library" +msgstr "" + +#: front/src/components/Home.vue:24 +msgid "Why funkwhale?" +msgstr "" + +#: front/src/components/Sidebar.vue:124 +msgid "Yes" +msgstr "" + +#: front/src/components/auth/Logout.vue:8 +msgid "Yes, log me out!" +msgstr "" + +#: front/src/components/auth/Logout.vue:7 +msgid "You are currently logged in as %{ username }" +msgstr "" + +#: front/src/components/library/import/Main.vue:111 +msgid "You can also skip this step and enter metadata manually." +msgstr "" + +#: front/src/components/Home.vue:136 +msgid "You can invite friends and family to your instance so they can enjoy your music" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:7 +msgid "You can use this interface to build your own custom radio, which will play tracks according to your criteria." +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:8 +msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance." +msgstr "" + +#: front/src/components/Sidebar.vue:156 +msgid "You have a radio playing" +msgstr "" + +#: front/src/App.vue:6 +msgid "You need to select an instance in order to continue" +msgstr "" + +#: front/src/components/auth/Settings.vue:100 +msgid "You will be logged out from this session and have to log in with the new one" +msgstr "" + +#: front/src/components/auth/Settings.vue:71 +msgid "You will have to update your password on your clients that use this password." +msgstr "" + +#: front/src/components/library/import/Main.vue:103 +msgid "You will import:" +msgstr "" + +#: front/src/views/auth/EmailConfirm.vue:24 +msgid "Your email address was confirmed, you can now use the service without limitations." +msgstr "" + +#: front/src/components/favorites/List.vue:109 +msgid "Your Favorites" +msgstr "" + +#: front/src/components/Home.vue:117 +msgid "Your music, your way" +msgstr "" + +#: front/src/views/auth/PasswordResetConfirm.vue:29 +msgid "Your password has been updated successfully." +msgstr "" + +#: front/src/components/auth/Settings.vue:101 +msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password" +msgstr "" + +#: front/src/components/audio/PlayButton.vue:156 +msgid "%{ count } track was added to your queue" +msgid_plural "%{ count } tracks were added to your queue" +msgstr[0] "" +msgstr[1] "" diff --git a/front/locales/oc/LC_MESSAGES/app.po b/front/locales/oc/LC_MESSAGES/app.po new file mode 100644 index 000000000..095008a6c --- /dev/null +++ b/front/locales/oc/LC_MESSAGES/app.po @@ -0,0 +1,2536 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the front package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: front 1.0.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-07-22 14:12+0200\n" +"PO-Revision-Date: 2018-07-22 20:29+0000\n" +"Last-Translator: Quentí \n" +"Language-Team: none\n" +"Language: oc\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 2.20\n" + +#: front/src/components/playlists/PlaylistModal.vue:9 +msgid "\"%{ title }\", by %{ artist }" +msgstr "\"%{ title }\", de %{ artist }" + +#: front/src/components/Sidebar.vue:24 +msgid "(%{ index } of %{ length })" +msgstr "(%{ index } sus %{ length })" + +#: front/src/components/Sidebar.vue:22 +msgid "(empty)" +msgstr "(void)" + +#: front/src/components/common/ActionTable.vue:43 +#: front/src/components/common/ActionTable.vue:51 +msgid "%{ count } on %{ total } selected" +msgid_plural "%{ count } on %{ total } selected" +msgstr[0] "%{ count } sus %{ total } element seleccionat" +msgstr[1] "%{ count } sus %{ total } elements seleccionats" + +#: front/src/components/Sidebar.vue:116 +#: src/views/federation/LibraryDetail.vue:87 +msgid "%{ count } track" +msgid_plural "%{ count } tracks" +msgstr[0] "%{ count } pista" +msgstr[1] "%{ count } pistas" + +#: front/src/components/library/Artist.vue:13 +msgid "%{ count } track in %{ albumsCount } albums" +msgid_plural "%{ count } tracks in %{ albumsCount } albums" +msgstr[0] "%{ count } pista dins %{ albumsCount } albums" +msgstr[1] "%{ count } pistas dins %{ albumsCount } albums" + +#: front/src/components/library/radios/Builder.vue:76 +msgid "%{ count } track matching combined filters" +msgid_plural "%{ count } tracks matching combined filters" +msgstr[0] "%{ count } pista correspond als filtres seleccionats" +msgstr[1] "%{ count } pistas correspondon als filtres seleccionats" + +#: front/src/components/playlists/Card.vue:18 +msgid "%{ count} track" +msgid_plural "%{ count } tracks" +msgstr[0] "%{ count} pista" +msgstr[1] "%{ count} pistas" + +#: front/src/components/common/Duration.vue:2 +msgid "%{ hours } h %{ minutes } min" +msgstr "%{ hours } h %{ minutes } min" + +#: front/src/components/common/Duration.vue:5 +msgid "%{ minutes } min" +msgstr "%{ minutes } min" + +#: front/src/components/activity/Like.vue:7 +msgid "%{ user } favorited a track" +msgstr "%{ user } a aimat una pista" + +#: front/src/components/activity/Listen.vue:7 +msgid "%{ user } listened to a track" +msgstr "%{ user } a escotat una pista" + +#: front/src/components/auth/Profile.vue:49 +msgid "%{ username }'s profile" +msgstr "Perfil de %{ username }" + +#: front/src/components/audio/artist/Card.vue:41 +msgid "1 album" +msgid_plural "%{ count } albums" +msgstr[0] "1 album" +msgstr[1] "%{ count } albums" + +#: front/src/components/favorites/List.vue:10 +msgid "1 favorite" +msgid_plural "%{ count } favorites" +msgstr[0] "1 favorit" +msgstr[1] "%{ count } favorits" + +#: front/src/components/audio/album/Card.vue:54 +#: front/src/components/federation/LibraryCard.vue:25 +msgid "1 track" +msgid_plural "%{ count } tracks" +msgstr[0] "1 piste" +msgstr[1] "%{ count } pistas" + +#: front/src/components/About.vue:5 +msgid "About %{ instance }" +msgstr "A prepaus de %{ instance }" + +#: front/src/App.vue:54 +msgid "About Funkwhale" +msgstr "A prepaus de Funkwhale" + +#: front/src/App.vue:32 src/components/About.vue:8 src/components/About.vue:55 +msgid "About this instance" +msgstr "A prepaus d’aquesta instància" + +#: front/src/components/manage/library/RequestsTable.vue:28 +#: front/src/components/manage/library/RequestsTable.vue:62 +msgid "Accepted" +msgstr "Acceptat" + +#: front/src/components/auth/SubsonicTokenForm.vue:111 +msgid "Access disabled" +msgstr "Accès desactivat" + +#: front/src/components/Home.vue:109 +msgid "Access your music from a clean interface that focus on what really matters" +msgstr "" +"Accedissètz a vòstra musica d’una interfàcia afinada estant, adaptada a çò " +"que compta vertadièrament" + +#: front/src/views/admin/users/UsersDetail.vue:54 +msgid "Account active" +msgstr "Compte actiu" + +#: front/src/components/auth/Settings.vue:5 +msgid "Account settings" +msgstr "Paramètres del compte" + +#: front/src/components/auth/Settings.vue:257 +msgid "Account Settings" +msgstr "Paramètres del compte" + +#: front/src/components/manage/users/UsersTable.vue:39 +msgid "Account status" +msgstr "Estat del compte" + +#: front/src/views/auth/PasswordReset.vue:14 +msgid "Account's email" +msgstr "Adreça electronica del compte" + +#: front/src/components/common/ActionTable.vue:82 +msgid "Action %{ action } was launched successfully on %{ count } element" +msgid_plural "Action %{ action } was launched successfully on %{ count } elements" +msgstr[0] "L’action %{ action } es estada lançada corrèctament sus %{ count } element" +msgstr[1] "L’action %{ action } es estada lançada corrèctament sus %{ count } elements" + +#: front/src/components/common/ActionTable.vue:8 +#: front/src/components/federation/LibraryFollowTable.vue:24 +#: front/src/components/library/radios/Builder.vue:60 +#: front/src/components/manage/library/RequestsTable.vue:54 +msgid "Actions" +msgstr "Accions" + +#: front/src/components/manage/users/UsersTable.vue:53 +msgid "Active" +msgstr "Actiu" + +#: front/src/components/Sidebar.vue:60 +msgid "Activity" +msgstr "Activitat" + +#: front/src/components/federation/LibraryFollowTable.vue:21 +msgid "Actor" +msgstr "Actor" + +#: front/src/views/federation/LibraryList.vue:8 +msgid "Add a new library" +msgstr "Ajustar una nòva bibliotèca" + +#: front/src/components/library/radios/Builder.vue:46 +msgid "Add filter" +msgstr "Ajustar de filtres" + +#: front/src/components/library/radios/Builder.vue:36 +msgid "Add filters to customize your radio" +msgstr "Ajustar de filtre per dire de personalizar vòstra ràdio" + +#: front/src/components/audio/PlayButton.vue:53 +msgid "Add to current queue" +msgstr "Ajustar a la lista de lectura" + +#: front/src/components/favorites/TrackFavoriteIcon.vue:4 +#: front/src/components/favorites/TrackFavoriteIcon.vue:21 +msgid "Add to favorites" +msgstr "Ajustar als favorits" + +#: front/src/components/playlists/TrackPlaylistIcon.vue:6 +#: front/src/components/playlists/TrackPlaylistIcon.vue:32 +msgid "Add to playlist..." +msgstr "Ajustar a la lista de lectura..." + +#: front/src/components/audio/PlayButton.vue:14 +msgid "Add to queue" +msgstr "Ajustar a la lista" + +#: front/src/components/playlists/PlaylistModal.vue:116 +msgid "Add to this playlist" +msgstr "Ajustar a aquesta lista de lectura" + +#: front/src/components/playlists/PlaylistModal.vue:54 +msgid "Add track" +msgstr "Ajustar una pista" + +#: front/src/components/manage/users/UsersTable.vue:69 +msgid "Admin" +msgstr "Admin" + +#: front/src/components/Sidebar.vue:64 +msgid "Administration" +msgstr "Administracion" + +#: front/src/components/audio/SearchBar.vue:26 +#: src/components/audio/track/Table.vue:8 +#: front/src/components/federation/LibraryTrackTable.vue:49 +#: front/src/components/library/Album.vue:91 +#: front/src/components/manage/library/FilesTable.vue:39 +#: front/src/components/metadata/Search.vue:134 +msgid "Album" +msgstr "Album" + +#: front/src/components/library/import/ReleaseImport.vue:3 +msgid "Album %{ title } (%{ count } track) by %{ artist }" +msgid_plural "Album %{ title } (%{ count } tracks) by %{ artist }" +msgstr[0] "Album %{ title } (%{ count } pista) per %{ artist }" +msgstr[1] "Album %{ title } (%{ count } pistas) per %{ artist }" + +#: front/src/components/library/Album.vue:12 +msgid "Album containing %{ count } track, by %{ artist }" +msgid_plural "Album containing %{ count } tracks, by %{ artist }" +msgstr[0] "Album contenent %{ count } pista, de %{ artist }" +msgstr[1] "Album contenent %{ count } pistas, de %{ artist }" + +#: front/src/components/library/Track.vue:20 +msgid "Album page" +msgstr "Pagina de l’album" + +#: front/src/components/audio/Search.vue:19 +#: src/components/instance/Stats.vue:48 +#: front/src/components/manage/library/RequestsTable.vue:50 +#: front/src/components/requests/Form.vue:9 +msgid "Albums" +msgstr "Albums" + +#: front/src/components/library/Artist.vue:44 +msgid "Albums by this artist" +msgstr "Albums d’aqueste artista" + +#: front/src/components/manage/library/RequestsTable.vue:26 +#: front/src/components/manage/users/InvitationsTable.vue:19 +msgid "All" +msgstr "Tot" + +#: front/src/components/playlists/Editor.vue:13 +msgid "An error occured while saving your changes" +msgstr "Una error s’es producha en enregistrar vòstras modificacions" + +#: front/src/components/auth/Login.vue:10 +msgid "An unknown error happend, this can mean the server is down or cannot be reached" +msgstr "" +"Una error desconeguda encontrada, aquò pòt significar que lo servidor es " +"fòra servici o pòt pas èsser atengut" + +#: front/src/components/federation/LibraryTrackTable.vue:11 +#: front/src/components/library/import/BatchDetail.vue:68 +#: front/src/components/library/import/BatchList.vue:13 +#: front/src/components/library/import/BatchList.vue:22 +msgid "Any" +msgstr "Totes" + +#: front/src/components/library/import/BatchList.vue:24 +msgid "API" +msgstr "API" + +#: front/src/components/federation/LibraryFollowTable.vue:68 +#: front/src/components/federation/LibraryFollowTable.vue:78 +msgid "Approve" +msgstr "Aprovar" + +#: front/src/components/federation/LibraryFollowTable.vue:70 +msgid "Approve access?" +msgstr "Aprovar l’accès ?" + +#: front/src/components/federation/LibraryFollowTable.vue:38 +msgid "Approved" +msgstr "Aprovat" + +#: front/src/components/auth/Logout.vue:5 +msgid "Are you sure you want to log out?" +msgstr "Volètz vertadièrament vos desconnectar ?" + +#: front/src/components/audio/SearchBar.vue:25 +#: src/components/audio/track/Table.vue:7 +#: front/src/components/federation/LibraryTrackTable.vue:48 +#: front/src/components/library/Artist.vue:119 +#: front/src/components/manage/library/FilesTable.vue:38 +#: front/src/components/manage/library/RequestsTable.vue:49 +#: front/src/components/metadata/Search.vue:130 +msgid "Artist" +msgstr "Artista" + +#: front/src/components/requests/Form.vue:5 +msgid "Artist name" +msgstr "Nom de l’artista" + +#: front/src/components/library/Album.vue:22 +#: src/components/library/Track.vue:23 +msgid "Artist page" +msgstr "Pagina de l’artista" + +#: front/src/components/audio/Search.vue:65 +msgid "Artist, album, track..." +msgstr "Artista, album, pista..." + +#: front/src/components/audio/Search.vue:10 +#: src/components/instance/Stats.vue:42 +#: front/src/components/library/Artists.vue:119 +#: src/components/library/Library.vue:7 +msgid "Artists" +msgstr "Artistas" + +#: front/src/components/favorites/List.vue:33 +#: front/src/components/federation/LibraryTrackTable.vue:28 +#: front/src/components/library/Artists.vue:25 +#: src/components/library/Radios.vue:44 +#: front/src/components/manage/library/FilesTable.vue:19 +#: front/src/components/manage/library/RequestsTable.vue:19 +#: front/src/components/manage/users/UsersTable.vue:19 +#: front/src/views/federation/LibraryList.vue:28 +#: src/views/playlists/List.vue:27 +msgid "Ascending" +msgstr "Ascendent" + +#: front/src/views/auth/PasswordReset.vue:27 +msgid "Ask for a password reset" +msgstr "Demandar un nòu senhal" + +#: front/src/views/federation/LibraryDetail.vue:56 +msgid "Auto importing" +msgstr "Importacion automatica" + +#: front/src/components/playlists/PlaylistModal.vue:26 +msgid "Available playlists" +msgstr "Listas de lectura disponiblas" + +#: front/src/components/auth/Settings.vue:34 +msgid "Avatar" +msgstr "Avatar" + +#: front/src/views/auth/EmailConfirm.vue:17 src/views/auth/PasswordReset.vue:24 +#: front/src/views/auth/PasswordResetConfirm.vue:18 +msgid "Back to login" +msgstr "Tornar a la pagina de connexion" + +#: front/src/views/federation/LibraryFollowersList.vue:5 +msgid "Be careful when accepting follow requests, as it means the follower will have access to your entire library." +msgstr "" +"Atencion en acceptar de demandas d’abonament, vòl dire que los seguidors " +"poiràn accedir a vòstra bibliotèca complèta." + +#: front/src/components/library/Track.vue:80 +#: front/src/components/manage/library/FilesTable.vue:42 +msgid "Bitrate" +msgstr "Debit" + +#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4 +msgid "Browse" +msgstr "Percórrer" + +#: front/src/components/Sidebar.vue:50 +msgid "Browse library" +msgstr "Percórrer la bibliotèca" + +#: front/src/components/library/Artists.vue:4 +msgid "Browsing artists" +msgstr "Percórrer los artistas" + +#: front/src/views/federation/LibraryTrackList.vue:3 +msgid "Browsing federated tracks" +msgstr "Percórrer las pistas federadas" + +#: front/src/views/federation/LibraryFollowersList.vue:3 +msgid "Browsing followers" +msgstr "Percórrer los seguidors" + +#: front/src/views/federation/LibraryList.vue:3 +msgid "Browsing libraries" +msgstr "Percórrer las bibliotècas" + +#: front/src/views/playlists/List.vue:3 +msgid "Browsing playlists" +msgstr "Percórrer las listas de lectura" + +#: front/src/components/library/Radios.vue:4 +msgid "Browsing radios" +msgstr "Percórrer las ràdios" + +#: front/src/components/library/radios/Builder.vue:5 +msgid "Builder" +msgstr "Editor" + +#: front/src/components/audio/album/Card.vue:13 +msgid "By %{ artist }" +msgstr "De %{ artist }" + +#: front/src/components/federation/LibraryFollowTable.vue:57 +msgid "By confirming, %{ username } will be denied access to your library." +msgstr "Se confirmatz, %{ username } poirà pas accedir a vòstra bibliotèca." + +#: front/src/components/federation/LibraryFollowTable.vue:73 +msgid "By confirming, %{ username } will be granted access to your library." +msgstr "Se confirmatz, %{ username } poirà accedir a vòstra bibliotèca." + +#: front/src/components/audio/track/Table.vue:43 +#: front/src/components/common/DangerousButton.vue:17 +#: front/src/components/library/radios/Filter.vue:53 +#: front/src/components/playlists/PlaylistModal.vue:63 +msgid "Cancel" +msgstr "Anullar" + +#: front/src/components/library/radios/Builder.vue:59 +msgid "Candidates" +msgstr "Pistas candidatas" + +#: front/src/components/auth/Settings.vue:76 +msgid "Cannot change your password" +msgstr "Lo senhal pòt pas se cambiar" + +#: front/src/App.vue:66 +msgid "Change language" +msgstr "Cambiar la lenga" + +#: front/src/components/auth/Settings.vue:67 +msgid "Change my password" +msgstr "Cambiar lo senhal" + +#: front/src/components/auth/Settings.vue:95 +msgid "Change password" +msgstr "Cambiar lo senhal" + +#: front/src/views/auth/PasswordResetConfirm.vue:4 +#: front/src/views/auth/PasswordResetConfirm.vue:62 +msgid "Change your password" +msgstr "Cambiar lo senhal" + +#: front/src/components/auth/Settings.vue:96 +msgid "Change your password?" +msgstr "Cambiar lo senhal ?" + +#: front/src/components/playlists/Editor.vue:21 +msgid "Changes synced with server" +msgstr "Cambiament sincronizat amb lo servidor" + +#: front/src/components/auth/Settings.vue:70 +msgid "Changing your password will also change your Subsonic API password if you have requested one." +msgstr "" +"L’actualizacion de vòstra senhal cambiarà tanben lo de l’API Subsonic se n’" +"avètz un." + +#: front/src/components/auth/Settings.vue:98 +msgid "Changing your password will have the following consequences" +msgstr "Lo cambiament de senhal a las consequéncias seguentas" + +#: front/src/App.vue:4 +msgid "Choose your instance" +msgstr "Causissètz vòstra instància" + +#: front/src/components/Home.vue:64 +msgid "Clean library" +msgstr "Bibliotèca de qualitat" + +#: front/src/components/manage/users/InvitationForm.vue:37 +msgid "Clear" +msgstr "Escafar" + +#: front/src/components/playlists/Editor.vue:40 +#: front/src/components/playlists/Editor.vue:45 +msgid "Clear playlist" +msgstr "Escafar la lista de lectura" + +#: front/src/components/audio/Player.vue:270 +msgid "Clear your queue" +msgstr "Voidar la fila" + +#: front/src/components/library/import/BatchList.vue:23 +msgid "CLI" +msgstr "CLI" + +#: front/src/components/Home.vue:44 +msgid "Click once, listen for hours using built-in radios" +msgstr "Amb un clic, escotatz d’oras de musica a la ràdio" + +#: front/src/components/manage/library/RequestsTable.vue:30 +#: front/src/components/manage/library/RequestsTable.vue:64 +msgid "Closed" +msgstr "Tampada" + +#: front/src/components/manage/users/InvitationForm.vue:26 +#: front/src/components/manage/users/InvitationsTable.vue:42 +msgid "Code" +msgstr "Còdi" + +#: front/src/components/audio/album/Card.vue:43 +#: front/src/components/audio/artist/Card.vue:33 +#: front/src/components/discussion/Comment.vue:20 +msgid "Collapse" +msgstr "Plegar" + +#: front/src/components/manage/library/RequestsTable.vue:51 +#: front/src/components/requests/Form.vue:14 +msgid "Comment" +msgstr "Comentari" + +#: front/src/components/library/radios/Builder.vue:58 +msgid "Config" +msgstr "Configuracion" + +#: front/src/components/common/DangerousButton.vue:21 +msgid "Confirm" +msgstr "Confirmar" + +#: front/src/views/auth/EmailConfirm.vue:4 src/views/auth/EmailConfirm.vue:20 +#: front/src/views/auth/EmailConfirm.vue:51 +msgid "Confirm your email" +msgstr "Confirmar vòstra adreça electronica" + +#: front/src/views/auth/EmailConfirm.vue:13 +msgid "Confirmation code" +msgstr "Còdi de confirmacion" + +#: front/src/components/playlists/Editor.vue:163 +msgid "Copy tracks from current queue to playlist" +msgstr "Copiar las pistas de la fila a la lista de lectura" + +#: front/src/components/Home.vue:88 +msgid "Covers, lyrics, our goal is to have them all ;)" +msgstr "Jaqueta d’albums, paraulas, nòstra tòca es d’o aver tot ;)" + +#: front/src/components/auth/Signup.vue:4 +msgid "Create a funkwhale account" +msgstr "Crear un compte funkwhale" + +#: front/src/components/playlists/Form.vue:2 +msgid "Create a new playlist" +msgstr "Crear una nòva lista de lectura" + +#: front/src/components/auth/Login.vue:17 +msgid "Create an account" +msgstr "Crear un compte" + +#: front/src/components/manage/library/RequestsTable.vue:88 +#: front/src/components/requests/Card.vue:25 +msgid "Create import" +msgstr "Crear un import" + +#: front/src/components/auth/Signup.vue:51 +msgid "Create my account" +msgstr "Crear mon compte" + +#: front/src/components/playlists/Form.vue:34 +msgid "Create playlist" +msgstr "Crear una lista de lectura" + +#: front/src/components/library/Radios.vue:23 +msgid "Create your own radio" +msgstr "Crear vòstra pròpria ràdio" + +#: front/src/components/federation/LibraryFollowTable.vue:22 +#: front/src/components/manage/library/RequestsTable.vue:52 +#: front/src/components/manage/users/InvitationsTable.vue:40 +msgid "Creation date" +msgstr "Data de creacion" + +#: front/src/components/auth/Settings.vue:54 +msgid "Current avatar" +msgstr "Avatar actual" + +#: front/src/components/playlists/PlaylistModal.vue:8 +msgid "Current track" +msgstr "Pista actuala" + +#: front/src/components/manage/library/FilesTable.vue:189 +#: front/src/components/manage/library/RequestsTable.vue:195 +#: front/src/components/manage/users/InvitationsTable.vue:166 +#: front/src/views/playlists/Detail.vue:33 +msgid "Delete" +msgstr "Suprimir" + +#: front/src/views/playlists/Detail.vue:38 +msgid "Delete playlist" +msgstr "Suprimir la lista de lectura" + +#: front/src/views/radios/Detail.vue:28 +msgid "Delete radio" +msgstr "Suprimir la ràdio" + +#: front/src/components/federation/LibraryFollowTable.vue:52 +#: front/src/components/federation/LibraryFollowTable.vue:63 +msgid "Deny" +msgstr "Refusar" + +#: front/src/components/federation/LibraryFollowTable.vue:54 +msgid "Deny access?" +msgstr "Refusar l’accès ?" + +#: front/src/components/favorites/List.vue:34 +#: front/src/components/federation/LibraryTrackTable.vue:29 +#: front/src/components/library/Artists.vue:26 +#: src/components/library/Radios.vue:47 +#: front/src/components/manage/library/FilesTable.vue:20 +#: front/src/components/manage/library/RequestsTable.vue:20 +#: front/src/components/manage/users/UsersTable.vue:20 +#: front/src/views/federation/LibraryList.vue:29 +#: src/views/playlists/List.vue:28 +msgid "Descending" +msgstr "Descendent" + +#: front/src/components/federation/LibraryCard.vue:50 +msgid "Detail" +msgstr "Detalhs" + +#: front/src/views/admin/users/UsersDetail.vue:146 +msgid "Determine if the user account is active or not. Inactive users cannot login or use the service." +msgstr "" +"Determina se l’utilizaire es actiu o non. Los compte inactius se pòdon pas " +"connectar nimai utilizar lo servici." + +#: front/src/components/auth/Settings.vue:104 +#: front/src/components/auth/SubsonicTokenForm.vue:52 +msgid "Disable access" +msgstr "Desactivar l’accès" + +#: front/src/components/auth/SubsonicTokenForm.vue:49 +msgid "Disable Subsonic access" +msgstr "Desactivar l’accès via Subsonic" + +#: front/src/components/auth/SubsonicTokenForm.vue:50 +msgid "Disable Subsonic API access?" +msgstr "Desactivar l’accès a l’API Subsonic ?" + +#: front/src/components/auth/SubsonicTokenForm.vue:14 +msgid "Discover how to use Funkwhale from other apps" +msgstr "Aprenètz a utilizar Funkwhale amb d’autras aplicacions" + +#: front/src/components/library/radios/Builder.vue:26 +msgid "Display publicly" +msgstr "Mostrar publicament" + +#: front/src/components/playlists/Editor.vue:42 +msgid "Do you want to clear the playlist \"%{ playlist }\"?" +msgstr "Volètz voidar la lista de lectura « %{ playlist } »  ?" + +#: front/src/components/common/DangerousButton.vue:7 +msgid "Do you want to confirm this action?" +msgstr "Volètz confirmar aquesta accion ?" + +#: front/src/views/playlists/Detail.vue:35 +msgid "Do you want to delete the playlist \"%{ playlist }\"?" +msgstr "Volètz suprimir la lista de lectura « %{ playlist } »  ?" + +#: front/src/views/radios/Detail.vue:26 +msgid "Do you want to delete the radio \"%{ radio }\"?" +msgstr "Volètz suprimir la ràdio « %{ playlist } »  ?" + +#: front/src/components/common/ActionTable.vue:29 +msgid "Do you want to launch %{ action } on %{ count } element?" +msgid_plural "Do you want to launch %{ action } on %{ count } elements?" +msgstr[0] "Volètz lançar l’accion « %{ action } » sus %{ count } element ?" +msgstr[1] "Volètz lançar l’accion « %{ action } » sus %{ count } elements ?" + +#: front/src/components/Sidebar.vue:113 +msgid "Do you want to restore your previous queue?" +msgstr "Volètz restablir vòstra fila precedenta ?" + +#: front/src/App.vue:38 +msgid "Documentation" +msgstr "Documentacion" + +#: front/src/components/audio/track/Table.vue:24 +#: src/components/library/Track.vue:48 +msgid "Download" +msgstr "Telecargar" + +#: front/src/components/audio/track/Table.vue:27 +msgid "Download tracks" +msgstr "Telecargar las pistas" + +#: front/src/components/playlists/Editor.vue:49 +msgid "Drag and drop rows to reorder tracks in the playlist" +msgstr "Lisatz las linhas per triar las pistas de la lista de lectura" + +#: front/src/components/library/Track.vue:58 +#: front/src/components/manage/library/FilesTable.vue:43 +msgid "Duration" +msgstr "Durada" + +#: front/src/components/Home.vue:96 +msgid "Easy to use" +msgstr "Simple d’utilizar" + +#: front/src/components/About.vue:21 +msgid "Edit instance info" +msgstr "Editrar las informacions d’aquesta instància" + +#: front/src/components/radios/Card.vue:20 src/views/playlists/Detail.vue:30 +msgid "Edit..." +msgstr "Editar..." + +#: front/src/components/auth/Signup.vue:29 +#: front/src/components/manage/users/UsersTable.vue:38 +msgid "Email" +msgstr "Corrièl" + +#: front/src/views/admin/users/UsersDetail.vue:29 +msgid "Email address" +msgstr "Adreça electronica" + +#: front/src/views/auth/EmailConfirm.vue:23 +msgid "Email confirmed" +msgstr "Corrièl confirmat" + +#: front/src/views/playlists/Detail.vue:29 +msgid "End edition" +msgstr "Acabar l’edicion" + +#: front/src/components/library/import/FileUpload.vue:4 +msgid "Ensure your music files are properly tagged before uploading them." +msgstr "" +"Verificatz que vòstres fichièrs musicals son corrèctament etiquetats abans " +"de los enviar." + +#: front/src/components/library/Radios.vue:140 +msgid "Enter a radio name..." +msgstr "Escrivètz un nom de ràdio..." + +#: front/src/components/library/Artists.vue:118 +msgid "Enter an artist name..." +msgstr "Escrivètz un nom d’artista..." + +#: front/src/views/federation/LibraryList.vue:122 +msgid "Enter an library domain name..." +msgstr "Escrivètz un nom de domeni..." + +#: front/src/views/playlists/List.vue:104 +msgid "Enter an playlist name..." +msgstr "Escrivètz un nom de lista de lectura..." + +#: front/src/components/auth/Signup.vue:98 +msgid "Enter your email" +msgstr "Escrivètz vòstre adreça electronica" + +#: front/src/components/auth/Signup.vue:96 +msgid "Enter your invitation code (case insensitive)" +msgstr "Escrivètz vòstre còdi d’invitacion (pas sensible a la cassa)" + +#: front/src/components/metadata/Search.vue:114 +msgid "Enter your search query..." +msgstr "Escrivètz vòstra recèrca..." + +#: front/src/components/auth/Signup.vue:97 +msgid "Enter your username" +msgstr "Escrivètz vòstre nom d’utilizaire" + +#: front/src/components/auth/Login.vue:77 +msgid "Enter your username or email" +msgstr "Escrivètz vòstre nom d’utilizaire o corrièl" + +#: front/src/components/auth/SubsonicTokenForm.vue:20 +msgid "Error" +msgstr "Error" + +#: front/src/views/admin/Settings.vue:87 +msgid "Error reporting" +msgstr "Rapòrt d’error" + +#: front/src/components/common/ActionTable.vue:75 +msgid "Error while applying action" +msgstr "Error en tractar l’accion" + +#: front/src/views/auth/PasswordReset.vue:7 +msgid "Error while asking for a password reset" +msgstr "Error en demandar un novèl senhal" + +#: front/src/views/auth/PasswordResetConfirm.vue:7 +msgid "Error while changing your password" +msgstr "Error en cambiar lo senhal" + +#: front/src/views/auth/EmailConfirm.vue:7 +msgid "Error while confirming your email" +msgstr "Error en confirmar l’adreça electronica" + +#: front/src/components/manage/users/InvitationForm.vue:4 +msgid "Error while creating invitation" +msgstr "Error en crear l’invitacion" + +#: front/src/components/admin/SettingsGroup.vue:5 +msgid "Error while saving settings" +msgstr "Error en enregistrar los paramètres" + +#: front/src/components/federation/LibraryForm.vue:10 +msgid "Error while scanning library" +msgstr "Error en analizar la bibliotèca" + +#: front/src/components/library/import/BatchDetail.vue:41 +#: front/src/components/library/import/BatchDetail.vue:70 +#: front/src/components/library/import/BatchList.vue:15 +msgid "Errored" +msgstr "Perturbat" + +#: front/src/components/playlists/Form.vue:89 +msgid "Everyone" +msgstr "Tot lo monde" + +#: front/src/components/playlists/Form.vue:85 +msgid "Everyone on this instance" +msgstr "Lo monde d’aquesta instància" + +#: front/src/components/library/radios/Builder.vue:57 +msgid "Exclude" +msgstr "Exclure" + +#: front/src/components/discussion/Comment.vue:14 +msgid "Expand" +msgstr "Dobrir" + +#: front/src/components/manage/users/InvitationsTable.vue:41 +msgid "Expiration date" +msgstr "Data d’expiracion" + +#: front/src/components/manage/users/InvitationsTable.vue:50 +msgid "Expired" +msgstr "Expirada" + +#: front/src/components/manage/users/InvitationsTable.vue:21 +msgid "Expired/used" +msgstr "Expirada/utilizada" + +#: front/src/components/library/import/Main.vue:65 +msgid "External source. Supported backends" +msgstr "Font extèrna. Servicis compatibles" + +#: front/src/components/Sidebar.vue:51 +msgid "Favorites" +msgstr "Favorits" + +#: front/src/components/federation/LibraryForm.vue:3 +msgid "Federate with a new instance" +msgstr "Federar amb una nòva instància" + +#: front/src/views/federation/LibraryTrackList.vue:21 +msgid "Federated tracks" +msgstr "Pistas federadas" + +#: front/src/components/Sidebar.vue:87 +#: src/components/library/import/BatchList.vue:25 +#: front/src/components/manage/users/UsersTable.vue:180 +#: front/src/views/admin/Settings.vue:84 +#: src/views/admin/users/UsersDetail.vue:161 +#: front/src/views/federation/Base.vue:35 +#: src/views/federation/LibraryDetail.vue:40 +msgid "Federation" +msgstr "Federacion" + +#: front/src/views/federation/LibraryDetail.vue:3 +msgid "File mirroring" +msgstr "Còpia dels fichièrs" + +#: front/src/components/library/import/FileUpload.vue:43 +msgid "File name" +msgstr "Nom del fichièr" + +#: front/src/components/library/import/Main.vue:76 +msgid "File upload" +msgstr "Mandadís del fichièr" + +#: front/src/views/admin/library/Base.vue:5 +#: src/views/admin/library/FilesList.vue:21 +msgid "Files" +msgstr "Fichièrs" + +#: front/src/components/library/import/ArtistImport.vue:7 +msgid "Filter album types" +msgstr "Filtrar lo tipe d’album" + +#: front/src/components/library/radios/Builder.vue:56 +msgid "Filter name" +msgstr "Nom del filtre" + +#: front/src/components/library/import/Main.vue:52 +msgid "Finish import" +msgstr "Acabar l’import" + +#: front/src/components/library/import/BatchDetail.vue:54 +msgid "Finished" +msgstr "Acabat" + +#: front/src/components/library/import/Main.vue:59 +msgid "First, choose where you want to import the music from" +msgstr "D’en primièr, causissètz lo mòde d’import per la musica" + +#: front/src/components/federation/LibraryCard.vue:44 +msgid "Follow" +msgstr "Seguir" + +#: front/src/components/federation/LibraryCard.vue:36 +msgid "Follow request pending approval" +msgstr "Abonament en espèra de validacion" + +#: front/src/views/federation/LibraryDetail.vue:21 +msgid "Follow status" +msgstr "Estatut de l’abonament" + +#: front/src/views/federation/Base.vue:13 +#: front/src/views/federation/LibraryFollowersList.vue:24 +msgid "Followers" +msgstr "Seguidors" + +#: front/src/components/federation/LibraryCard.vue:18 +msgid "Followers only" +msgstr "Seguidors solament" + +#: front/src/components/federation/LibraryCard.vue:15 +#: front/src/views/federation/LibraryDetail.vue:29 +msgid "Following" +msgstr "Abonat" + +#: front/src/components/activity/Like.vue:12 +#: src/components/activity/Listen.vue:12 +msgid "from %{ album } by %{ artist }" +msgstr "de l’album %{ album } per %{ artist }" + +#: front/src/components/library/Track.vue:13 +msgid "From album %{ album } by %{ artist }" +msgstr "De l’album %{ album } per %{ artist }" + +#: front/src/App.vue:56 +msgid "Funkwhale is a free and open-source project run by volunteers. You can help us improve the platform by reporting bugs, suggesting features and share the project with your friends!" +msgstr "" +"Funkwhale es un projècte liure e gratuit, menat per de benevols. Podètz " +"ajudar a melhorar lo servici en senhalar los problèmas que trobatz, en " +"suggerir de melhoraments e ne’n parlant altorn de vos !" + +#: front/src/components/auth/SubsonicTokenForm.vue:7 +msgid "Funkwhale is compatible with other music players that support the Subsonic API." +msgstr "" +"Funkwhale es compatible amb d’autres lectors de musica compatibles amb l’API " +"Subsonic." + +#: front/src/components/Home.vue:98 +msgid "Funkwhale is dead simple to use." +msgstr "Funkwhale es simple d’utilizar." + +#: front/src/components/Home.vue:39 +msgid "Funkwhale is designed to make it easy to listen to music you like, or to discover new artists." +msgstr "" +"Funkwhale es concebut per facilitar l’escota de las musicas que vos agradan " +"e descobrir de novèls artistas." + +#: front/src/components/Home.vue:119 +msgid "Funkwhale is free and gives you control on your music." +msgstr "Funkwhale es a gratís e vos dòna lo contròla de vòstra musica." + +#: front/src/components/Home.vue:66 +msgid "Funkwhale takes care of handling your music" +msgstr "Funkwhale prend cura de vòstra musica" + +#: front/src/components/manage/users/InvitationForm.vue:16 +msgid "Get a new invitation" +msgstr "Obténer una novèla invitacion" + +#: front/src/components/Home.vue:13 +msgid "Get me to the library" +msgstr "Menatz-me a la bibliotèca" + +#: front/src/components/Home.vue:77 +msgid "" +"Get quality metadata about your music thanks to\n" +" \n" +" MusicBrainz\n" +" " +msgstr "" +"Obtenètz de metadonadas de qualitat per vòstra musica gràcia a\n" +" \n" +" MusicBrainz\n" +" " + +#: front/src/components/common/ActionTable.vue:21 +#: front/src/components/common/ActionTable.vue:27 +msgid "Go" +msgstr "Zo" + +#: front/src/components/PageNotFound.vue:14 +msgid "Go to home page" +msgstr "Tornar a l’acuèlh" + +#: front/src/components/library/import/Main.vue:13 +msgid "Grab corresponding metadata" +msgstr "Recuperar las metadonadas ligadas" + +#: front/src/App.vue:74 +msgid "Help us translate Funkwhale" +msgstr "Ajudar a traduire Funkwhale" + +#: front/src/components/library/Home.vue:65 +msgid "Home" +msgstr "Acuèlh" + +#: front/src/components/instance/Stats.vue:36 +msgid "Hours of music" +msgstr "Oras de musica" + +#: front/src/components/auth/SubsonicTokenForm.vue:11 +msgid "However, accessing Funkwhale from those clients require a separate password you can set below." +msgstr "" +"Pr’aquò, accedir a Funkwhale d’un client estant demanda un senhal diferent " +"que podètz configurar çai-jos." + +#: front/src/components/library/import/BatchList.vue:34 +msgid "ID" +msgstr "ID" + +#: front/src/views/auth/PasswordResetConfirm.vue:24 +msgid "If the email address provided in the previous step is valid and binded to a user account, you should receive an email with reset instructions in the next couple of minutes." +msgstr "" +"Se l’adreça qu’avètz provesida es valida e associada a un compte utilizaire, " +"sètz per recebre un messatge amb las consignas de reïnicializacion d’aquí " +"una estona." + +#: front/src/components/federation/LibraryTrackTable.vue:196 +#: front/src/components/library/Library.vue:17 +msgid "Import" +msgstr "Import" + +#: front/src/components/federation/LibraryTrackTable.vue:57 +msgid "Import #%{ id } launched" +msgstr "Import #%{ id } aviat" + +#: front/src/components/library/import/Main.vue:38 +msgid "Import %{ count } track" +msgid_plural "Import %{ count } tracks" +msgstr[0] "Import %{ count } pista" +msgstr[1] "Import %{ count } pistas" + +#: front/src/components/library/import/BatchDetail.vue:10 +msgid "Import batch" +msgstr "Part d’import" + +#: front/src/components/library/import/BatchDetail.vue:185 +msgid "Import Batch #%{ id }" +msgstr "Part d’imports #%{ id }" + +#: front/src/components/library/Library.vue:20 +msgid "Import batches" +msgstr "Parts d’imports" + +#: front/src/components/library/import/BatchList.vue:117 +msgid "Import Batches" +msgstr "Parts d’imports" + +#: front/src/components/manage/library/FilesTable.vue:40 +#: front/src/components/manage/library/RequestsTable.vue:53 +msgid "Import date" +msgstr "Data d’import" + +#: front/src/components/library/import/FileUpload.vue:38 +msgid "Import detail page" +msgstr "Pagina de detalhs de l’import" + +#: front/src/components/Sidebar.vue:81 +msgid "Import music" +msgstr "Importar de musica" + +#: front/src/components/library/import/Main.vue:267 +msgid "Import Music" +msgstr "Importar de musica" + +#: front/src/components/Home.vue:71 +msgid "Import music from various platforms, such as YouTube or SoundCloud" +msgstr "Importatz la musica de diferentas plataforma, coma YouTube o Soundcloud" + +#: front/src/components/federation/LibraryTrackTable.vue:14 +#: front/src/components/federation/LibraryTrackTable.vue:66 +msgid "Import pending" +msgstr "Import en espèra" + +#: front/src/views/admin/library/Base.vue:9 +#: front/src/views/admin/library/RequestsList.vue:3 +#: front/src/views/admin/library/RequestsList.vue:21 +msgid "Import requests" +msgstr "Requèstas d’import" + +#: front/src/components/library/import/BatchList.vue:20 +#: front/src/components/library/import/Main.vue:6 +msgid "Import source" +msgstr "Font de l’import" + +#: front/src/components/federation/LibraryTrackTable.vue:9 +msgid "Import status" +msgstr "Estatut de l’import" + +#: front/src/components/library/import/ReleaseImport.vue:14 +msgid "Import this release" +msgstr "Importar aquesta album" + +#: front/src/components/library/import/TrackImport.vue:11 +msgid "Import this track" +msgstr "Importar aquesta pista" + +#: front/src/components/federation/LibraryTrackTable.vue:12 +#: front/src/components/manage/library/RequestsTable.vue:29 +#: front/src/components/manage/library/RequestsTable.vue:61 +msgid "Imported" +msgstr "Importat" + +#: front/src/components/library/import/TrackImport.vue:44 +msgid "Imported URL" +msgstr "URL importadas" + +#: front/src/views/admin/Settings.vue:82 +msgid "Imports" +msgstr "Imports" + +#: front/src/components/favorites/TrackFavoriteIcon.vue:3 +msgid "In favorites" +msgstr "Als favorits" + +#: front/src/components/federation/LibraryTrackTable.vue:65 +msgid "In library" +msgstr "A la bibliotèca" + +#: front/src/components/manage/users/UsersTable.vue:54 +msgid "Inactive" +msgstr "Actiu" + +#: front/src/components/library/import/Main.vue:96 +msgid "Input a MusicBrainz ID manually:" +msgstr "Picar manualament un ID MasicBrainz :" + +#: front/src/views/auth/PasswordReset.vue:53 +msgid "Input the email address binded to your account" +msgstr "Escrivètz l’adreça ligada a vòstre compte" + +#: front/src/components/playlists/Editor.vue:31 +msgid "Insert from queue (%{ count } track)" +msgid_plural "Insert from queue (%{ count } tracks)" +msgstr[0] "Inserir de la fila (%{ count } pista)" +msgstr[1] "Inserir de la fila (%{ count } pistas)" + +#: front/src/views/admin/Settings.vue:80 +msgid "Instance information" +msgstr "Info. de l’instància" + +#: front/src/components/library/Radios.vue:9 +msgid "Instance radios" +msgstr "Ràdios de l’instància" + +#: front/src/views/admin/Settings.vue:75 +msgid "Instance settings" +msgstr "Paramètres de l’intància" + +#: front/src/views/instance/Timeline.vue:57 +msgid "Instance Timeline" +msgstr "Flux de l’instància" + +#: front/src/components/auth/Signup.vue:42 +#: front/src/components/manage/users/InvitationForm.vue:11 +msgid "Invitation code" +msgstr "Còdi d’invitacion" + +#: front/src/components/auth/Signup.vue:43 +msgid "Invitation code (optional)" +msgstr "Còdi d’invitacion (opcional)" + +#: front/src/views/admin/users/Base.vue:8 +#: src/views/admin/users/InvitationsList.vue:3 +#: front/src/views/admin/users/InvitationsList.vue:24 +msgid "Invitations" +msgstr "Invitacions" + +#: front/src/App.vue:43 +msgid "Issue tracker" +msgstr "Traçador de problèmas" + +#: front/src/components/library/import/BatchDetail.vue:80 +msgid "Job ID" +msgstr "ID de la tasca" + +#: front/src/components/library/import/BatchList.vue:36 +msgid "Jobs" +msgstr "Tascas" + +#: front/src/components/Home.vue:50 +msgid "Keep a track of your favorite songs" +msgstr "Gardatz una traça de vòstras cançons favoritas" + +#: front/src/components/audio/track/Table.vue:33 +msgid "Keep your PRIVATE_TOKEN secret as it gives access to your account." +msgstr "" +"Gardatz vòstre PRIVATE_TOKEN secrèt estant que permet l’accès a vòstre " +"compte." + +#: front/src/components/manage/users/UsersTable.vue:41 +#: front/src/views/admin/users/UsersDetail.vue:45 +msgid "Last activity" +msgstr "Darrièra activitat" + +#: front/src/views/federation/LibraryDetail.vue:101 +msgid "Last fetched" +msgstr "Darrièra recuperacion" + +#: front/src/components/playlists/PlaylistModal.vue:32 +msgid "Last modification" +msgstr "Darrièra modificacion" + +#: front/src/components/common/ActionTable.vue:39 +msgid "Launch" +msgstr "Aviar" + +#: front/src/components/library/import/BatchDetail.vue:18 +#: front/src/components/library/import/BatchList.vue:35 +msgid "Launch date" +msgstr "Data de lançament" + +#: front/src/components/federation/LibraryForm.vue:31 +msgid "Launch scan" +msgstr "Aviar l’analisi" + +#: front/src/components/Home.vue:10 +msgid "Learn more about this instance" +msgstr "Ne saber mai tocant aquesta instància" + +#: front/src/components/manage/users/InvitationForm.vue:58 +msgid "Leave empty for a random code" +msgstr "Daissar void per obténer un còdi aleatòri" + +#: front/src/components/requests/Form.vue:10 +msgid "Leave this field empty if you're requesting the whole discography." +msgstr "Daissar aqueste camp void se volètz suggerir totas las discografia." + +#: front/src/views/federation/Base.vue:5 +#: src/views/federation/LibraryList.vue:123 +msgid "Libraries" +msgstr "Bibliotècas" + +#: front/src/components/Sidebar.vue:70 +#: front/src/components/federation/LibraryTrackTable.vue:51 +#: front/src/components/instance/Stats.vue:30 +#: front/src/components/manage/users/UsersTable.vue:176 +#: front/src/views/admin/users/UsersDetail.vue:157 +#: front/src/views/federation/LibraryDetail.vue:194 +msgid "Library" +msgstr "Bibliotèca" + +#: front/src/views/admin/library/FilesList.vue:3 +msgid "Library files" +msgstr "Fichièrs de la bibliotèca" + +#: front/src/components/federation/LibraryForm.vue:20 +msgid "Library name" +msgstr "Nom de la bibliotèca" + +#: front/src/views/federation/LibraryDetail.vue:84 +msgid "Library size" +msgstr "Talha de la bibliotèca" + +#: front/src/components/federation/LibraryForm.vue:96 +msgid "library@demo.funkwhale.audio" +msgstr "library@demo.funkwhale.audio" + +#: front/src/App.vue:29 +msgid "Links" +msgstr "Ligams" + +#: front/src/views/instance/Timeline.vue:4 +msgid "Loading timeline..." +msgstr "Cargament del flux d’actualitat..." + +#: front/src/components/favorites/List.vue:5 +msgid "Loading your favorites..." +msgstr "Cargament de vòstres favorits..." + +#: front/src/components/auth/Login.vue:78 +msgid "Log In" +msgstr "Connexion" + +#: front/src/components/auth/Login.vue:4 +msgid "Log in to your Funkwhale account" +msgstr "Connectatz-vos a vòstre compte Funkwhale" + +#: front/src/components/auth/Logout.vue:20 +msgid "Log Out" +msgstr "Desconnexion" + +#: front/src/components/Sidebar.vue:38 +msgid "Logged in as %{ username }" +msgstr "Connectat coma %{ username }" + +#: front/src/components/Sidebar.vue:44 src/components/auth/Login.vue:41 +msgid "Login" +msgstr "Connexion" + +#: front/src/components/Sidebar.vue:43 +msgid "Logout" +msgstr "Desconnexion" + +#: front/src/components/audio/Player.vue:266 +msgid "Looping disabled. Click to switch to single-track looping." +msgstr "" +"Repeticion desactivada. Clicatz per activar la repeticion de la pista " +"actuala." + +#: front/src/components/audio/Player.vue:267 +msgid "Looping on a single track. Click to switch to whole queue looping." +msgstr "" +"Repeticion de la pista actuala. Clicatz per activar la repeticion de tota la " +"fila." + +#: front/src/components/audio/Player.vue:268 +msgid "Looping on whole queue. Click to disable looping." +msgstr "Repeticion de tota la fila, clicatz per desactivar la repeticion." + +#: front/src/components/library/Track.vue:94 +msgid "Lyrics" +msgstr "Paraulas" + +#: front/src/views/admin/library/Base.vue:25 +msgid "Manage library" +msgstr "Gerir la bibliotèca" + +#: front/src/components/playlists/PlaylistModal.vue:3 +msgid "Manage playlists" +msgstr "Gerir las listas de lectura" + +#: front/src/views/admin/users/Base.vue:20 +msgid "Manage users" +msgstr "Gerir los utilizaires" + +#: front/src/views/playlists/List.vue:8 +msgid "Manage your playlists" +msgstr "Gerir vòstras listas de lectura" + +#: front/src/components/manage/library/RequestsTable.vue:197 +msgid "Mark as closed" +msgstr "Marcar coma tampat" + +#: front/src/components/manage/library/RequestsTable.vue:196 +msgid "Mark as imported" +msgstr "Marcar coma importat" + +#: front/src/components/library/import/Main.vue:12 +msgid "Metadata" +msgstr "Metadonadas" + +#: front/src/components/library/import/Main.vue:115 +msgid "" +"Metadata is the data related to the music you want to import. This includes all the information about the artists, albums and tracks. In order to have a high quality library, it is recommended to grab data from the\n" +" \n" +" MusicBrainz\n" +" \n" +" project, which you can think about as the Wikipedia of music." +msgstr "" +"Las metadonadas son d’informacions relativas a la musica que volètz " +"importar. Aquò concerna totas las informacions tocant los artistas, album e " +"pistas. Per dire d’aver de metadonadas de qualitat, es recomandat d’emplegar " +"las metadonadas del projècte\n" +" \n" +" MusicBrainz\n" +" \n" +" , que podètz veire coma lo Wikipèdia de la musica." + +#: front/src/components/Sidebar.vue:48 +#: src/components/library/import/Main.vue:18 +msgid "Music" +msgstr "Musica" + +#: front/src/components/library/import/Main.vue:147 +msgid "Music request" +msgstr "Requèsta musicala" + +#: front/src/components/audio/Player.vue:265 +msgid "Mute" +msgstr "Copar lo son" + +#: front/src/components/Sidebar.vue:34 +msgid "My account" +msgstr "Mon compte" + +#: front/src/components/playlists/Form.vue:74 +msgid "My awesome playlist" +msgstr "Ma lista de lectura tròp crana" + +#: front/src/components/library/radios/Builder.vue:227 +msgid "My awesome radio" +msgstr "Ma ràdio tròp crana" + +#: front/src/components/library/Track.vue:64 +#: src/components/library/Track.vue:75 +#: front/src/components/library/Track.vue:86 +#: front/src/components/manage/library/FilesTable.vue:63 +#: front/src/components/manage/library/FilesTable.vue:69 +#: front/src/components/manage/library/FilesTable.vue:75 +#: front/src/components/manage/library/FilesTable.vue:81 +#: front/src/components/manage/library/RequestsTable.vue:71 +#: front/src/components/manage/library/RequestsTable.vue:75 +#: front/src/components/manage/library/RequestsTable.vue:82 +#: front/src/components/manage/users/UsersTable.vue:61 +#: front/src/views/admin/users/UsersDetail.vue:49 +msgid "N/A" +msgstr "ND" + +#: front/src/components/playlists/PlaylistModal.vue:31 +#: front/src/views/admin/users/UsersDetail.vue:21 +msgid "Name" +msgstr "Nom" + +#: front/src/components/auth/Settings.vue:88 +#: front/src/views/auth/PasswordResetConfirm.vue:14 +msgid "New password" +msgstr "Nòu senhal" + +#: front/src/components/Sidebar.vue:158 +msgid "New tracks will be appended here automatically." +msgstr "Las novèlas pistas seràn automaticament ajustadas aquí." + +#: front/src/components/library/import/Main.vue:29 +msgid "Next step" +msgstr "Etapa seguenta" + +#: front/src/components/audio/Player.vue:263 +msgid "Next track" +msgstr "Pista seguenta" + +#: front/src/components/Sidebar.vue:125 +msgid "No" +msgstr "Non" + +#: front/src/components/Home.vue:103 +msgid "No add-ons, no plugins : you only need a web library" +msgstr "Cap d’extension d’installar, vos cal pas qu’una bibliotèca sul web" + +#: front/src/components/library/Track.vue:102 +msgid "No lyrics available for this track." +msgstr "Cap de paraulas pas disponiblas per aquesta pista." + +#: front/src/components/playlists/Form.vue:81 +msgid "Nobody except me" +msgstr "Degun fòra ieu" + +#: front/src/views/federation/LibraryDetail.vue:32 +msgid "Not following" +msgstr "Pas abonat" + +#: front/src/components/federation/LibraryTrackTable.vue:13 +#: front/src/components/federation/LibraryTrackTable.vue:67 +msgid "Not imported" +msgstr "Pas importat" + +#: front/src/components/manage/users/InvitationsTable.vue:51 +msgid "Not used" +msgstr "Pas utilizat" + +#: front/src/App.vue:37 +msgid "Official website" +msgstr "Site oficial" + +#: front/src/components/auth/Settings.vue:83 +msgid "Old password" +msgstr "Senhal precedent" + +#: front/src/components/library/import/FileUpload.vue:36 +msgid "Once all your files are uploaded, simply click the following button to check the import status." +msgstr "" +"Un còp totes los fichièrs cargats, clicatz lo boton seguent per verificar l’" +"estatut de l’import." + +#: front/src/components/federation/LibraryCard.vue:21 +#: front/src/components/manage/users/InvitationsTable.vue:20 +msgid "Open" +msgstr "Accès liure" + +#: front/src/App.vue:63 +msgid "Options" +msgstr "Opcions" + +#: front/src/components/library/import/Main.vue:93 +msgid "Or" +msgstr "O" + +#: front/src/components/favorites/List.vue:23 +#: front/src/components/federation/LibraryTrackTable.vue:18 +#: front/src/components/library/Artists.vue:15 +#: src/components/library/Radios.vue:33 +#: front/src/components/manage/library/FilesTable.vue:9 +#: front/src/components/manage/library/RequestsTable.vue:9 +#: front/src/components/manage/users/InvitationsTable.vue:9 +#: front/src/components/manage/users/UsersTable.vue:9 +#: front/src/views/federation/LibraryList.vue:18 +#: src/views/playlists/List.vue:17 +msgid "Ordering" +msgstr "Òrdre" + +#: front/src/components/favorites/List.vue:31 +#: front/src/components/federation/LibraryTrackTable.vue:26 +#: front/src/components/library/Artists.vue:23 +#: src/components/library/Radios.vue:41 +#: front/src/components/manage/library/FilesTable.vue:17 +#: front/src/components/manage/library/RequestsTable.vue:17 +#: front/src/components/manage/users/UsersTable.vue:17 +#: front/src/views/federation/LibraryList.vue:26 +#: src/views/playlists/List.vue:25 +msgid "Ordering direction" +msgstr "Direccion" + +#: front/src/components/manage/users/InvitationsTable.vue:38 +msgid "Owner" +msgstr "Proprietari" + +#: front/src/components/PageNotFound.vue:33 +msgid "Page Not Found" +msgstr "Pagina pas trobada" + +#: front/src/components/PageNotFound.vue:7 +msgid "Page not found!" +msgstr "Pagina pas trobada !" + +#: front/src/components/auth/Login.vue:32 src/components/auth/Signup.vue:38 +msgid "Password" +msgstr "Senhal" + +#: front/src/components/auth/SubsonicTokenForm.vue:95 +msgid "Password updated" +msgstr "Senhal actualizat" + +#: front/src/views/auth/PasswordResetConfirm.vue:28 +msgid "Password updated successfully" +msgstr "Senhal corrèctament modificat" + +#: front/src/components/audio/Player.vue:262 +msgid "Pause track" +msgstr "Pausar" + +#: front/src/components/federation/LibraryFollowTable.vue:46 +#: front/src/components/library/import/BatchDetail.vue:33 +#: front/src/components/library/import/BatchDetail.vue:69 +#: front/src/components/library/import/BatchList.vue:14 +#: front/src/components/library/import/FileUpload.vue:59 +#: front/src/components/manage/library/RequestsTable.vue:27 +#: front/src/components/manage/library/RequestsTable.vue:63 +msgid "Pending" +msgstr "En espèra" + +#: front/src/components/federation/LibraryFollowTable.vue:11 +#: front/src/views/federation/LibraryDetail.vue:26 +msgid "Pending approval" +msgstr "En espèra de validacion" + +#: front/src/components/Sidebar.vue:217 +msgid "Pending follow requests" +msgstr "Demandas d’abonament en espèra" + +#: front/src/components/Sidebar.vue:216 src/views/admin/library/Base.vue:26 +msgid "Pending import requests" +msgstr "Requèstas en espèra" + +#: front/src/components/requests/Form.vue:26 src/views/federation/Base.vue:36 +msgid "Pending requests" +msgstr "Requèsta en espèra" + +#: front/src/components/manage/users/UsersTable.vue:42 +#: front/src/views/admin/users/UsersDetail.vue:68 +msgid "Permissions" +msgstr "Autorizacions" + +#: front/src/components/audio/PlayButton.vue:9 +#: src/components/library/Track.vue:30 +msgid "Play" +msgstr "Legir" + +#: front/src/components/audio/album/Card.vue:50 +#: front/src/components/audio/artist/Card.vue:44 +#: src/components/library/Album.vue:28 front/src/views/playlists/Detail.vue:23 +msgid "Play all" +msgstr "O legir tot" + +#: front/src/components/library/Artist.vue:26 +msgid "Play all albums" +msgstr "Legir totes los albums" + +#: front/src/components/audio/PlayButton.vue:58 +msgid "Play immediatly" +msgstr "Legir sulcòp" + +#: front/src/components/audio/PlayButton.vue:15 +msgid "Play next" +msgstr "Legir en seguida" + +#: front/src/components/audio/PlayButton.vue:16 +msgid "Play now" +msgstr "Legir ara" + +#: front/src/components/audio/Player.vue:261 +msgid "Play track" +msgstr "Legir" + +#: front/src/views/playlists/Detail.vue:90 +msgid "Playlist" +msgstr "Lista de lectura" + +#: front/src/views/playlists/Detail.vue:12 +msgid "Playlist containing %{ count } track, by %{ username }" +msgid_plural "Playlist containing %{ count } tracks, by %{ username }" +msgstr[0] "Lista de lectura contenent %{ count } pista, per %{ username }" +msgstr[1] "Lista de lectura contenent %{ count } pistas, per %{ username }" + +#: front/src/components/playlists/Form.vue:9 +msgid "Playlist created" +msgstr "Lista de lectura creada" + +#: front/src/components/playlists/Editor.vue:4 +msgid "Playlist editor" +msgstr "Editor de lista de lectura" + +#: front/src/components/playlists/Form.vue:21 +msgid "Playlist name" +msgstr "Nom de la lista de lectura" + +#: front/src/components/playlists/Form.vue:6 +msgid "Playlist updated" +msgstr "Lista de lectura actualizada" + +#: front/src/components/playlists/Form.vue:25 +msgid "Playlist visibility" +msgstr "Visibilitat de la lista de lectura" + +#: front/src/components/Sidebar.vue:56 src/components/library/Home.vue:16 +#: front/src/components/library/Library.vue:13 src/views/admin/Settings.vue:83 +#: front/src/views/playlists/List.vue:103 +msgid "Playlists" +msgstr "Listas de lectura" + +#: front/src/components/Home.vue:56 +msgid "Playlists? We got them" +msgstr "Las listas de lectura ? Son aicí !" + +#: front/src/components/auth/Settings.vue:79 +msgid "Please double-check your password is correct" +msgstr "Mercés de verificar que lo senhal es corrèct" + +#: front/src/components/auth/Login.vue:9 +msgid "Please double-check your username/password couple is correct" +msgstr "Mercés de verificar que lo nom d’utilizaire e lo senhal son corrècts" + +#: front/src/components/auth/Settings.vue:46 +msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px." +msgstr "" +"PNG, GIF o JPG. 2Mo al maximum. L’imatge serà retalhat en 400×400 pixèls." + +#: front/src/components/library/import/Main.vue:26 +msgid "Previous step" +msgstr "Etapa precedenta" + +#: front/src/components/audio/Player.vue:260 +msgid "Previous track" +msgstr "Pista precedenta" + +#: front/src/views/auth/EmailConfirm.vue:26 +#: front/src/views/auth/PasswordResetConfirm.vue:31 +msgid "Proceed to login" +msgstr "Contunhar cap a la pagina de connexion" + +#: front/src/components/federation/LibraryTrackTable.vue:50 +msgid "Published date" +msgstr "Data de sortida" + +#: front/src/components/library/import/ArtistImport.vue:17 +msgid "Query template" +msgstr "Modèl de recèrca" + +#: front/src/components/Sidebar.vue:20 +msgid "Queue" +msgstr "Fila" + +#: front/src/components/audio/Player.vue:203 +msgid "Queue shuffled!" +msgstr "La fila es estada mesclada !" + +#: front/src/views/radios/Detail.vue:80 +msgid "Radio" +msgstr "Ràdio" + +#: front/src/components/library/radios/Builder.vue:226 +msgid "Radio Builder" +msgstr "Editor de ràdio" + +#: front/src/components/library/radios/Builder.vue:15 +msgid "Radio created" +msgstr "Nom de la ràdio" + +#: front/src/components/library/radios/Builder.vue:21 +msgid "Radio name" +msgstr "Nom de la ràdio" + +#: front/src/components/library/radios/Builder.vue:12 +msgid "Radio updated" +msgstr "Ràdio actualizada" + +#: front/src/components/library/Library.vue:10 +#: src/components/library/Radios.vue:141 +msgid "Radios" +msgstr "Ràdios" + +#: front/src/views/instance/Timeline.vue:7 +msgid "Recent activity on this instance" +msgstr "Activitats recentas d’aquesta instància" + +#: front/src/components/library/Home.vue:24 +msgid "Recently added" +msgstr "Ajustats i a res" + +#: front/src/components/library/Home.vue:11 +msgid "Recently favorited" +msgstr "Ajustadas als favorits i a res" + +#: front/src/components/library/Home.vue:6 +msgid "Recently listened" +msgstr "Escotadas i a res" + +#: front/src/components/library/import/BatchDetail.vue:81 +msgid "Recording MusicBrainz ID" +msgstr "ID MuzicBrainz de l’enregistrament" + +#: front/src/views/admin/users/UsersDetail.vue:84 +#: front/src/views/federation/LibraryDetail.vue:122 +msgid "Refresh" +msgstr "Actualizar" + +#: front/src/components/federation/LibraryFollowTable.vue:42 +msgid "Refused" +msgstr "Refusat" + +#: front/src/components/auth/Profile.vue:12 +msgid "Registered since %{ date }" +msgstr "Marcat dempuèi %{ date }" + +#: front/src/components/auth/Signup.vue:9 +msgid "Registration are closed on this instance, you will need an invitation code to signup." +msgstr "" +"Las inscripcions son tampadas sus aquestà instància, aurètz de téner un còdi " +"d’invitacion per vos marcar." + +#: front/src/components/manage/users/UsersTable.vue:71 +msgid "regular user" +msgstr "utilizaire estandard" + +#: front/src/components/library/radios/Filter.vue:59 +msgid "Remove" +msgstr "Tirar" + +#: front/src/components/auth/Settings.vue:58 +msgid "Remove avatar" +msgstr "Suprimir l’avatar" + +#: front/src/components/favorites/TrackFavoriteIcon.vue:19 +msgid "Remove from favorites" +msgstr "Tirar dels favorits" + +#: front/src/components/auth/SubsonicTokenForm.vue:34 +#: front/src/components/auth/SubsonicTokenForm.vue:37 +msgid "Request a new password" +msgstr "Demandar un nòu senhal" + +#: front/src/components/auth/SubsonicTokenForm.vue:35 +msgid "Request a new Subsonic API password?" +msgstr "Demandar un nòu senhal per l’API Subsonic ?" + +#: front/src/components/auth/SubsonicTokenForm.vue:43 +msgid "Request a password" +msgstr "Demandar un senhal" + +#: front/src/App.vue:35 +msgid "Request music" +msgstr "Demandas de musica" + +#: front/src/views/library/MusicRequest.vue:4 +#: src/views/library/MusicRequest.vue:21 +msgid "Request some music" +msgstr "Demandatz de musica" + +#: front/src/components/requests/Form.vue:20 +msgid "Request submitted!" +msgstr "Requèsta enviada" + +#: front/src/components/library/import/BatchDetail.vue:49 +msgid "Rerun errored jobs" +msgstr "Tornar aviar las tascas fracassadas" + +#: front/src/components/library/import/BatchDetail.vue:187 +msgid "Rerun job" +msgstr "Reaviar la tasca" + +#: front/src/components/auth/Login.vue:34 src/views/auth/PasswordReset.vue:4 +#: front/src/views/auth/PasswordReset.vue:52 +msgid "Reset your password" +msgstr "Reïnicializar lo senhal" + +#: front/src/components/library/import/TrackImport.vue:31 +msgid "Result %{ current }/%{ total }" +msgstr "Resultat %{ current }/%{ total }" + +#: front/src/components/favorites/List.vue:38 +#: src/components/library/Artists.vue:30 +#: front/src/components/library/Radios.vue:52 +#: src/views/federation/LibraryList.vue:33 +#: front/src/views/playlists/List.vue:32 +msgid "Results per page" +msgstr "Resultats per pagina" + +#: front/src/components/admin/SettingsGroup.vue:63 +#: front/src/components/library/radios/Builder.vue:29 +msgid "Save" +msgstr "Enregistrar" + +#: front/src/views/federation/LibraryDetail.vue:112 +msgid "Scan triggered!" +msgstr "Analisi aviat !" + +#: front/src/components/federation/LibraryTrackTable.vue:5 +#: front/src/components/library/Artists.vue:10 +#: src/components/library/Radios.vue:29 +#: front/src/components/library/import/BatchDetail.vue:62 +#: front/src/components/library/import/BatchList.vue:7 +#: front/src/components/manage/library/FilesTable.vue:5 +#: front/src/components/manage/library/RequestsTable.vue:5 +#: front/src/components/manage/users/InvitationsTable.vue:5 +#: front/src/components/manage/users/UsersTable.vue:5 +#: front/src/views/federation/LibraryList.vue:14 +#: src/views/playlists/List.vue:13 +msgid "Search" +msgstr "Recercar" + +#: front/src/components/library/import/Main.vue:85 +msgid "Search an entity you want to import:" +msgstr "Recercar una ressorga que volètz importar :" + +#: front/src/components/manage/library/RequestsTable.vue:180 +msgid "Search by artist, username, comment..." +msgstr "Recercar per artista, nom d’utilizaire, comentari..." + +#: front/src/components/library/import/BatchDetail.vue:188 +msgid "Search by source..." +msgstr "Recercar per font..." + +#: front/src/components/library/import/BatchList.vue:116 +msgid "Search by submitter, source..." +msgstr "Recercar per utilizaire, font..." + +#: front/src/components/federation/LibraryTrackTable.vue:182 +#: front/src/components/manage/library/FilesTable.vue:175 +msgid "Search by title, artist, domain..." +msgstr "Recercar per títol, artista, domeni..." + +#: front/src/components/federation/LibraryFollowTable.vue:140 +msgid "Search by username, domain..." +msgstr "Recercar per nom d’utilizaire, domeni..." + +#: front/src/components/manage/users/InvitationsTable.vue:152 +msgid "Search by username, email, code..." +msgstr "Recercar per nom d’utilizaire, corrièl, còdi..." + +#: front/src/components/manage/users/UsersTable.vue:162 +msgid "Search by username, email, name..." +msgstr "Recercar per nom d’utilizaire, corrièl, nom..." + +#: front/src/components/audio/SearchBar.vue:20 +msgid "Search for artists, albums, tracks..." +msgstr "Recercar d’artistas, d’albums, de pistas..." + +#: front/src/components/audio/Search.vue:2 +msgid "Search for some music" +msgstr "Recercar de musica" + +#: front/src/components/library/Track.vue:105 +msgid "Search on lyrics.wikia.com" +msgstr "Recercar sus lyrics.wikia.com" + +#: front/src/components/library/Album.vue:33 +#: src/components/library/Artist.vue:31 +#: front/src/components/library/Track.vue:40 +msgid "Search on Wikipedia" +msgstr "Recercar sus Wikipèdia" + +#: front/src/components/library/import/TrackImport.vue:42 +msgid "Search query" +msgstr "Recèrca" + +#: front/src/views/admin/Settings.vue:15 +msgid "Sections" +msgstr "Seccions" + +#: front/src/components/library/radios/Builder.vue:41 +msgid "Select a filter" +msgstr "Seleccionar un filtre" + +#: front/src/components/common/ActionTable.vue:61 +msgid "Select all %{ total } elements" +msgid_plural "Select all %{ total } elements" +msgstr[0] "Seleccionar l’ensemble dels %{ total } element" +msgstr[1] "Seleccionar l’ensemble dels %{ total } elements" + +#: front/src/components/library/import/FileUpload.vue:22 +msgid "Select files to upload..." +msgstr "Seleccionar los fichièrs per enviar..." + +#: front/src/components/common/ActionTable.vue:69 +msgid "Select only current page" +msgstr "Seleccionar solament la pagina actuala" + +#: front/src/components/library/import/Main.vue:19 +msgid "Select relevant sources or files for import" +msgstr "Seleccionar las fonts o los fichièrs d’importar" + +#: front/src/components/federation/LibraryCard.vue:43 +msgid "Send a follow request" +msgstr "Enviar una demanda d’abonament" + +#: front/src/components/Sidebar.vue:97 +#: src/components/manage/users/UsersTable.vue:184 +#: front/src/views/admin/users/UsersDetail.vue:165 +msgid "Settings" +msgstr "Paramètres" + +#: front/src/components/auth/Settings.vue:10 +msgid "Settings updated" +msgstr "Paramètres actualizats" + +#: front/src/components/admin/SettingsGroup.vue:11 +msgid "Settings updated successfully." +msgstr "Paramètres corrèctament modificats." + +#: front/src/components/auth/Profile.vue:24 +msgid "Settings..." +msgstr "Paramètres..." + +#: front/src/components/manage/users/InvitationForm.vue:27 +msgid "Share link" +msgstr "Ligam de partatge" + +#: front/src/components/audio/artist/Card.vue:30 +msgid "Show 1 more album" +msgid_plural "Show %{ count } more albums" +msgstr[0] "Mostrar 1 album mai" +msgstr[1] "Mostrar %{ count } albums mai" + +#: front/src/components/audio/album/Card.vue:40 +msgid "Show 1 more track" +msgid_plural "Show %{ count } more tracks" +msgstr[0] "Mostrar 1 pista mai" +msgstr[1] "Mostrar %{ count } pistas mai" + +#: front/src/components/forms/PasswordInput.vue:25 +msgid "Show/hide password" +msgstr "Mostrar/amagar lo senhal" + +#: front/src/components/federation/LibraryFollowTable.vue:97 +#: front/src/components/federation/LibraryTrackTable.vue:98 +#: front/src/components/library/import/BatchDetail.vue:128 +#: front/src/components/library/import/BatchList.vue:73 +#: front/src/components/manage/library/FilesTable.vue:97 +#: front/src/components/manage/library/RequestsTable.vue:104 +#: front/src/components/manage/users/InvitationsTable.vue:76 +#: front/src/components/manage/users/UsersTable.vue:87 +msgid "Showing results %{ start }-%{ end } on %{ total }" +msgstr "Afichatge dels resultats %{ start }-%{ end } sus %{ total }" + +#: front/src/components/audio/Player.vue:269 +msgid "Shuffle your queue" +msgstr "Mesclar la fila" + +#: front/src/components/auth/Signup.vue:95 +msgid "Sign Up" +msgstr "Inscripcion" + +#: front/src/components/manage/users/UsersTable.vue:40 +#: front/src/views/admin/users/UsersDetail.vue:37 +msgid "Sign-up" +msgstr "Inscripcion" + +#: front/src/components/audio/track/Table.vue:31 +msgid "Simply copy paste the snippet below into a terminal to launch the download." +msgstr "Copiatz lo tèxte çai-jos dins un terminal per lançar lo telecargament." + +#: front/src/components/library/Track.vue:69 +#: front/src/components/library/import/FileUpload.vue:44 +#: front/src/components/manage/library/FilesTable.vue:44 +msgid "Size" +msgstr "Talha" + +#: front/src/components/library/import/BatchDetail.vue:37 +#: front/src/components/library/import/BatchDetail.vue:72 +msgid "Skipped" +msgstr "Ignorat" + +#: front/src/components/requests/Form.vue:3 +msgid "Something's missing in the library? Let us know what you would like to listen!" +msgstr "Manca quicòm a la bibliotèca ? Digatz-nos çò que volètz escotar !" + +#: front/src/components/audio/Search.vue:25 +msgid "Sorry, we did not found any album matching your query" +msgstr "O planhèm, avèm pas trobat cap d’album que correspond a vòstra recèrca" + +#: front/src/components/audio/Search.vue:16 +msgid "Sorry, we did not found any artist matching your query" +msgstr "" +"O planhèm, avèm pas trobat cap d’artista que correspond a vòstra recèrca" + +#: front/src/components/library/import/BatchDetail.vue:82 +#: front/src/components/library/import/BatchList.vue:38 +#: front/src/components/library/import/TrackImport.vue:17 +msgid "Source" +msgstr "Font" + +#: front/src/App.vue:41 +msgid "Source code" +msgstr "Còdi font" + +#: front/src/App.vue:40 +msgid "Source code (%{version})" +msgstr "Còdi font (%{version})" + +#: front/src/components/auth/Profile.vue:20 +#: front/src/components/manage/users/UsersTable.vue:70 +msgid "Staff member" +msgstr "Membre de la còla" + +#: front/src/components/radios/Button.vue:4 +msgid "Start" +msgstr "Aviar" + +#: front/src/components/library/import/FileUpload.vue:28 +msgid "Start Upload" +msgstr "Aviar lo mandadís" + +#: front/src/views/admin/Settings.vue:86 +msgid "Statistics" +msgstr "Estatisticas" + +#: front/src/components/federation/LibraryFollowTable.vue:23 +#: front/src/components/federation/LibraryTrackTable.vue:46 +#: front/src/components/library/import/BatchDetail.vue:66 +#: front/src/components/library/import/BatchDetail.vue:83 +#: front/src/components/library/import/BatchList.vue:11 +#: front/src/components/library/import/BatchList.vue:37 +#: front/src/components/library/import/FileUpload.vue:45 +#: front/src/components/manage/library/RequestsTable.vue:24 +#: front/src/components/manage/library/RequestsTable.vue:48 +#: front/src/components/manage/users/InvitationsTable.vue:17 +#: front/src/components/manage/users/InvitationsTable.vue:39 +#: front/src/components/manage/users/UsersTable.vue:43 +msgid "Status" +msgstr "Estatut" + +#: front/src/components/radios/Button.vue:3 +msgid "Stop" +msgstr "Arrestar" + +#: front/src/components/Sidebar.vue:159 +msgid "Stop radio" +msgstr "Arrestar la ràdio" + +#: front/src/components/library/import/FileUpload.vue:32 +msgid "Stop Upload" +msgstr "Arrestar lo mandadís" + +#: front/src/App.vue:9 src/components/requests/Form.vue:17 +msgid "Submit" +msgstr "Validar" + +#: front/src/components/requests/Form.vue:22 +msgid "Submit another request" +msgstr "Enviar una novèla requèsta" + +#: front/src/components/library/import/BatchDetail.vue:26 +#: front/src/components/library/import/BatchList.vue:39 +msgid "Submitted by" +msgstr "Prepausat per" + +#: front/src/views/admin/Settings.vue:85 +msgid "Subsonic" +msgstr "Subsonic" + +#: front/src/components/auth/SubsonicTokenForm.vue:2 +msgid "Subsonic API password" +msgstr "Senhal de l’API Subsonic" + +#: front/src/components/library/import/BatchDetail.vue:71 +#: front/src/components/library/import/BatchList.vue:16 +#: front/src/components/library/import/FileUpload.vue:56 +msgid "Success" +msgstr "Succès" + +#: front/src/App.vue:11 +msgid "Suggested choices" +msgstr "Suggestions" + +#: front/src/components/playlists/Editor.vue:9 +msgid "Syncing changes to server..." +msgstr "Sincronizacion dels cambiaments amb lo servidor..." + +#: front/src/components/Home.vue:26 +msgid "That's simple: we loved Grooveshark and we want to build something even better." +msgstr "" +"Es simple : nos agradava Grooveshark e voliam construire quicòm de melhor." + +#: front/src/components/requests/Form.vue:73 +msgid "The Beatles, Mickael Jackson…" +msgstr "Los Beatles, Mickael Jackson…" + +#: front/src/App.vue:59 +msgid "The funkwhale logo was kindly designed and provided by Francis Gading." +msgstr "Lo logotipe de Funkwhale foguèt dessenhat e fornit per Francis Gading." + +#: front/src/components/Home.vue:124 +msgid "The plaform is free and open-source, you can install it and modify it without worries" +msgstr "" +"La plataforma es gratuita e liura, podètz l’installar e la modificar sens " +"cap de limit" + +#: front/src/components/auth/SubsonicTokenForm.vue:4 +msgid "The Subsonic API is not available on this Funkwhale instance." +msgstr "L’API Subsonic es pas disponibla per aquesta instància Funkwhale." + +#: front/src/components/requests/Form.vue:74 +msgid "The White Album, Thriller…" +msgstr "L'Album Blanc, Thriller…" + +#: front/src/components/audio/track/Table.vue:30 +msgid "There is currently no way to download directly multiple tracks from funkwhale as a ZIP archive. However, you can use a command line tools such as cURL to easily download a list of tracks." +msgstr "" +"Es pas possible pel moment de telecargar un ensemble de pistas coma un " +"archiu ZIP. Pr’aquò, podètz utilizar una aisina en linha de comanda coma " +"cURL per telecargar facilament una lista de pistas." + +#: front/src/components/library/import/Main.vue:149 +msgid "This import will be associated with the music request below. After the import is finished, the request will be marked as fulfilled." +msgstr "" +"Aqueste import serà associat a la requèsta çai-jos. Un còp acabat, la " +"requèsta sera marcada coma completada." + +#: front/src/views/federation/LibraryDetail.vue:195 +msgid "This indicate if the remote library granted you access" +msgstr "Aquò indica se la bibliotèca alonhada vos a donat l’accès" + +#: front/src/components/auth/Profile.vue:16 +msgid "This is you!" +msgstr "Sètz vos !" + +#: front/src/components/common/ActionTable.vue:37 +msgid "This may affect a lot of elements, please double check this is really what you want." +msgstr "" +"Aquesta operacion pòt afectar mantun elements, mercés de verificar s’es ben " +"çò que desiratz." + +#: front/src/components/audio/PlayButton.vue:61 +msgid "This track is not imported and cannot be played" +msgstr "Aquesta pista es pas importada e òm pòt pas la legir" + +#: front/src/views/playlists/Detail.vue:37 +msgid "This will completely delete this playlist and cannot be undone." +msgstr "" +"Aquò escafarà aquesta lista de lectura per totjorn e poirà pas èsser anullat." + +#: front/src/views/radios/Detail.vue:27 +msgid "This will completely delete this radio and cannot be undone." +msgstr "Aquò escafarà aquesta ràdio per totjorn e poirà pas èsser anullat." + +#: front/src/components/auth/SubsonicTokenForm.vue:51 +msgid "This will completely disable access to the Subsonic API using from account." +msgstr "" +"Aquò desactivarà complètament l’accès a l’API Subsonic de vòstre compte " +"estant." + +#: front/src/App.vue:137 +msgid "This will erase your local data and disconnect you, do you want to continue?" +msgstr "" +"Aquò escafarà vòstras donadas localas e vos desconnectarà, volètz contunhar ?" + +#: front/src/components/auth/SubsonicTokenForm.vue:36 +msgid "This will log you out from existing devices that use the current password." +msgstr "" +"Aquò vos desconnectarà de totes los periferics qu’utilizan aqueste senhal." + +#: front/src/components/playlists/Editor.vue:44 +msgid "This will remove all tracks from this playlist and cannot be undone." +msgstr "" +"Aquò escafarà totas las pistas de la lista de lectura e poirà pas èsser " +"anullat." + +#: front/src/components/audio/track/Table.vue:6 +#: front/src/components/federation/LibraryTrackTable.vue:47 +#: front/src/components/manage/library/FilesTable.vue:37 +msgid "Title" +msgstr "Títol" + +#: front/src/components/audio/SearchBar.vue:27 +#: src/components/library/Track.vue:174 +#: front/src/components/library/import/BatchDetail.vue:84 +#: front/src/components/metadata/Search.vue:138 +msgid "Track" +msgstr "Pista" + +#: front/src/components/library/Track.vue:53 +msgid "Track information" +msgstr "Informacions de la pista" + +#: front/src/components/library/radios/Filter.vue:44 +msgid "Track matching filter" +msgstr "Pista correspondent al filtre" + +#: front/src/components/instance/Stats.vue:54 +msgid "tracks" +msgstr "pistas" + +#: front/src/components/library/Album.vue:43 +#: front/src/components/playlists/PlaylistModal.vue:33 +#: front/src/views/federation/Base.vue:8 src/views/playlists/Detail.vue:50 +#: front/src/views/radios/Detail.vue:34 +msgid "Tracks" +msgstr "Pistas" + +#: front/src/views/federation/LibraryDetail.vue:125 +msgid "Tracks available in this library" +msgstr "Pistas disponiblas dins aquesta bibliotèca" + +#: front/src/components/library/Artist.vue:54 +msgid "Tracks by this artist" +msgstr "Pistas d’aqueste artista" + +#: front/src/components/instance/Stats.vue:25 +msgid "Tracks favorited" +msgstr "Pistas en favorits" + +#: front/src/components/instance/Stats.vue:19 +msgid "tracks listened" +msgstr "pistas escotadas" + +#: front/src/views/federation/LibraryDetail.vue:109 +msgid "Trigger scan" +msgstr "Aviar un analisi" + +#: front/src/components/manage/library/FilesTable.vue:41 +msgid "Type" +msgstr "Tipe" + +#: front/src/components/About.vue:15 +msgid "Unfortunately, owners of this instance did not yet take the time to complete this page." +msgstr "" +"Malurosament, los gestionaris d’aquesta instància completèron pas aquesta " +"pagina." + +#: front/src/views/federation/LibraryDetail.vue:95 +msgid "Unknown" +msgstr "Desconegut" + +#: front/src/components/Home.vue:37 +msgid "Unlimited music" +msgstr "Musica sens cap de limit" + +#: front/src/components/audio/Player.vue:264 +msgid "Unmute" +msgstr "Restablir lo son" + +#: front/src/components/auth/Settings.vue:50 +msgid "Update avatar" +msgstr "Actualizar l’avatar" + +#: front/src/components/playlists/Form.vue:33 +msgid "Update playlist" +msgstr "Actualizar la lista de lectura" + +#: front/src/components/auth/Settings.vue:27 +msgid "Update settings" +msgstr "Actualizar los paramètres" + +#: front/src/views/auth/PasswordResetConfirm.vue:21 +msgid "Update your password" +msgstr "Actualizar vòstre senhal" + +#: front/src/components/manage/users/UsersTable.vue:172 +#: front/src/views/admin/users/UsersDetail.vue:153 +msgid "Upload" +msgstr "Mandadís" + +#: front/src/components/auth/Settings.vue:45 +msgid "Upload a new avatar" +msgstr "Enviar un nòu avatar" + +#: front/src/components/library/import/Main.vue:7 +msgid "Uploaded files or external source" +msgstr "Fichièrs enviats o font extèrna" + +#: front/src/components/library/import/FileUpload.vue:57 +msgid "Uploading..." +msgstr "Mandadís en cors..." + +#: front/src/App.vue:45 +msgid "Use another instance" +msgstr "Utilizar una autra instància" + +#: front/src/components/requests/Form.vue:75 +msgid "Use this comment box to add details to your request if needed" +msgstr "Utilizatz aqueste camp per ajustar de detalhs a vòstra demanda, se cal" + +#: front/src/views/federation/LibraryDetail.vue:196 +msgid "Use this flag to enable/disable federation with this library" +msgstr "" +"Utilizatz aqueste paramètre per activar/desactivar la deferacion amb aquesta " +"bibliotèca" + +#: front/src/views/auth/PasswordReset.vue:12 +msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password." +msgstr "" +"Garnissètz aqueste formulari per demandar un nòu senhal. Auretz un corrièl a " +"vòstra adreça indicada contenent las consignas de reïnicializacion." + +#: front/src/components/federation/LibraryForm.vue:6 +msgid "Use this form to scan an instance and setup federation." +msgstr "" +"Utilizatz aqueste formulari per analizar lo catalòg d’una instància e " +"establir la federacion." + +#: front/src/components/manage/users/InvitationsTable.vue:49 +msgid "Used" +msgstr "Utilizat" + +#: front/src/components/manage/library/RequestsTable.vue:47 +msgid "User" +msgstr "Utilizaire" + +#: front/src/components/instance/Stats.vue:5 +msgid "User activity" +msgstr "Activitat dels utilizaires" + +#: front/src/components/library/Radios.vue:20 +msgid "User radios" +msgstr "Ràdios dels utilizaires" + +#: front/src/components/auth/Signup.vue:19 +#: front/src/components/manage/users/UsersTable.vue:37 +msgid "Username" +msgstr "Nom d’utilizaire" + +#: front/src/components/auth/Login.vue:15 +msgid "Username or email" +msgstr "Nom d’utilizaire o corrièl" + +#: front/src/components/instance/Stats.vue:13 +msgid "users" +msgstr "utilizaire" + +#: front/src/components/Sidebar.vue:103 src/views/admin/Settings.vue:81 +#: front/src/views/admin/users/Base.vue:5 src/views/admin/users/UsersList.vue:3 +#: front/src/views/admin/users/UsersList.vue:21 +msgid "Users" +msgstr "Utilizaires" + +#: front/src/components/library/Album.vue:37 +#: src/components/library/Artist.vue:35 +#: front/src/components/library/Track.vue:44 +#: front/src/components/library/import/ArtistImport.vue:131 +#: front/src/components/metadata/ArtistCard.vue:49 +#: front/src/components/metadata/ReleaseCard.vue:53 +msgid "View on MusicBrainz" +msgstr "Veire sus MusicBrainz" + +#: front/src/components/playlists/PlaylistModal.vue:20 +msgid "We cannot add the track to a playlist" +msgstr "Podèm pas ajustar aquesta pista a una lista de lectura" + +#: front/src/components/playlists/Form.vue:14 +msgid "We cannot create the playlist" +msgstr "Podèm pas crear aquesta lista de lectura" + +#: front/src/components/auth/Signup.vue:13 +msgid "We cannot create your account" +msgstr "Podèm pas crear vòstre compte" + +#: front/src/components/auth/Login.vue:7 +msgid "We cannot log you in" +msgstr "Error pendent la connexion" + +#: front/src/components/auth/Settings.vue:38 +msgid "We cannot save your avatar" +msgstr "Podèm pas enregistrar vòstre avatar" + +#: front/src/components/auth/Settings.vue:14 +msgid "We cannot save your settings" +msgstr "Podèm pas enregistrar vòstres paramètres" + +#: front/src/components/Home.vue:130 +msgid "We do not track you or bother you with ads" +msgstr "Vos pistam pas e vos mostram pas cap de reclama" + +#: front/src/components/library/import/FileUpload.vue:5 +msgid "We recommend using Picard for that purpose." +msgstr "Vos recomandam d’utilizar lo logicial Picard per aquò far." + +#: front/src/components/Home.vue:7 +msgid "We think listening to music should be simple." +msgstr "Pensam que l’accès a la musica deuriá èsser simple." + +#: front/src/components/PageNotFound.vue:10 +msgid "We're sorry, the page you asked for does not exist:" +msgstr "O planhèm, la pagina demandada existís pas :" + +#: front/src/components/requests/Form.vue:21 +msgid "We've received your request, you'll get some groove soon ;)" +msgstr "Avèm ben recebut vòstra requèsta, aurètz lèu de novèlas ;)" + +#: front/src/components/Home.vue:152 +msgid "Welcome" +msgstr "La benvenguda" + +#: front/src/components/Home.vue:5 +msgid "Welcome on Funkwhale" +msgstr "La benvenguda a Funkwhale" + +#: front/src/components/library/import/Main.vue:114 +msgid "What is metadata?" +msgstr "Qu’es aquò las metadonadas ?" + +#: front/src/views/federation/LibraryDetail.vue:197 +msgid "When enabled, auto importing will automatically import new tracks published in this library" +msgstr "" +"S’aqueste paramètre es activat, las novèlas pistas ajustadas a aquesta " +"bibliotèca seràn automaticament importadas" + +#: front/src/components/Home.vue:24 +msgid "Why funkwhale?" +msgstr "Perque Funkwhale ?" + +#: front/src/components/Sidebar.vue:124 +msgid "Yes" +msgstr "Òc" + +#: front/src/components/auth/Logout.vue:8 +msgid "Yes, log me out!" +msgstr "Òc-ben, desconnectatz-me !" + +#: front/src/components/auth/Logout.vue:7 +msgid "You are currently logged in as %{ username }" +msgstr "Sètz connectat coma %{ username }" + +#: front/src/components/library/import/Main.vue:111 +msgid "You can also skip this step and enter metadata manually." +msgstr "Podètz passar aquesta etapa e dintrar las metadonadas manualament." + +#: front/src/components/Home.vue:136 +msgid "You can invite friends and family to your instance so they can enjoy your music" +msgstr "" +"Podètz convidar vòstres amics e vòstra familha a aquesta instància per que " +"pòscan profeitar de vòstra musica" + +#: front/src/components/library/radios/Builder.vue:7 +msgid "You can use this interface to build your own custom radio, which will play tracks according to your criteria." +msgstr "" +"Podètz utilizar aquesta interfàcia per realizar vòstra pròpria ràdio " +"personalizada, que jogarà las listas segon los critèris indicats." + +#: front/src/components/auth/SubsonicTokenForm.vue:8 +msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance." +msgstr "" +"Podètz los utilizar per profeitar de vòstras listas de lectura e de vòstra " +"musica en mòde fòra linha sus vòstre mobil, tableta, per exemple." + +#: front/src/components/Sidebar.vue:156 +msgid "You have a radio playing" +msgstr "Escotatz una ràdio" + +#: front/src/App.vue:6 +msgid "You need to select an instance in order to continue" +msgstr "Vos cal causir una instància per contunhar" + +#: front/src/components/auth/Settings.vue:100 +msgid "You will be logged out from this session and have to log in with the new one" +msgstr "" +"Sètz per èsser desconnectat d’aquesta session e vos caldrà vos connectar amb " +"lo nòu senhal" + +#: front/src/components/auth/Settings.vue:71 +msgid "You will have to update your password on your clients that use this password." +msgstr "" +"Vos caldrà actualizar lo senhal sus totes los clients qu’utilizan aqueste " +"senhal." + +#: front/src/components/library/import/Main.vue:103 +msgid "You will import:" +msgstr "Sètz per importar :" + +#: front/src/views/auth/EmailConfirm.vue:24 +msgid "Your email address was confirmed, you can now use the service without limitations." +msgstr "" +"Vòstra adreça electronica es confirmada, podètz ara utilizar lo servici sens " +"cap de limitacions." + +#: front/src/components/favorites/List.vue:109 +msgid "Your Favorites" +msgstr "Vòstres favorits" + +#: front/src/components/Home.vue:117 +msgid "Your music, your way" +msgstr "Vòstra musica, coma volètz" + +#: front/src/views/auth/PasswordResetConfirm.vue:29 +msgid "Your password has been updated successfully." +msgstr "Vòstre senhal es corrèctament cambiat." + +#: front/src/components/auth/Settings.vue:101 +msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password" +msgstr "" +"Vòstre senhal Subsonic serà remplaçat per un nòu aleatòri, aquò vos " +"desconnectarà de totes los periferics qu’utilizan l’ancian senhal" + +#: front/src/components/audio/PlayButton.vue:156 +msgid "%{ count } track was added to your queue" +msgid_plural "%{ count } tracks were added to your queue" +msgstr[0] "%{ count } pista ajustada a la fila" +msgstr[1] "%{ count } pistas ajustadas a la fila" diff --git a/front/locales/pl/LC_MESSAGES/app.po b/front/locales/pl/LC_MESSAGES/app.po new file mode 100644 index 000000000..7cf384b59 --- /dev/null +++ b/front/locales/pl/LC_MESSAGES/app.po @@ -0,0 +1,2478 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the front package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: front 1.0.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-07-22 14:12+0200\n" +"PO-Revision-Date: 2018-07-20 19:03+0000\n" +"Last-Translator: Marcin Mikołajczak \n" +"Language-Team: \n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 2.20\n" + +#: front/src/components/playlists/PlaylistModal.vue:9 +msgid "\"%{ title }\", by %{ artist }" +msgstr "„%{ title }”, od %{ artist }" + +#: front/src/components/Sidebar.vue:24 +msgid "(%{ index } of %{ length })" +msgstr "(%{ index } z %{ length })" + +#: front/src/components/Sidebar.vue:22 +msgid "(empty)" +msgstr "(pusta)" + +#: front/src/components/common/ActionTable.vue:43 +#: front/src/components/common/ActionTable.vue:51 +msgid "%{ count } on %{ total } selected" +msgid_plural "%{ count } on %{ total } selected" +msgstr[0] "%{ count } z %{ total } zaznaczonego" +msgstr[1] "%{ count } z %{ total } zaznaczonych" +msgstr[2] "%{ count } z %{ total } zaznaczonych" + +#: front/src/components/Sidebar.vue:116 +#: src/views/federation/LibraryDetail.vue:87 +msgid "%{ count } track" +msgid_plural "%{ count } tracks" +msgstr[0] "%{ count } utwór" +msgstr[1] "%{ count } utwory" +msgstr[2] "%{ count } utworów" + +#: front/src/components/library/Artist.vue:13 +msgid "%{ count } track in %{ albumsCount } albums" +msgid_plural "%{ count } tracks in %{ albumsCount } albums" +msgstr[0] "%{ count } utwór w %{ albumsCount } albumach" +msgstr[1] "%{ count } utwory w %{ albumsCount } albumach" +msgstr[2] "%{ count } utworow w %{ albumsCount } albumach" + +#: front/src/components/library/radios/Builder.vue:76 +msgid "%{ count } track matching combined filters" +msgid_plural "%{ count } tracks matching combined filters" +msgstr[0] "%{ count } utwór zgodny z wybranymi filtrami" +msgstr[1] "%{ count } utwory zgodne z wybranymi filtrami" +msgstr[2] "%{ count } utworów zgodnych z wybranymi filtrami" + +#: front/src/components/playlists/Card.vue:18 +msgid "%{ count} track" +msgid_plural "%{ count } tracks" +msgstr[0] "%{ count} utwór" +msgstr[1] "%{ count} utwory" +msgstr[2] "%{ count} utworów" + +#: front/src/components/common/Duration.vue:2 +msgid "%{ hours } h %{ minutes } min" +msgstr "%{ hours } godz. %{ minutes } min" + +#: front/src/components/common/Duration.vue:5 +msgid "%{ minutes } min" +msgstr "%{ minutes } min" + +#: front/src/components/activity/Like.vue:7 +msgid "%{ user } favorited a track" +msgstr "%{ user } dodał utwór do ulubionych" + +#: front/src/components/activity/Listen.vue:7 +msgid "%{ user } listened to a track" +msgstr "%{ user } słuchał utworu" + +#: front/src/components/auth/Profile.vue:49 +msgid "%{ username }'s profile" +msgstr "Profil %{ username }" + +#: front/src/components/audio/artist/Card.vue:41 +msgid "1 album" +msgid_plural "%{ count } albums" +msgstr[0] "1 album" +msgstr[1] "%{ count } albumy" +msgstr[2] "%{ count } albumów" + +#: front/src/components/favorites/List.vue:10 +msgid "1 favorite" +msgid_plural "%{ count } favorites" +msgstr[0] "1 polubienie" +msgstr[1] "%{ count} polubienia" +msgstr[2] "%{ count} polubień" + +#: front/src/components/audio/album/Card.vue:54 +#: front/src/components/federation/LibraryCard.vue:25 +msgid "1 track" +msgid_plural "%{ count } tracks" +msgstr[0] "1 utwór" +msgstr[1] "%{ count } utwory" +msgstr[2] "%{ count } utworów" + +#: front/src/components/About.vue:5 +msgid "About %{ instance }" +msgstr "O %{ instance }" + +#: front/src/App.vue:54 +msgid "About Funkwhale" +msgstr "O Funkwhale" + +#: front/src/App.vue:32 src/components/About.vue:8 src/components/About.vue:55 +msgid "About this instance" +msgstr "O tej instancji" + +#: front/src/components/manage/library/RequestsTable.vue:28 +#: front/src/components/manage/library/RequestsTable.vue:62 +msgid "Accepted" +msgstr "Zaakceptowano" + +#: front/src/components/auth/SubsonicTokenForm.vue:111 +msgid "Access disabled" +msgstr "Brak dostępu" + +#: front/src/components/Home.vue:109 +msgid "Access your music from a clean interface that focus on what really matters" +msgstr "Uzyskaj dostęp do swojej muzyki z przejrzystego interfejsu skupionego na tym, co naprawdę ważne" + +#: front/src/views/admin/users/UsersDetail.vue:54 +msgid "Account active" +msgstr "Konto aktywne" + +#: front/src/components/auth/Settings.vue:5 +msgid "Account settings" +msgstr "Ustawienia konta" + +#: front/src/components/auth/Settings.vue:257 +msgid "Account Settings" +msgstr "Ustawienia konta" + +#: front/src/components/manage/users/UsersTable.vue:39 +msgid "Account status" +msgstr "Stan konta" + +#: front/src/views/auth/PasswordReset.vue:14 +msgid "Account's email" +msgstr "Adres e-mail konta" + +#: front/src/components/common/ActionTable.vue:82 +msgid "Action %{ action } was launched successfully on %{ count } element" +msgid_plural "Action %{ action } was launched successfully on %{ count } elements" +msgstr[0] "Działanie %{ action } zostało rozpoczęte pomyślnie na %{ count } elemencie" +msgstr[1] "Działanie %{ action } zostało rozpoczęte pomyślnie na %{ count } elementach" +msgstr[2] "Działanie %{ action } zostało rozpoczęte pomyślnie na %{ count } elementach" + +#: front/src/components/common/ActionTable.vue:8 +#: front/src/components/federation/LibraryFollowTable.vue:24 +#: front/src/components/library/radios/Builder.vue:60 +#: front/src/components/manage/library/RequestsTable.vue:54 +msgid "Actions" +msgstr "Działania" + +#: front/src/components/manage/users/UsersTable.vue:53 +msgid "Active" +msgstr "Aktywny" + +#: front/src/components/Sidebar.vue:60 +msgid "Activity" +msgstr "Aktywność" + +#: front/src/components/federation/LibraryFollowTable.vue:21 +msgid "Actor" +msgstr "Aktor" + +#: front/src/views/federation/LibraryList.vue:8 +msgid "Add a new library" +msgstr "Dodaj nową bibliotekę" + +#: front/src/components/library/radios/Builder.vue:46 +msgid "Add filter" +msgstr "Dodaj filtr" + +#: front/src/components/library/radios/Builder.vue:36 +msgid "Add filters to customize your radio" +msgstr "Dodaj filtry aby dostosować swoje radio" + +#: front/src/components/audio/PlayButton.vue:53 +msgid "Add to current queue" +msgstr "Dodaj do obecnej kolejki" + +#: front/src/components/favorites/TrackFavoriteIcon.vue:4 +#: front/src/components/favorites/TrackFavoriteIcon.vue:21 +msgid "Add to favorites" +msgstr "Dodaj do ulubionych" + +#: front/src/components/playlists/TrackPlaylistIcon.vue:6 +#: front/src/components/playlists/TrackPlaylistIcon.vue:32 +msgid "Add to playlist..." +msgstr "Dodaj do playlisty…" + +#: front/src/components/audio/PlayButton.vue:14 +msgid "Add to queue" +msgstr "Dodaj do kolejki" + +#: front/src/components/playlists/PlaylistModal.vue:116 +msgid "Add to this playlist" +msgstr "Dodaj do tej playlisty" + +#: front/src/components/playlists/PlaylistModal.vue:54 +msgid "Add track" +msgstr "Dodaj utwór" + +#: front/src/components/manage/users/UsersTable.vue:69 +msgid "Admin" +msgstr "Administrator" + +#: front/src/components/Sidebar.vue:64 +msgid "Administration" +msgstr "Administracja" + +#: front/src/components/audio/SearchBar.vue:26 +#: src/components/audio/track/Table.vue:8 +#: front/src/components/federation/LibraryTrackTable.vue:49 +#: front/src/components/library/Album.vue:91 +#: front/src/components/manage/library/FilesTable.vue:39 +#: front/src/components/metadata/Search.vue:134 +msgid "Album" +msgstr "Album" + +#: front/src/components/library/import/ReleaseImport.vue:3 +msgid "Album %{ title } (%{ count } track) by %{ artist }" +msgid_plural "Album %{ title } (%{ count } tracks) by %{ artist }" +msgstr[0] "Album %{ title } (%{ count } utwór) od %{ artist }" +msgstr[1] "Album %{ title } (%{ count } utwory) od %{ artist }" +msgstr[2] "Album %{ title } (%{ count } utworów) od %{ artist }" + +#: front/src/components/library/Album.vue:12 +msgid "Album containing %{ count } track, by %{ artist }" +msgid_plural "Album containing %{ count } tracks, by %{ artist }" +msgstr[0] "Album zawiera %{ count } utwór od %{ artist }" +msgstr[1] "Album zawiera %{ count } utwory od %{ artist }" +msgstr[2] "Album zawiera %{ count } utworów od %{ artist }" + +#: front/src/components/library/Track.vue:20 +msgid "Album page" +msgstr "Strona albumu" + +#: front/src/components/audio/Search.vue:19 +#: src/components/instance/Stats.vue:48 +#: front/src/components/manage/library/RequestsTable.vue:50 +#: front/src/components/requests/Form.vue:9 +msgid "Albums" +msgstr "Albumy" + +#: front/src/components/library/Artist.vue:44 +msgid "Albums by this artist" +msgstr "Albumy tego wykonawcy" + +#: front/src/components/manage/library/RequestsTable.vue:26 +#: front/src/components/manage/users/InvitationsTable.vue:19 +msgid "All" +msgstr "Wszystkie" + +#: front/src/components/playlists/Editor.vue:13 +msgid "An error occured while saving your changes" +msgstr "Wystąpił błąd podczas zapisywania zmian" + +#: front/src/components/auth/Login.vue:10 +msgid "An unknown error happend, this can mean the server is down or cannot be reached" +msgstr "Wystąpił nieznany błąd, może oznaczać to że serwer jest wyłączony lub nieosiągalny" + +#: front/src/components/federation/LibraryTrackTable.vue:11 +#: front/src/components/library/import/BatchDetail.vue:68 +#: front/src/components/library/import/BatchList.vue:13 +#: front/src/components/library/import/BatchList.vue:22 +msgid "Any" +msgstr "Dowolne" + +#: front/src/components/library/import/BatchList.vue:24 +msgid "API" +msgstr "API" + +#: front/src/components/federation/LibraryFollowTable.vue:68 +#: front/src/components/federation/LibraryFollowTable.vue:78 +msgid "Approve" +msgstr "Zaakceptuj" + +#: front/src/components/federation/LibraryFollowTable.vue:70 +msgid "Approve access?" +msgstr "Pozwolić na dostęp?" + +#: front/src/components/federation/LibraryFollowTable.vue:38 +msgid "Approved" +msgstr "Pozwolono" + +#: front/src/components/auth/Logout.vue:5 +msgid "Are you sure you want to log out?" +msgstr "Czy na pewno chcesz się wylogować?" + +#: front/src/components/audio/SearchBar.vue:25 +#: src/components/audio/track/Table.vue:7 +#: front/src/components/federation/LibraryTrackTable.vue:48 +#: front/src/components/library/Artist.vue:119 +#: front/src/components/manage/library/FilesTable.vue:38 +#: front/src/components/manage/library/RequestsTable.vue:49 +#: front/src/components/metadata/Search.vue:130 +msgid "Artist" +msgstr "Wykonawca" + +#: front/src/components/requests/Form.vue:5 +msgid "Artist name" +msgstr "Nazwa wykonawcy" + +#: front/src/components/library/Album.vue:22 +#: src/components/library/Track.vue:23 +msgid "Artist page" +msgstr "Strona wykonawcy" + +#: front/src/components/audio/Search.vue:65 +msgid "Artist, album, track..." +msgstr "Wykonawca, album, utwór…" + +#: front/src/components/audio/Search.vue:10 +#: src/components/instance/Stats.vue:42 +#: front/src/components/library/Artists.vue:119 +#: src/components/library/Library.vue:7 +msgid "Artists" +msgstr "Wykonawcy" + +#: front/src/components/favorites/List.vue:33 +#: front/src/components/federation/LibraryTrackTable.vue:28 +#: front/src/components/library/Artists.vue:25 +#: src/components/library/Radios.vue:44 +#: front/src/components/manage/library/FilesTable.vue:19 +#: front/src/components/manage/library/RequestsTable.vue:19 +#: front/src/components/manage/users/UsersTable.vue:19 +#: front/src/views/federation/LibraryList.vue:28 +#: src/views/playlists/List.vue:27 +msgid "Ascending" +msgstr "Rosnąco" + +#: front/src/views/auth/PasswordReset.vue:27 +msgid "Ask for a password reset" +msgstr "Poproś o zresetowanie hasła" + +#: front/src/views/federation/LibraryDetail.vue:56 +msgid "Auto importing" +msgstr "Automatyczne importowanie" + +#: front/src/components/playlists/PlaylistModal.vue:26 +msgid "Available playlists" +msgstr "Dostępne playlisty" + +#: front/src/components/auth/Settings.vue:34 +msgid "Avatar" +msgstr "Awatar" + +#: front/src/views/auth/EmailConfirm.vue:17 src/views/auth/PasswordReset.vue:24 +#: front/src/views/auth/PasswordResetConfirm.vue:18 +msgid "Back to login" +msgstr "Wróć do logowania" + +#: front/src/views/federation/LibraryFollowersList.vue:5 +msgid "Be careful when accepting follow requests, as it means the follower will have access to your entire library." +msgstr "Zachowaj ostrożność akceptując prośby o możliwość śledzenia, ponieważ śledzący będzie miał dostęp do całej Twojej biblioteki." + +#: front/src/components/library/Track.vue:80 +#: front/src/components/manage/library/FilesTable.vue:42 +msgid "Bitrate" +msgstr "Bitrate" + +#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4 +msgid "Browse" +msgstr "Przeglądaj" + +#: front/src/components/Sidebar.vue:50 +msgid "Browse library" +msgstr "Przeglądaj bibliotekę" + +#: front/src/components/library/Artists.vue:4 +msgid "Browsing artists" +msgstr "Przeglądanie wykonawców" + +#: front/src/views/federation/LibraryTrackList.vue:3 +msgid "Browsing federated tracks" +msgstr "Przeglądanie sfederowanych utworów" + +#: front/src/views/federation/LibraryFollowersList.vue:3 +msgid "Browsing followers" +msgstr "Przeglądanie śledzących" + +#: front/src/views/federation/LibraryList.vue:3 +msgid "Browsing libraries" +msgstr "Przeglądanie bibliotek" + +#: front/src/views/playlists/List.vue:3 +msgid "Browsing playlists" +msgstr "Przeglądanie list odtwarzania" + +#: front/src/components/library/Radios.vue:4 +msgid "Browsing radios" +msgstr "Przeglądanie radiów" + +#: front/src/components/library/radios/Builder.vue:5 +msgid "Builder" +msgstr "Budowanie" + +#: front/src/components/audio/album/Card.vue:13 +msgid "By %{ artist }" +msgstr "Od %{ artist }" + +#: front/src/components/federation/LibraryFollowTable.vue:57 +msgid "By confirming, %{ username } will be denied access to your library." +msgstr "Po potwierdzeniu %{ username } nie będzie miał dostępu do Twojej biblioteki." + +#: front/src/components/federation/LibraryFollowTable.vue:73 +msgid "By confirming, %{ username } will be granted access to your library." +msgstr "Po potwierdzeniu %{ username } uzyska dostęp do Twojej biblioteki." + +#: front/src/components/audio/track/Table.vue:43 +#: front/src/components/common/DangerousButton.vue:17 +#: front/src/components/library/radios/Filter.vue:53 +#: front/src/components/playlists/PlaylistModal.vue:63 +msgid "Cancel" +msgstr "Anuluj" + +#: front/src/components/library/radios/Builder.vue:59 +msgid "Candidates" +msgstr "Kandydaci" + +#: front/src/components/auth/Settings.vue:76 +msgid "Cannot change your password" +msgstr "Nie udało się zmienić Twojego hasła" + +#: front/src/App.vue:66 +msgid "Change language" +msgstr "Zmień język" + +#: front/src/components/auth/Settings.vue:67 +msgid "Change my password" +msgstr "Zmień moje hasło" + +#: front/src/components/auth/Settings.vue:95 +msgid "Change password" +msgstr "Zmień hasło" + +#: front/src/views/auth/PasswordResetConfirm.vue:4 +#: front/src/views/auth/PasswordResetConfirm.vue:62 +msgid "Change your password" +msgstr "Zmień swoje hasło" + +#: front/src/components/auth/Settings.vue:96 +msgid "Change your password?" +msgstr "Zmienić Twoje hasło?" + +#: front/src/components/playlists/Editor.vue:21 +msgid "Changes synced with server" +msgstr "Zsynchronizowano zmiany z serwerem" + +#: front/src/components/auth/Settings.vue:70 +msgid "Changing your password will also change your Subsonic API password if you have requested one." +msgstr "ZMiana Twojego hasła zmieni też Twoje hasło API Subsonic, jeżeli uzyskałeś je." + +#: front/src/components/auth/Settings.vue:98 +msgid "Changing your password will have the following consequences" +msgstr "Zmiana hasła będzie miała następujące konsekwencje" + +#: front/src/App.vue:4 +msgid "Choose your instance" +msgstr "Wybierz instancję" + +#: front/src/components/Home.vue:64 +msgid "Clean library" +msgstr "Przejrzysta biblioteka" + +#: front/src/components/manage/users/InvitationForm.vue:37 +msgid "Clear" +msgstr "Wyczyść" + +#: front/src/components/playlists/Editor.vue:40 +#: front/src/components/playlists/Editor.vue:45 +msgid "Clear playlist" +msgstr "Wyczyść listę odtwarzania" + +#: front/src/components/audio/Player.vue:270 +msgid "Clear your queue" +msgstr "Wyczyść swoją kolejkę" + +#: front/src/components/library/import/BatchList.vue:23 +msgid "CLI" +msgstr "CLI" + +#: front/src/components/Home.vue:44 +msgid "Click once, listen for hours using built-in radios" +msgstr "Naciśnij raz, słuchaj godzinami dzięki wbudowanemu radio" + +#: front/src/components/manage/library/RequestsTable.vue:30 +#: front/src/components/manage/library/RequestsTable.vue:64 +msgid "Closed" +msgstr "Zamknięte" + +#: front/src/components/manage/users/InvitationForm.vue:26 +#: front/src/components/manage/users/InvitationsTable.vue:42 +msgid "Code" +msgstr "Kod" + +#: front/src/components/audio/album/Card.vue:43 +#: front/src/components/audio/artist/Card.vue:33 +#: front/src/components/discussion/Comment.vue:20 +msgid "Collapse" +msgstr "Zwiń" + +#: front/src/components/manage/library/RequestsTable.vue:51 +#: front/src/components/requests/Form.vue:14 +msgid "Comment" +msgstr "Komentarz" + +#: front/src/components/library/radios/Builder.vue:58 +msgid "Config" +msgstr "Konfiguracja" + +#: front/src/components/common/DangerousButton.vue:21 +msgid "Confirm" +msgstr "Potwierdź" + +#: front/src/views/auth/EmailConfirm.vue:4 src/views/auth/EmailConfirm.vue:20 +#: front/src/views/auth/EmailConfirm.vue:51 +msgid "Confirm your email" +msgstr "Potwierdź swój e-mail" + +#: front/src/views/auth/EmailConfirm.vue:13 +msgid "Confirmation code" +msgstr "Kod potwierdzający" + +#: front/src/components/playlists/Editor.vue:163 +msgid "Copy tracks from current queue to playlist" +msgstr "Skopiuj utwory z obecnej kolejki do listy odtwarzania" + +#: front/src/components/Home.vue:88 +msgid "Covers, lyrics, our goal is to have them all ;)" +msgstr "Covery, teksty, naszym celem jest mieć je wszystkie ;)" + +#: front/src/components/auth/Signup.vue:4 +msgid "Create a funkwhale account" +msgstr "Utwórz konto funkwhale" + +#: front/src/components/playlists/Form.vue:2 +msgid "Create a new playlist" +msgstr "Utwórz nową listę odtwarzania" + +#: front/src/components/auth/Login.vue:17 +msgid "Create an account" +msgstr "Utwórz konto" + +#: front/src/components/manage/library/RequestsTable.vue:88 +#: front/src/components/requests/Card.vue:25 +msgid "Create import" +msgstr "Utwórz importowanie" + +#: front/src/components/auth/Signup.vue:51 +msgid "Create my account" +msgstr "Utwórz konto" + +#: front/src/components/playlists/Form.vue:34 +msgid "Create playlist" +msgstr "Utwórz listę odtwarzania" + +#: front/src/components/library/Radios.vue:23 +msgid "Create your own radio" +msgstr "Utwórz własne radio" + +#: front/src/components/federation/LibraryFollowTable.vue:22 +#: front/src/components/manage/library/RequestsTable.vue:52 +#: front/src/components/manage/users/InvitationsTable.vue:40 +msgid "Creation date" +msgstr "Data utworzenia" + +#: front/src/components/auth/Settings.vue:54 +msgid "Current avatar" +msgstr "Obecny awatar" + +#: front/src/components/playlists/PlaylistModal.vue:8 +msgid "Current track" +msgstr "Obecny utwór" + +#: front/src/components/manage/library/FilesTable.vue:189 +#: front/src/components/manage/library/RequestsTable.vue:195 +#: front/src/components/manage/users/InvitationsTable.vue:166 +#: front/src/views/playlists/Detail.vue:33 +msgid "Delete" +msgstr "Usuń" + +#: front/src/views/playlists/Detail.vue:38 +msgid "Delete playlist" +msgstr "Usuń listę odtwarzania" + +#: front/src/views/radios/Detail.vue:28 +msgid "Delete radio" +msgstr "Usuń radio" + +#: front/src/components/federation/LibraryFollowTable.vue:52 +#: front/src/components/federation/LibraryFollowTable.vue:63 +msgid "Deny" +msgstr "Odmów" + +#: front/src/components/federation/LibraryFollowTable.vue:54 +msgid "Deny access?" +msgstr "Odmówić dostępu?" + +#: front/src/components/favorites/List.vue:34 +#: front/src/components/federation/LibraryTrackTable.vue:29 +#: front/src/components/library/Artists.vue:26 +#: src/components/library/Radios.vue:47 +#: front/src/components/manage/library/FilesTable.vue:20 +#: front/src/components/manage/library/RequestsTable.vue:20 +#: front/src/components/manage/users/UsersTable.vue:20 +#: front/src/views/federation/LibraryList.vue:29 +#: src/views/playlists/List.vue:28 +msgid "Descending" +msgstr "Malejąco" + +#: front/src/components/federation/LibraryCard.vue:50 +msgid "Detail" +msgstr "Szczegół" + +#: front/src/views/admin/users/UsersDetail.vue:146 +msgid "Determine if the user account is active or not. Inactive users cannot login or use the service." +msgstr "Określa, czy konto użytkownika jest aktywne. Nieaktywni użytkownicy nie mogą zalogować się i korzystać z usługi." + +#: front/src/components/auth/Settings.vue:104 +#: front/src/components/auth/SubsonicTokenForm.vue:52 +msgid "Disable access" +msgstr "Wyłącz dostęp" + +#: front/src/components/auth/SubsonicTokenForm.vue:49 +msgid "Disable Subsonic access" +msgstr "Wyłącz dostęp Subsonic" + +#: front/src/components/auth/SubsonicTokenForm.vue:50 +msgid "Disable Subsonic API access?" +msgstr "Wyłączyć dostęp do API Subsonic?" + +#: front/src/components/auth/SubsonicTokenForm.vue:14 +msgid "Discover how to use Funkwhale from other apps" +msgstr "Odkryj, jak korzystać z Funkwhale z innych aplikacji" + +#: front/src/components/library/radios/Builder.vue:26 +msgid "Display publicly" +msgstr "Wyświetlaj publicznie" + +#: front/src/components/playlists/Editor.vue:42 +msgid "Do you want to clear the playlist \"%{ playlist }\"?" +msgstr "Czy chcesz wyczyścić listę odtwarzania „%{ playlist }”?" + +#: front/src/components/common/DangerousButton.vue:7 +msgid "Do you want to confirm this action?" +msgstr "Czy chcesz potwierdzić to działanie?" + +#: front/src/views/playlists/Detail.vue:35 +msgid "Do you want to delete the playlist \"%{ playlist }\"?" +msgstr "Czy chcesz usunąć listę odtwarzania „%{ playlist }”?" + +#: front/src/views/radios/Detail.vue:26 +#, fuzzy +msgid "Do you want to delete the radio \"%{ radio }\"?" +msgstr "Czy chcesz usunąć radio „{{ radio }}”?" + +#: front/src/components/common/ActionTable.vue:29 +msgid "Do you want to launch %{ action } on %{ count } element?" +msgid_plural "Do you want to launch %{ action } on %{ count } elements?" +msgstr[0] "Czy chcesz wykonać działanie %{ action } na %{ count } elemencie?" +msgstr[1] "Czy chcesz wykonać działanie %{ action } na %{ count } elementach?" +msgstr[2] "Czy chcesz wykonać działanie %{ action } na %{ count } elementach?" + +#: front/src/components/Sidebar.vue:113 +msgid "Do you want to restore your previous queue?" +msgstr "Czy chcesz przywrócić poprzednią kolejkę?" + +#: front/src/App.vue:38 +msgid "Documentation" +msgstr "Dokumentacja" + +#: front/src/components/audio/track/Table.vue:24 +#: src/components/library/Track.vue:48 +msgid "Download" +msgstr "Pobierz" + +#: front/src/components/audio/track/Table.vue:27 +msgid "Download tracks" +msgstr "Pobierz utwory" + +#: front/src/components/playlists/Editor.vue:49 +msgid "Drag and drop rows to reorder tracks in the playlist" +msgstr "Przeciągnij i upuść aby zmienić kolejność utworów w liście odtwarzania" + +#: front/src/components/library/Track.vue:58 +#: front/src/components/manage/library/FilesTable.vue:43 +msgid "Duration" +msgstr "Długość" + +#: front/src/components/Home.vue:96 +msgid "Easy to use" +msgstr "Prosty w użyciu" + +#: front/src/components/About.vue:21 +msgid "Edit instance info" +msgstr "Edytuj informacje o instancji" + +#: front/src/components/radios/Card.vue:20 src/views/playlists/Detail.vue:30 +msgid "Edit..." +msgstr "Edytuj…" + +#: front/src/components/auth/Signup.vue:29 +#: front/src/components/manage/users/UsersTable.vue:38 +msgid "Email" +msgstr "E-mail" + +#: front/src/views/admin/users/UsersDetail.vue:29 +msgid "Email address" +msgstr "Adres e-mail" + +#: front/src/views/auth/EmailConfirm.vue:23 +msgid "Email confirmed" +msgstr "Potwierdzono e-mail" + +#: front/src/views/playlists/Detail.vue:29 +msgid "End edition" +msgstr "Zakończ edytowanie" + +#: front/src/components/library/import/FileUpload.vue:4 +msgid "Ensure your music files are properly tagged before uploading them." +msgstr "Upewnij się, że pliki muzyczne są odpowiednio otagowane zanim je wyślesz." + +#: front/src/components/library/Radios.vue:140 +msgid "Enter a radio name..." +msgstr "Wprowadź nazwę radia…" + +#: front/src/components/library/Artists.vue:118 +msgid "Enter an artist name..." +msgstr "Wprowadź nazwę wykonawcy…" + +#: front/src/views/federation/LibraryList.vue:122 +msgid "Enter an library domain name..." +msgstr "Wprowadź nazwę domeny biblioteki…" + +#: front/src/views/playlists/List.vue:104 +msgid "Enter an playlist name..." +msgstr "Wprowadź nazwę listy odtwarzania…" + +#: front/src/components/auth/Signup.vue:98 +msgid "Enter your email" +msgstr "Wprowadź swój e-mail" + +#: front/src/components/auth/Signup.vue:96 +msgid "Enter your invitation code (case insensitive)" +msgstr "Wprowadź swój kod zapraszający (wielkość znaków nie ma znaczenia)" + +#: front/src/components/metadata/Search.vue:114 +msgid "Enter your search query..." +msgstr "Wprowadź swoje kryterium wyszukiwania…" + +#: front/src/components/auth/Signup.vue:97 +msgid "Enter your username" +msgstr "Wprowadź swoją nazwę użytkownika" + +#: front/src/components/auth/Login.vue:77 +msgid "Enter your username or email" +msgstr "Wprowadź swoją nazwę użytkownika lub e-mail" + +#: front/src/components/auth/SubsonicTokenForm.vue:20 +msgid "Error" +msgstr "Błąd" + +#: front/src/views/admin/Settings.vue:87 +msgid "Error reporting" +msgstr "Zgłaszanie błędów" + +#: front/src/components/common/ActionTable.vue:75 +msgid "Error while applying action" +msgstr "Błąd podczas zastosowywania działania" + +#: front/src/views/auth/PasswordReset.vue:7 +msgid "Error while asking for a password reset" +msgstr "Wystąpił błąd podczas prośby o zresetowanie hasła" + +#: front/src/views/auth/PasswordResetConfirm.vue:7 +msgid "Error while changing your password" +msgstr "Wystąpił błąd podczas zmiany hasła" + +#: front/src/views/auth/EmailConfirm.vue:7 +msgid "Error while confirming your email" +msgstr "Wystąpił błąd podczas potwierdzania adresu e-mail" + +#: front/src/components/manage/users/InvitationForm.vue:4 +msgid "Error while creating invitation" +msgstr "Wystąpił błąd podczas tworzenia zaproszenia" + +#: front/src/components/admin/SettingsGroup.vue:5 +msgid "Error while saving settings" +msgstr "Wystąpił błąd podczas zapisywania ustawień" + +#: front/src/components/federation/LibraryForm.vue:10 +msgid "Error while scanning library" +msgstr "Wystąpił błąd podczas przeszukiwania biblioteki" + +#: front/src/components/library/import/BatchDetail.vue:41 +#: front/src/components/library/import/BatchDetail.vue:70 +#: front/src/components/library/import/BatchList.vue:15 +msgid "Errored" +msgstr "Zakończono błędem" + +#: front/src/components/playlists/Form.vue:89 +msgid "Everyone" +msgstr "Wszyscy" + +#: front/src/components/playlists/Form.vue:85 +msgid "Everyone on this instance" +msgstr "Wszyscy na tej instancji" + +#: front/src/components/library/radios/Builder.vue:57 +msgid "Exclude" +msgstr "Wyłącz" + +#: front/src/components/discussion/Comment.vue:14 +msgid "Expand" +msgstr "Rozwiń" + +#: front/src/components/manage/users/InvitationsTable.vue:41 +msgid "Expiration date" +msgstr "Data wygaśnięcia" + +#: front/src/components/manage/users/InvitationsTable.vue:50 +msgid "Expired" +msgstr "Wyczerpany" + +#: front/src/components/manage/users/InvitationsTable.vue:21 +msgid "Expired/used" +msgstr "Wyczerpany/zużyty" + +#: front/src/components/library/import/Main.vue:65 +msgid "External source. Supported backends" +msgstr "Zewnętrzne źródło. Obsługiwane back-endy" + +#: front/src/components/Sidebar.vue:51 +msgid "Favorites" +msgstr "Ulubione" + +#: front/src/components/federation/LibraryForm.vue:3 +msgid "Federate with a new instance" +msgstr "Federuj z nową instancją" + +#: front/src/views/federation/LibraryTrackList.vue:21 +msgid "Federated tracks" +msgstr "Sfederowane utwory" + +#: front/src/components/Sidebar.vue:87 +#: src/components/library/import/BatchList.vue:25 +#: front/src/components/manage/users/UsersTable.vue:180 +#: front/src/views/admin/Settings.vue:84 +#: src/views/admin/users/UsersDetail.vue:161 +#: front/src/views/federation/Base.vue:35 +#: src/views/federation/LibraryDetail.vue:40 +msgid "Federation" +msgstr "Federacja" + +#: front/src/views/federation/LibraryDetail.vue:3 +msgid "File mirroring" +msgstr "Powielanie plików" + +#: front/src/components/library/import/FileUpload.vue:43 +msgid "File name" +msgstr "Nazwa pliku" + +#: front/src/components/library/import/Main.vue:76 +msgid "File upload" +msgstr "Wysyłanie pliku" + +#: front/src/views/admin/library/Base.vue:5 +#: src/views/admin/library/FilesList.vue:21 +msgid "Files" +msgstr "Pliki" + +#: front/src/components/library/import/ArtistImport.vue:7 +msgid "Filter album types" +msgstr "Filtruj rodzaje albumów" + +#: front/src/components/library/radios/Builder.vue:56 +msgid "Filter name" +msgstr "Filtruj nazwę" + +#: front/src/components/library/import/Main.vue:52 +msgid "Finish import" +msgstr "Zakończ importowanie" + +#: front/src/components/library/import/BatchDetail.vue:54 +msgid "Finished" +msgstr "Ukończono" + +#: front/src/components/library/import/Main.vue:59 +msgid "First, choose where you want to import the music from" +msgstr "Najpierw wybierz, skąd chcesz zaimportować muzykę" + +#: front/src/components/federation/LibraryCard.vue:44 +msgid "Follow" +msgstr "Śledź" + +#: front/src/components/federation/LibraryCard.vue:36 +msgid "Follow request pending approval" +msgstr "Prośba o możliwość śledzenia oczekuje na zatwierdzenie" + +#: front/src/views/federation/LibraryDetail.vue:21 +msgid "Follow status" +msgstr "Stan śledzenia" + +#: front/src/views/federation/Base.vue:13 +#: front/src/views/federation/LibraryFollowersList.vue:24 +msgid "Followers" +msgstr "Śledzący" + +#: front/src/components/federation/LibraryCard.vue:18 +msgid "Followers only" +msgstr "Tylko dla śledzących" + +#: front/src/components/federation/LibraryCard.vue:15 +#: front/src/views/federation/LibraryDetail.vue:29 +msgid "Following" +msgstr "Śledzisz" + +#: front/src/components/activity/Like.vue:12 +#: src/components/activity/Listen.vue:12 +msgid "from %{ album } by %{ artist }" +msgstr "z %{ album } od %{ artist }" + +#: front/src/components/library/Track.vue:13 +msgid "From album %{ album } by %{ artist }" +msgstr "Z albumu %{ album } od %{ artist }" + +#: front/src/App.vue:56 +msgid "Funkwhale is a free and open-source project run by volunteers. You can help us improve the platform by reporting bugs, suggesting features and share the project with your friends!" +msgstr "Funkwhale jest wolnym i otwartoźródłowym projektem rozwijanym przez wolontariuszy. Możesz pomóc nam ulepszać platformę zgłaszając błędy, propozycje funkcji i polecając projekt znajomym!" + +#: front/src/components/auth/SubsonicTokenForm.vue:7 +msgid "Funkwhale is compatible with other music players that support the Subsonic API." +msgstr "Funkwhale jest kompatybilny z innymi odtwarzaczami muzycznymi obsługującymi API Subsonic." + +#: front/src/components/Home.vue:98 +msgid "Funkwhale is dead simple to use." +msgstr "Funkwhale jest niezwykle prosty w użyciu." + +#: front/src/components/Home.vue:39 +msgid "Funkwhale is designed to make it easy to listen to music you like, or to discover new artists." +msgstr "Funkwhale został zaprojektowany, aby uczynić słuchanie muzyki którą lubisz i poznawanie nowych wykonawców prostym." + +#: front/src/components/Home.vue:119 +msgid "Funkwhale is free and gives you control on your music." +msgstr "Funkwhale jest wolny i oddaje Ci kontrolę nad Twoją muzyką." + +#: front/src/components/Home.vue:66 +msgid "Funkwhale takes care of handling your music" +msgstr "Funkwhale dba o Twoją bibliotekę muzyczną" + +#: front/src/components/manage/users/InvitationForm.vue:16 +msgid "Get a new invitation" +msgstr "Uzyskaj nowe zaproszenie" + +#: front/src/components/Home.vue:13 +msgid "Get me to the library" +msgstr "Pokaż mi bibliotekę" + +#: front/src/components/Home.vue:77 +msgid "" +"Get quality metadata about your music thanks to\n" +" \n" +" MusicBrainz\n" +" " +msgstr "" +"Uzyskaj dobrej jakości metadane o Twojej muzyce dzięki\n" +" \n" +" MusicBrainz\n" +" " + +#: front/src/components/common/ActionTable.vue:21 +#: front/src/components/common/ActionTable.vue:27 +msgid "Go" +msgstr "Przejdź" + +#: front/src/components/PageNotFound.vue:14 +msgid "Go to home page" +msgstr "Przejdź na stronę główną" + +#: front/src/components/library/import/Main.vue:13 +msgid "Grab corresponding metadata" +msgstr "Uzyskaj odpowiednie metadane" + +#: front/src/App.vue:74 +msgid "Help us translate Funkwhale" +msgstr "" + +#: front/src/components/library/Home.vue:65 +msgid "Home" +msgstr "Strona główna" + +#: front/src/components/instance/Stats.vue:36 +msgid "Hours of music" +msgstr "Godziny muzyki" + +#: front/src/components/auth/SubsonicTokenForm.vue:11 +msgid "However, accessing Funkwhale from those clients require a separate password you can set below." +msgstr "Korzystanie z Funkwhale z tych klientów wymaga jednak oddzielnego hasła, które możesz ustawić poniżej." + +#: front/src/components/library/import/BatchList.vue:34 +msgid "ID" +msgstr "ID" + +#: front/src/views/auth/PasswordResetConfirm.vue:24 +msgid "If the email address provided in the previous step is valid and binded to a user account, you should receive an email with reset instructions in the next couple of minutes." +msgstr "Jeżeli adres e-mail podany w poprzednim kroku jest prawidłowy i przypisany do konta użytkownika, powinieneś dostać wiadomość z instrukcjami resetowania hasła w przeciągu kilku minut." + +#: front/src/components/federation/LibraryTrackTable.vue:196 +#: front/src/components/library/Library.vue:17 +msgid "Import" +msgstr "Importuj" + +#: front/src/components/federation/LibraryTrackTable.vue:57 +msgid "Import #%{ id } launched" +msgstr "Rozpoczęto importowanie #%{ id }" + +#: front/src/components/library/import/Main.vue:38 +msgid "Import %{ count } track" +msgid_plural "Import %{ count } tracks" +msgstr[0] "Importuj %{ count } utwór" +msgstr[1] "Importuj %{ count } utwory" +msgstr[2] "Importuj %{ count } utwów" + +#: front/src/components/library/import/BatchDetail.vue:10 +msgid "Import batch" +msgstr "Importowanie wsadowe" + +#: front/src/components/library/import/BatchDetail.vue:185 +msgid "Import Batch #%{ id }" +msgstr "Importowanie wsadowe #%{ id }" + +#: front/src/components/library/Library.vue:20 +msgid "Import batches" +msgstr "Importuj wsadowo" + +#: front/src/components/library/import/BatchList.vue:117 +msgid "Import Batches" +msgstr "Importowania wsadowe" + +#: front/src/components/manage/library/FilesTable.vue:40 +#: front/src/components/manage/library/RequestsTable.vue:53 +msgid "Import date" +msgstr "Data zaimportowania" + +#: front/src/components/library/import/FileUpload.vue:38 +msgid "Import detail page" +msgstr "Strona szczegółów importowania" + +#: front/src/components/Sidebar.vue:81 +msgid "Import music" +msgstr "Importuj muzykę" + +#: front/src/components/library/import/Main.vue:267 +msgid "Import Music" +msgstr "Importuj muzykę" + +#: front/src/components/Home.vue:71 +msgid "Import music from various platforms, such as YouTube or SoundCloud" +msgstr "Importuj muzykę z różnych platform, takich jak YouTube i SoundCloud" + +#: front/src/components/federation/LibraryTrackTable.vue:14 +#: front/src/components/federation/LibraryTrackTable.vue:66 +msgid "Import pending" +msgstr "Oczekujące importowanie" + +#: front/src/views/admin/library/Base.vue:9 +#: front/src/views/admin/library/RequestsList.vue:3 +#: front/src/views/admin/library/RequestsList.vue:21 +msgid "Import requests" +msgstr "Prośby o zaimportowanie" + +#: front/src/components/library/import/BatchList.vue:20 +#: front/src/components/library/import/Main.vue:6 +msgid "Import source" +msgstr "Źródło importu" + +#: front/src/components/federation/LibraryTrackTable.vue:9 +msgid "Import status" +msgstr "Stan importu" + +#: front/src/components/library/import/ReleaseImport.vue:14 +msgid "Import this release" +msgstr "Importuj to wydanie" + +#: front/src/components/library/import/TrackImport.vue:11 +msgid "Import this track" +msgstr "Importuj ten utwór" + +#: front/src/components/federation/LibraryTrackTable.vue:12 +#: front/src/components/manage/library/RequestsTable.vue:29 +#: front/src/components/manage/library/RequestsTable.vue:61 +msgid "Imported" +msgstr "Zaimportowano" + +#: front/src/components/library/import/TrackImport.vue:44 +msgid "Imported URL" +msgstr "Zaimportowany URL" + +#: front/src/views/admin/Settings.vue:82 +msgid "Imports" +msgstr "Importy" + +#: front/src/components/favorites/TrackFavoriteIcon.vue:3 +msgid "In favorites" +msgstr "W ulubionych" + +#: front/src/components/federation/LibraryTrackTable.vue:65 +msgid "In library" +msgstr "W bibliotece" + +#: front/src/components/manage/users/UsersTable.vue:54 +msgid "Inactive" +msgstr "Nieaktywny" + +#: front/src/components/library/import/Main.vue:96 +msgid "Input a MusicBrainz ID manually:" +msgstr "Wprowadź ID MusicBrainz ręcznie:" + +#: front/src/views/auth/PasswordReset.vue:53 +msgid "Input the email address binded to your account" +msgstr "Wprowadź adres e-mail przypisany do Twojego konta" + +#: front/src/components/playlists/Editor.vue:31 +msgid "Insert from queue (%{ count } track)" +msgid_plural "Insert from queue (%{ count } tracks)" +msgstr[0] "Dodaj z kolejki (%{ count } utwór)" +msgstr[1] "Dodaj z kolejki (%{ count } utwory)" +msgstr[2] "Dodaj z kolejki (%{ count } utworów)" + +#: front/src/views/admin/Settings.vue:80 +msgid "Instance information" +msgstr "Informacje o instancji" + +#: front/src/components/library/Radios.vue:9 +msgid "Instance radios" +msgstr "Radia instancji" + +#: front/src/views/admin/Settings.vue:75 +msgid "Instance settings" +msgstr "Ustawienia instancji" + +#: front/src/views/instance/Timeline.vue:57 +msgid "Instance Timeline" +msgstr "Oś czasu instancji" + +#: front/src/components/auth/Signup.vue:42 +#: front/src/components/manage/users/InvitationForm.vue:11 +msgid "Invitation code" +msgstr "Kod zapraszający" + +#: front/src/components/auth/Signup.vue:43 +msgid "Invitation code (optional)" +msgstr "Kod zapraszający (nieobowiązkowy)" + +#: front/src/views/admin/users/Base.vue:8 +#: src/views/admin/users/InvitationsList.vue:3 +#: front/src/views/admin/users/InvitationsList.vue:24 +msgid "Invitations" +msgstr "Zaproszenia" + +#: front/src/App.vue:43 +msgid "Issue tracker" +msgstr "Śledzenie błędów" + +#: front/src/components/library/import/BatchDetail.vue:80 +msgid "Job ID" +msgstr "ID zadania" + +#: front/src/components/library/import/BatchList.vue:36 +msgid "Jobs" +msgstr "Zadania" + +#: front/src/components/Home.vue:50 +msgid "Keep a track of your favorite songs" +msgstr "Zachowaj kontrolę nad ulubionymi utworami" + +#: front/src/components/audio/track/Table.vue:33 +msgid "Keep your PRIVATE_TOKEN secret as it gives access to your account." +msgstr "Zachowaj swój PRIVATE_TOKEN dla siebie, ponieważ daje on dostęp do Twojego konta." + +#: front/src/components/manage/users/UsersTable.vue:41 +#: front/src/views/admin/users/UsersDetail.vue:45 +msgid "Last activity" +msgstr "Ostatnia aktywność" + +#: front/src/views/federation/LibraryDetail.vue:101 +msgid "Last fetched" +msgstr "Ostatnio dodane" + +#: front/src/components/playlists/PlaylistModal.vue:32 +msgid "Last modification" +msgstr "Ostatnia modyfikacja" + +#: front/src/components/common/ActionTable.vue:39 +msgid "Launch" +msgstr "Uruchom" + +#: front/src/components/library/import/BatchDetail.vue:18 +#: front/src/components/library/import/BatchList.vue:35 +msgid "Launch date" +msgstr "Data uruchomienia" + +#: front/src/components/federation/LibraryForm.vue:31 +msgid "Launch scan" +msgstr "Uruchom skanowanie" + +#: front/src/components/Home.vue:10 +msgid "Learn more about this instance" +msgstr "Dowiedz się więcej o tej instancji" + +#: front/src/components/manage/users/InvitationForm.vue:58 +msgid "Leave empty for a random code" +msgstr "Pozostaw puste, aby wygenerować kod" + +#: front/src/components/requests/Form.vue:10 +msgid "Leave this field empty if you're requesting the whole discography." +msgstr "Pozostaw to pole puste, jeżeli chcesz całą dyskografię." + +#: front/src/views/federation/Base.vue:5 +#: src/views/federation/LibraryList.vue:123 +msgid "Libraries" +msgstr "Biblioteki" + +#: front/src/components/Sidebar.vue:70 +#: front/src/components/federation/LibraryTrackTable.vue:51 +#: front/src/components/instance/Stats.vue:30 +#: front/src/components/manage/users/UsersTable.vue:176 +#: front/src/views/admin/users/UsersDetail.vue:157 +#: front/src/views/federation/LibraryDetail.vue:194 +msgid "Library" +msgstr "Biblioteka" + +#: front/src/views/admin/library/FilesList.vue:3 +msgid "Library files" +msgstr "Pliki z biblioteki" + +#: front/src/components/federation/LibraryForm.vue:20 +msgid "Library name" +msgstr "Nazwa biblioteki" + +#: front/src/views/federation/LibraryDetail.vue:84 +msgid "Library size" +msgstr "Rozmiar biblioteki" + +#: front/src/components/federation/LibraryForm.vue:96 +msgid "library@demo.funkwhale.audio" +msgstr "library@demo.funkwhale.audio" + +#: front/src/App.vue:29 +msgid "Links" +msgstr "Odnośniki" + +#: front/src/views/instance/Timeline.vue:4 +msgid "Loading timeline..." +msgstr "Ładowanie osi czasu…" + +#: front/src/components/favorites/List.vue:5 +msgid "Loading your favorites..." +msgstr "Ładowanie Twoich ulubionych…" + +#: front/src/components/auth/Login.vue:78 +msgid "Log In" +msgstr "Zaloguj się" + +#: front/src/components/auth/Login.vue:4 +msgid "Log in to your Funkwhale account" +msgstr "Zaloguj się na swoje konto Funkwhale" + +#: front/src/components/auth/Logout.vue:20 +msgid "Log Out" +msgstr "Wyloguj się" + +#: front/src/components/Sidebar.vue:38 +msgid "Logged in as %{ username }" +msgstr "Zalogowano jako %{ username }" + +#: front/src/components/Sidebar.vue:44 src/components/auth/Login.vue:41 +msgid "Login" +msgstr "Logowanie" + +#: front/src/components/Sidebar.vue:43 +msgid "Logout" +msgstr "Wyloguj się" + +#: front/src/components/audio/Player.vue:266 +msgid "Looping disabled. Click to switch to single-track looping." +msgstr "Zapętlanie jest wyłączone. Naciśnij, aby przełączyć na powtarzanie jednego utworu." + +#: front/src/components/audio/Player.vue:267 +msgid "Looping on a single track. Click to switch to whole queue looping." +msgstr "Zapętlanie jednego utworu jest włączone. Naciśnij, aby przełączyć na powtarzanie całej kolejki." + +#: front/src/components/audio/Player.vue:268 +msgid "Looping on whole queue. Click to disable looping." +msgstr "Zapętlanie całej kolejki jest włączone. Naciśnij, aby wyłączyć zapętlanie." + +#: front/src/components/library/Track.vue:94 +msgid "Lyrics" +msgstr "Tekst" + +#: front/src/views/admin/library/Base.vue:25 +msgid "Manage library" +msgstr "Zarządzaj biblioteką" + +#: front/src/components/playlists/PlaylistModal.vue:3 +msgid "Manage playlists" +msgstr "Zarządzaj listami odtwarzania" + +#: front/src/views/admin/users/Base.vue:20 +msgid "Manage users" +msgstr "Zarządzaj użytkownikami" + +#: front/src/views/playlists/List.vue:8 +msgid "Manage your playlists" +msgstr "Zarządzaj swoimi listami odtwarzania" + +#: front/src/components/manage/library/RequestsTable.vue:197 +msgid "Mark as closed" +msgstr "Oznacz jako zamkniętą" + +#: front/src/components/manage/library/RequestsTable.vue:196 +msgid "Mark as imported" +msgstr "Oznacz jako zaimportowaną" + +#: front/src/components/library/import/Main.vue:12 +msgid "Metadata" +msgstr "Metadane" + +#: front/src/components/library/import/Main.vue:115 +msgid "" +"Metadata is the data related to the music you want to import. This includes all the information about the artists, albums and tracks. In order to have a high quality library, it is recommended to grab data from the\n" +" \n" +" MusicBrainz\n" +" \n" +" project, which you can think about as the Wikipedia of music." +msgstr "" +"Metadane to dane związane z muzyką, którą chcesz zaimportować. Zaliczają się do nicj wszystkie dane o wykonawcy, albumach i utworach. Aby uzyskać dopracowaną bibliotekę, polecamy uzyskać dane z projektu\n" +" \n" +" MusicBrainz\n" +" ,\n" +" który jest czymś w stylu Wikipedii dla muzyki." + +#: front/src/components/Sidebar.vue:48 +#: src/components/library/import/Main.vue:18 +msgid "Music" +msgstr "Muzyka" + +#: front/src/components/library/import/Main.vue:147 +msgid "Music request" +msgstr "Prośba o muzykę" + +#: front/src/components/audio/Player.vue:265 +msgid "Mute" +msgstr "Wycisz" + +#: front/src/components/Sidebar.vue:34 +msgid "My account" +msgstr "Moje konto" + +#: front/src/components/playlists/Form.vue:74 +msgid "My awesome playlist" +msgstr "Moja wspaniała playlista" + +#: front/src/components/library/radios/Builder.vue:227 +msgid "My awesome radio" +msgstr "Moje wspaniałe radio" + +#: front/src/components/library/Track.vue:64 +#: src/components/library/Track.vue:75 +#: front/src/components/library/Track.vue:86 +#: front/src/components/manage/library/FilesTable.vue:63 +#: front/src/components/manage/library/FilesTable.vue:69 +#: front/src/components/manage/library/FilesTable.vue:75 +#: front/src/components/manage/library/FilesTable.vue:81 +#: front/src/components/manage/library/RequestsTable.vue:71 +#: front/src/components/manage/library/RequestsTable.vue:75 +#: front/src/components/manage/library/RequestsTable.vue:82 +#: front/src/components/manage/users/UsersTable.vue:61 +#: front/src/views/admin/users/UsersDetail.vue:49 +msgid "N/A" +msgstr "N/A" + +#: front/src/components/playlists/PlaylistModal.vue:31 +#: front/src/views/admin/users/UsersDetail.vue:21 +msgid "Name" +msgstr "Nazwa" + +#: front/src/components/auth/Settings.vue:88 +#: front/src/views/auth/PasswordResetConfirm.vue:14 +msgid "New password" +msgstr "Nowe hasło" + +#: front/src/components/Sidebar.vue:158 +msgid "New tracks will be appended here automatically." +msgstr "Nowe utwory automatycznie pojawią się tutaj." + +#: front/src/components/library/import/Main.vue:29 +msgid "Next step" +msgstr "Następny krok" + +#: front/src/components/audio/Player.vue:263 +msgid "Next track" +msgstr "Następny utwór" + +#: front/src/components/Sidebar.vue:125 +msgid "No" +msgstr "Nie" + +#: front/src/components/Home.vue:103 +msgid "No add-ons, no plugins : you only need a web library" +msgstr "Brak wtyczek, brak dodatków: potrzebujesz tylko biblioteki sieciowej" + +#: front/src/components/library/Track.vue:102 +msgid "No lyrics available for this track." +msgstr "Tekst nie jest dostępny dla tego utworu." + +#: front/src/components/playlists/Form.vue:81 +msgid "Nobody except me" +msgstr "Nikt poza mną" + +#: front/src/views/federation/LibraryDetail.vue:32 +msgid "Not following" +msgstr "Nie śledzisz" + +#: front/src/components/federation/LibraryTrackTable.vue:13 +#: front/src/components/federation/LibraryTrackTable.vue:67 +msgid "Not imported" +msgstr "Nie zaimportowano" + +#: front/src/components/manage/users/InvitationsTable.vue:51 +msgid "Not used" +msgstr "Nie użyty" + +#: front/src/App.vue:37 +msgid "Official website" +msgstr "Oficjalna strona" + +#: front/src/components/auth/Settings.vue:83 +msgid "Old password" +msgstr "Poprzednie hasło" + +#: front/src/components/library/import/FileUpload.vue:36 +msgid "Once all your files are uploaded, simply click the following button to check the import status." +msgstr "Kiedy wszystkie pliki z zostaną wysłane, naciśnij następujący przycisk, aby sprawdzić stan importowania." + +#: front/src/components/federation/LibraryCard.vue:21 +#: front/src/components/manage/users/InvitationsTable.vue:20 +msgid "Open" +msgstr "Otwórz" + +#: front/src/App.vue:63 +msgid "Options" +msgstr "Opcje" + +#: front/src/components/library/import/Main.vue:93 +msgid "Or" +msgstr "Lub" + +#: front/src/components/favorites/List.vue:23 +#: front/src/components/federation/LibraryTrackTable.vue:18 +#: front/src/components/library/Artists.vue:15 +#: src/components/library/Radios.vue:33 +#: front/src/components/manage/library/FilesTable.vue:9 +#: front/src/components/manage/library/RequestsTable.vue:9 +#: front/src/components/manage/users/InvitationsTable.vue:9 +#: front/src/components/manage/users/UsersTable.vue:9 +#: front/src/views/federation/LibraryList.vue:18 +#: src/views/playlists/List.vue:17 +msgid "Ordering" +msgstr "Porządkowanie" + +#: front/src/components/favorites/List.vue:31 +#: front/src/components/federation/LibraryTrackTable.vue:26 +#: front/src/components/library/Artists.vue:23 +#: src/components/library/Radios.vue:41 +#: front/src/components/manage/library/FilesTable.vue:17 +#: front/src/components/manage/library/RequestsTable.vue:17 +#: front/src/components/manage/users/UsersTable.vue:17 +#: front/src/views/federation/LibraryList.vue:26 +#: src/views/playlists/List.vue:25 +msgid "Ordering direction" +msgstr "Kolejność porządkowania" + +#: front/src/components/manage/users/InvitationsTable.vue:38 +msgid "Owner" +msgstr "Właściciel" + +#: front/src/components/PageNotFound.vue:33 +msgid "Page Not Found" +msgstr "Nie odnaleziono strony" + +#: front/src/components/PageNotFound.vue:7 +msgid "Page not found!" +msgstr "Nie odnaleziono strony!" + +#: front/src/components/auth/Login.vue:32 src/components/auth/Signup.vue:38 +msgid "Password" +msgstr "Haslo" + +#: front/src/components/auth/SubsonicTokenForm.vue:95 +msgid "Password updated" +msgstr "Zmieniono hasło" + +#: front/src/views/auth/PasswordResetConfirm.vue:28 +msgid "Password updated successfully" +msgstr "Pomyślnie zmieniono hasło" + +#: front/src/components/audio/Player.vue:262 +msgid "Pause track" +msgstr "Wstrzymaj utwór" + +#: front/src/components/federation/LibraryFollowTable.vue:46 +#: front/src/components/library/import/BatchDetail.vue:33 +#: front/src/components/library/import/BatchDetail.vue:69 +#: front/src/components/library/import/BatchList.vue:14 +#: front/src/components/library/import/FileUpload.vue:59 +#: front/src/components/manage/library/RequestsTable.vue:27 +#: front/src/components/manage/library/RequestsTable.vue:63 +msgid "Pending" +msgstr "Oczekujące" + +#: front/src/components/federation/LibraryFollowTable.vue:11 +#: front/src/views/federation/LibraryDetail.vue:26 +msgid "Pending approval" +msgstr "Oczekiwanie na przyjęcie" + +#: front/src/components/Sidebar.vue:217 +msgid "Pending follow requests" +msgstr "Oczekujące prośby o możliwość śledzenia" + +#: front/src/components/Sidebar.vue:216 src/views/admin/library/Base.vue:26 +msgid "Pending import requests" +msgstr "Oczekujące prośby o zaimportowanie" + +#: front/src/components/requests/Form.vue:26 src/views/federation/Base.vue:36 +msgid "Pending requests" +msgstr "Oczekujące prośby" + +#: front/src/components/manage/users/UsersTable.vue:42 +#: front/src/views/admin/users/UsersDetail.vue:68 +msgid "Permissions" +msgstr "Uprawnienia" + +#: front/src/components/audio/PlayButton.vue:9 +#: src/components/library/Track.vue:30 +msgid "Play" +msgstr "Odtwórz" + +#: front/src/components/audio/album/Card.vue:50 +#: front/src/components/audio/artist/Card.vue:44 +#: src/components/library/Album.vue:28 front/src/views/playlists/Detail.vue:23 +msgid "Play all" +msgstr "Odtwórz wszystkie" + +#: front/src/components/library/Artist.vue:26 +msgid "Play all albums" +msgstr "Odtwórz wszystkie albumy" + +#: front/src/components/audio/PlayButton.vue:58 +msgid "Play immediatly" +msgstr "Odtwórz natychmiastowo" + +#: front/src/components/audio/PlayButton.vue:15 +msgid "Play next" +msgstr "Odtwórz następny" + +#: front/src/components/audio/PlayButton.vue:16 +msgid "Play now" +msgstr "Odtwórz teraz" + +#: front/src/components/audio/Player.vue:261 +msgid "Play track" +msgstr "Odtwórz utwór" + +#: front/src/views/playlists/Detail.vue:90 +msgid "Playlist" +msgstr "Lista odtwarzania" + +#: front/src/views/playlists/Detail.vue:12 +msgid "Playlist containing %{ count } track, by %{ username }" +msgid_plural "Playlist containing %{ count } tracks, by %{ username }" +msgstr[0] "Lista odtwarzania zawierająca %{ count } utwór od %{ username }" +msgstr[1] "Lista odtwarzania zawierająca %{ count } utwory od %{ username }" +msgstr[2] "Lista odtwarzania zawierająca %{ count } utworów od %{ username }" + +#: front/src/components/playlists/Form.vue:9 +msgid "Playlist created" +msgstr "Utworzono listę odtwarzania" + +#: front/src/components/playlists/Editor.vue:4 +msgid "Playlist editor" +msgstr "Edytor list odtwarzania" + +#: front/src/components/playlists/Form.vue:21 +msgid "Playlist name" +msgstr "Nazwa listy odtwarzania" + +#: front/src/components/playlists/Form.vue:6 +msgid "Playlist updated" +msgstr "Zaktualizowano listę odtwarzania" + +#: front/src/components/playlists/Form.vue:25 +msgid "Playlist visibility" +msgstr "Widoczność listy odtwarzania" + +#: front/src/components/Sidebar.vue:56 src/components/library/Home.vue:16 +#: front/src/components/library/Library.vue:13 src/views/admin/Settings.vue:83 +#: front/src/views/playlists/List.vue:103 +msgid "Playlists" +msgstr "Listy odtwarzania" + +#: front/src/components/Home.vue:56 +msgid "Playlists? We got them" +msgstr "Listy odtwarzania? Mamy je" + +#: front/src/components/auth/Settings.vue:79 +msgid "Please double-check your password is correct" +msgstr "Sprawdź dwukrotnie, czy Twoje hasło jest poprawne" + +#: front/src/components/auth/Login.vue:9 +msgid "Please double-check your username/password couple is correct" +msgstr "Sprawdź dwukrotnie, czy połączenie nazwy użytkownika i hasła jest poprawne" + +#: front/src/components/auth/Settings.vue:46 +msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px." +msgstr "PNG, GIF lub JPG. Maksymalnie 2MB. Zostanie pomniejszony do 400x400 pikseli." + +#: front/src/components/library/import/Main.vue:26 +msgid "Previous step" +msgstr "Poprzedni krok" + +#: front/src/components/audio/Player.vue:260 +msgid "Previous track" +msgstr "Poprzedni utwór" + +#: front/src/views/auth/EmailConfirm.vue:26 +#: front/src/views/auth/PasswordResetConfirm.vue:31 +msgid "Proceed to login" +msgstr "Przejdź, aby zalogować się" + +#: front/src/components/federation/LibraryTrackTable.vue:50 +msgid "Published date" +msgstr "Data opublikowania" + +#: front/src/components/library/import/ArtistImport.vue:17 +msgid "Query template" +msgstr "Szablon zapytania" + +#: front/src/components/Sidebar.vue:20 +msgid "Queue" +msgstr "Kolejka" + +#: front/src/components/audio/Player.vue:203 +msgid "Queue shuffled!" +msgstr "Wymieszano kolejkę!" + +#: front/src/views/radios/Detail.vue:80 +msgid "Radio" +msgstr "Radio" + +#: front/src/components/library/radios/Builder.vue:226 +msgid "Radio Builder" +msgstr "Tworzenie radia" + +#: front/src/components/library/radios/Builder.vue:15 +#, fuzzy +msgid "Radio created" +msgstr "Nazwa radia" + +#: front/src/components/library/radios/Builder.vue:21 +msgid "Radio name" +msgstr "Nazwa radia" + +#: front/src/components/library/radios/Builder.vue:12 +#, fuzzy +msgid "Radio updated" +msgstr "Nazwa radia" + +#: front/src/components/library/Library.vue:10 +#: src/components/library/Radios.vue:141 +msgid "Radios" +msgstr "Radia" + +#: front/src/views/instance/Timeline.vue:7 +msgid "Recent activity on this instance" +msgstr "Ostatnia aktywność na tej instancji" + +#: front/src/components/library/Home.vue:24 +msgid "Recently added" +msgstr "Ostatnio dodane" + +#: front/src/components/library/Home.vue:11 +msgid "Recently favorited" +msgstr "Ostatnio dodane do ulubionych" + +#: front/src/components/library/Home.vue:6 +msgid "Recently listened" +msgstr "Ostatnio słuchane" + +#: front/src/components/library/import/BatchDetail.vue:81 +msgid "Recording MusicBrainz ID" +msgstr "ID MusicBrainz nagrania" + +#: front/src/views/admin/users/UsersDetail.vue:84 +#: front/src/views/federation/LibraryDetail.vue:122 +msgid "Refresh" +msgstr "Odśwież" + +#: front/src/components/federation/LibraryFollowTable.vue:42 +msgid "Refused" +msgstr "Odmówiono" + +#: front/src/components/auth/Profile.vue:12 +msgid "Registered since %{ date }" +msgstr "Zarejestrowany od %{ date }" + +#: front/src/components/auth/Signup.vue:9 +msgid "Registration are closed on this instance, you will need an invitation code to signup." +msgstr "Rejestracja na tej instancji jest wyłączona, potrzebujesz kodu zapraszającego aby zarejestrować się." + +#: front/src/components/manage/users/UsersTable.vue:71 +msgid "regular user" +msgstr "zwykły użytkownik" + +#: front/src/components/library/radios/Filter.vue:59 +msgid "Remove" +msgstr "Usuń" + +#: front/src/components/auth/Settings.vue:58 +msgid "Remove avatar" +msgstr "Usuń awatar" + +#: front/src/components/favorites/TrackFavoriteIcon.vue:19 +msgid "Remove from favorites" +msgstr "Usuń z ulubionych" + +#: front/src/components/auth/SubsonicTokenForm.vue:34 +#: front/src/components/auth/SubsonicTokenForm.vue:37 +msgid "Request a new password" +msgstr "Poproś o nowe hasło" + +#: front/src/components/auth/SubsonicTokenForm.vue:35 +msgid "Request a new Subsonic API password?" +msgstr "Poprosić o nowe hasło API Subsonic?" + +#: front/src/components/auth/SubsonicTokenForm.vue:43 +msgid "Request a password" +msgstr "Poproś o nowe hasło" + +#: front/src/App.vue:35 +msgid "Request music" +msgstr "Wyślij prośbę o muzykę" + +#: front/src/views/library/MusicRequest.vue:4 +#: src/views/library/MusicRequest.vue:21 +msgid "Request some music" +msgstr "Poproś o trochę muzyki" + +#: front/src/components/requests/Form.vue:20 +msgid "Request submitted!" +msgstr "Wysłano prośbę!" + +#: front/src/components/library/import/BatchDetail.vue:49 +msgid "Rerun errored jobs" +msgstr "Uruchom ponownie zadania zakończone błędem" + +#: front/src/components/library/import/BatchDetail.vue:187 +msgid "Rerun job" +msgstr "Uruchom ponownie zadanie" + +#: front/src/components/auth/Login.vue:34 src/views/auth/PasswordReset.vue:4 +#: front/src/views/auth/PasswordReset.vue:52 +msgid "Reset your password" +msgstr "Ustaw nowe hasło" + +#: front/src/components/library/import/TrackImport.vue:31 +msgid "Result %{ current }/%{ total }" +msgstr "Wynik %{ current }/%{ total }" + +#: front/src/components/favorites/List.vue:38 +#: src/components/library/Artists.vue:30 +#: front/src/components/library/Radios.vue:52 +#: src/views/federation/LibraryList.vue:33 +#: front/src/views/playlists/List.vue:32 +msgid "Results per page" +msgstr "Wyniki na stronę" + +#: front/src/components/admin/SettingsGroup.vue:63 +#: front/src/components/library/radios/Builder.vue:29 +msgid "Save" +msgstr "Zapisz" + +#: front/src/views/federation/LibraryDetail.vue:112 +msgid "Scan triggered!" +msgstr "Wywołano skanowanie!" + +#: front/src/components/federation/LibraryTrackTable.vue:5 +#: front/src/components/library/Artists.vue:10 +#: src/components/library/Radios.vue:29 +#: front/src/components/library/import/BatchDetail.vue:62 +#: front/src/components/library/import/BatchList.vue:7 +#: front/src/components/manage/library/FilesTable.vue:5 +#: front/src/components/manage/library/RequestsTable.vue:5 +#: front/src/components/manage/users/InvitationsTable.vue:5 +#: front/src/components/manage/users/UsersTable.vue:5 +#: front/src/views/federation/LibraryList.vue:14 +#: src/views/playlists/List.vue:13 +msgid "Search" +msgstr "Szukaj" + +#: front/src/components/library/import/Main.vue:85 +msgid "Search an entity you want to import:" +msgstr "Szukaj zawartości którą chcesz zaimportować:" + +#: front/src/components/manage/library/RequestsTable.vue:180 +msgid "Search by artist, username, comment..." +msgstr "Szukaj według wykonawcy, nazwy użytkownika, komentarzu…" + +#: front/src/components/library/import/BatchDetail.vue:188 +msgid "Search by source..." +msgstr "Szukaj według źródła…" + +#: front/src/components/library/import/BatchList.vue:116 +msgid "Search by submitter, source..." +msgstr "Szukaj według wysyłającego, źródła…" + +#: front/src/components/federation/LibraryTrackTable.vue:182 +#: front/src/components/manage/library/FilesTable.vue:175 +msgid "Search by title, artist, domain..." +msgstr "Szukaj według tytułu, wykonawcy, domeny…" + +#: front/src/components/federation/LibraryFollowTable.vue:140 +msgid "Search by username, domain..." +msgstr "Szukaj według nazwy użytkownika, domeny…" + +#: front/src/components/manage/users/InvitationsTable.vue:152 +msgid "Search by username, email, code..." +msgstr "Szukaj według nazwy użytkownika, adresu e-mail, kodu…" + +#: front/src/components/manage/users/UsersTable.vue:162 +msgid "Search by username, email, name..." +msgstr "Szukaj według nazwy użytkownika, adresu e-mail, nazwy…" + +#: front/src/components/audio/SearchBar.vue:20 +msgid "Search for artists, albums, tracks..." +msgstr "Szukaj wykonawców, albumów, utworów…" + +#: front/src/components/audio/Search.vue:2 +msgid "Search for some music" +msgstr "Wyszukaj trochę muzyki" + +#: front/src/components/library/Track.vue:105 +msgid "Search on lyrics.wikia.com" +msgstr "Szukaj na lyrics.wikia.com" + +#: front/src/components/library/Album.vue:33 +#: src/components/library/Artist.vue:31 +#: front/src/components/library/Track.vue:40 +msgid "Search on Wikipedia" +msgstr "Szukaj na Wikipedii" + +#: front/src/components/library/import/TrackImport.vue:42 +msgid "Search query" +msgstr "Kryterium wyszukiwania" + +#: front/src/views/admin/Settings.vue:15 +msgid "Sections" +msgstr "Sekcje" + +#: front/src/components/library/radios/Builder.vue:41 +msgid "Select a filter" +msgstr "Zaznacz filtr" + +#: front/src/components/common/ActionTable.vue:61 +msgid "Select all %{ total } elements" +msgid_plural "Select all %{ total } elements" +msgstr[0] "Zaznacz %{ total } element" +msgstr[1] "Zaznacz wszystkie %{ total } elementy" +msgstr[2] "Zaznacz wszystkie %{ total } elementów" + +#: front/src/components/library/import/FileUpload.vue:22 +msgid "Select files to upload..." +msgstr "Wybierz pliki do wysłania…" + +#: front/src/components/common/ActionTable.vue:69 +msgid "Select only current page" +msgstr "Zaznacz tylko obecną stronę" + +#: front/src/components/library/import/Main.vue:19 +msgid "Select relevant sources or files for import" +msgstr "Wybierz odpowiednie źródła i pliki do zaimportowania" + +#: front/src/components/federation/LibraryCard.vue:43 +msgid "Send a follow request" +msgstr "Wyślij prośbę o możliwość śledzenia" + +#: front/src/components/Sidebar.vue:97 +#: src/components/manage/users/UsersTable.vue:184 +#: front/src/views/admin/users/UsersDetail.vue:165 +msgid "Settings" +msgstr "Ustawienia" + +#: front/src/components/auth/Settings.vue:10 +msgid "Settings updated" +msgstr "Zaktualizowano ustawienia" + +#: front/src/components/admin/SettingsGroup.vue:11 +msgid "Settings updated successfully." +msgstr "Pomyślnie zaktualizowano ustawienia." + +#: front/src/components/auth/Profile.vue:24 +msgid "Settings..." +msgstr "Ustawienia…" + +#: front/src/components/manage/users/InvitationForm.vue:27 +msgid "Share link" +msgstr "Udostępnij odnośnik" + +#: front/src/components/audio/artist/Card.vue:30 +msgid "Show 1 more album" +msgid_plural "Show %{ count } more albums" +msgstr[0] "Pokaż 1 kolejny album" +msgstr[1] "Pokaż %{ count } kolejne albumy" +msgstr[2] "Pokaż %{ count } kolejnych albumów" + +#: front/src/components/audio/album/Card.vue:40 +msgid "Show 1 more track" +msgid_plural "Show %{ count } more tracks" +msgstr[0] "Pokaż 1 kolejny utwór" +msgstr[1] "Pokaż %{ count } kolejne utwory" +msgstr[2] "Pokaż %{ count } kolejnych utworów" + +#: front/src/components/forms/PasswordInput.vue:25 +msgid "Show/hide password" +msgstr "Pokaż/ukryj hasło" + +#: front/src/components/federation/LibraryFollowTable.vue:97 +#: front/src/components/federation/LibraryTrackTable.vue:98 +#: front/src/components/library/import/BatchDetail.vue:128 +#: front/src/components/library/import/BatchList.vue:73 +#: front/src/components/manage/library/FilesTable.vue:97 +#: front/src/components/manage/library/RequestsTable.vue:104 +#: front/src/components/manage/users/InvitationsTable.vue:76 +#: front/src/components/manage/users/UsersTable.vue:87 +msgid "Showing results %{ start }-%{ end } on %{ total }" +msgstr "Wyświetlanie wyników %{ start }-%{ end } z %{ total }" + +#: front/src/components/audio/Player.vue:269 +msgid "Shuffle your queue" +msgstr "Wymieszaj kolejkę" + +#: front/src/components/auth/Signup.vue:95 +msgid "Sign Up" +msgstr "Rejestracja" + +#: front/src/components/manage/users/UsersTable.vue:40 +#: front/src/views/admin/users/UsersDetail.vue:37 +msgid "Sign-up" +msgstr "Rejestracja" + +#: front/src/components/audio/track/Table.vue:31 +msgid "Simply copy paste the snippet below into a terminal to launch the download." +msgstr "Po prostu skopiuj i wklej poniższy urywek do terminala aby zacząć pobieranie." + +#: front/src/components/library/Track.vue:69 +#: front/src/components/library/import/FileUpload.vue:44 +#: front/src/components/manage/library/FilesTable.vue:44 +msgid "Size" +msgstr "Rozmiar" + +#: front/src/components/library/import/BatchDetail.vue:37 +#: front/src/components/library/import/BatchDetail.vue:72 +msgid "Skipped" +msgstr "Pominięto" + +#: front/src/components/requests/Form.vue:3 +msgid "Something's missing in the library? Let us know what you would like to listen!" +msgstr "Brakuje czegoś w bibliotece? Powiedz nam, czego chcesz posłuchać!" + +#: front/src/components/audio/Search.vue:25 +msgid "Sorry, we did not found any album matching your query" +msgstr "Przepraszamy, nie znaleziono albumu spełniającego Twoje kryteria" + +#: front/src/components/audio/Search.vue:16 +msgid "Sorry, we did not found any artist matching your query" +msgstr "Przepraszamy, nie znaleziono wykonawcy spełniającego Twoje kryteria" + +#: front/src/components/library/import/BatchDetail.vue:82 +#: front/src/components/library/import/BatchList.vue:38 +#: front/src/components/library/import/TrackImport.vue:17 +msgid "Source" +msgstr "Źródło" + +#: front/src/App.vue:41 +msgid "Source code" +msgstr "Kod źródłowy" + +#: front/src/App.vue:40 +msgid "Source code (%{version})" +msgstr "Kod źródłowy (%{version})" + +#: front/src/components/auth/Profile.vue:20 +#: front/src/components/manage/users/UsersTable.vue:70 +msgid "Staff member" +msgstr "Członek administracji" + +#: front/src/components/radios/Button.vue:4 +msgid "Start" +msgstr "Rozpocznij" + +#: front/src/components/library/import/FileUpload.vue:28 +msgid "Start Upload" +msgstr "Rozpocznij wysyłanie" + +#: front/src/views/admin/Settings.vue:86 +msgid "Statistics" +msgstr "Statystyki" + +#: front/src/components/federation/LibraryFollowTable.vue:23 +#: front/src/components/federation/LibraryTrackTable.vue:46 +#: front/src/components/library/import/BatchDetail.vue:66 +#: front/src/components/library/import/BatchDetail.vue:83 +#: front/src/components/library/import/BatchList.vue:11 +#: front/src/components/library/import/BatchList.vue:37 +#: front/src/components/library/import/FileUpload.vue:45 +#: front/src/components/manage/library/RequestsTable.vue:24 +#: front/src/components/manage/library/RequestsTable.vue:48 +#: front/src/components/manage/users/InvitationsTable.vue:17 +#: front/src/components/manage/users/InvitationsTable.vue:39 +#: front/src/components/manage/users/UsersTable.vue:43 +msgid "Status" +msgstr "Stan" + +#: front/src/components/radios/Button.vue:3 +msgid "Stop" +msgstr "Zatrzymaj" + +#: front/src/components/Sidebar.vue:159 +msgid "Stop radio" +msgstr "Zatrzymaj radio" + +#: front/src/components/library/import/FileUpload.vue:32 +msgid "Stop Upload" +msgstr "Zatrzymaj wysyłanie" + +#: front/src/App.vue:9 src/components/requests/Form.vue:17 +msgid "Submit" +msgstr "Wyślij" + +#: front/src/components/requests/Form.vue:22 +msgid "Submit another request" +msgstr "Wyślij kolejną prośbę" + +#: front/src/components/library/import/BatchDetail.vue:26 +#: front/src/components/library/import/BatchList.vue:39 +msgid "Submitted by" +msgstr "Wysłano przez" + +#: front/src/views/admin/Settings.vue:85 +msgid "Subsonic" +msgstr "Subsonic" + +#: front/src/components/auth/SubsonicTokenForm.vue:2 +msgid "Subsonic API password" +msgstr "Hasło API Subsonic" + +#: front/src/components/library/import/BatchDetail.vue:71 +#: front/src/components/library/import/BatchList.vue:16 +#: front/src/components/library/import/FileUpload.vue:56 +msgid "Success" +msgstr "Powodzenie" + +#: front/src/App.vue:11 +msgid "Suggested choices" +msgstr "Polecane wybory" + +#: front/src/components/playlists/Editor.vue:9 +msgid "Syncing changes to server..." +msgstr "Synchronizowanie zmian z serwerem…" + +#: front/src/components/Home.vue:26 +msgid "That's simple: we loved Grooveshark and we want to build something even better." +msgstr "To proste: kochamy Grooveshark i chcemy utworzyć coś jeszcze lepszego." + +#: front/src/components/requests/Form.vue:73 +msgid "The Beatles, Mickael Jackson…" +msgstr "The Beatles, Klocuch…" + +#: front/src/App.vue:59 +msgid "The funkwhale logo was kindly designed and provided by Francis Gading." +msgstr "Logo Funkwhale zostało zaprojektowane i dostarczone przez Francisa Gadinga." + +#: front/src/components/Home.vue:124 +msgid "The plaform is free and open-source, you can install it and modify it without worries" +msgstr "Platforma jest wolna i otwartoźródłowa, każdy może bez zmartwień zainstalować i modyfikować ją" + +#: front/src/components/auth/SubsonicTokenForm.vue:4 +msgid "The Subsonic API is not available on this Funkwhale instance." +msgstr "API Subsonic nie jest dostępne na tej instancji Funkwhale." + +#: front/src/components/requests/Form.vue:74 +msgid "The White Album, Thriller…" +msgstr "The White Album, Aezakmi…" + +#: front/src/components/audio/track/Table.vue:30 +msgid "There is currently no way to download directly multiple tracks from funkwhale as a ZIP archive. However, you can use a command line tools such as cURL to easily download a list of tracks." +msgstr "Obecnie nie istnieje sposób na bezpośrednie pobranie wielu utworów z funkwhale jako archiwum ZIP. Możesz jednak użyć narzędzi takich jak cURL, aby łatwo pobrać listę utworów." + +#: front/src/components/library/import/Main.vue:149 +msgid "This import will be associated with the music request below. After the import is finished, the request will be marked as fulfilled." +msgstr "To importowanie zostanie przypisane do poniższego żądania. Gdy importowanie zakończy się, żądanie zostanie oznaczone jako wypełnione." + +#: front/src/views/federation/LibraryDetail.vue:195 +msgid "This indicate if the remote library granted you access" +msgstr "Wskazuje to, czy masz dostęp do zdalnej biblioteki" + +#: front/src/components/auth/Profile.vue:16 +msgid "This is you!" +msgstr "To Ty!" + +#: front/src/components/common/ActionTable.vue:37 +msgid "This may affect a lot of elements, please double check this is really what you want." +msgstr "Może to wpływać na wiele rzeczy, sprawdź dwukrotnie czy to na pewno to, czego chcesz." + +#: front/src/components/audio/PlayButton.vue:61 +msgid "This track is not imported and cannot be played" +msgstr "Ten utwór nie został zaimportowany i nie może zostać odtworzony" + +#: front/src/views/playlists/Detail.vue:37 +msgid "This will completely delete this playlist and cannot be undone." +msgstr "To całkowicie usunie listę odtwarzania i nie może zostać cofnięte." + +#: front/src/views/radios/Detail.vue:27 +msgid "This will completely delete this radio and cannot be undone." +msgstr "To bezpowrotnie usunie radio." + +#: front/src/components/auth/SubsonicTokenForm.vue:51 +msgid "This will completely disable access to the Subsonic API using from account." +msgstr "To całkowicie wyłączy dostęp do API Subsonic z tego konta." + +#: front/src/App.vue:137 +msgid "This will erase your local data and disconnect you, do you want to continue?" +msgstr "To wyczyści Twoje lokalne dane i rozłączy Cię, czy chcesz kontynuować?" + +#: front/src/components/auth/SubsonicTokenForm.vue:36 +msgid "This will log you out from existing devices that use the current password." +msgstr "To wyloguje Cię z urządzeń na których jesteś obecnie zalogowany." + +#: front/src/components/playlists/Editor.vue:44 +msgid "This will remove all tracks from this playlist and cannot be undone." +msgstr "To bezpowrotnie usunie wszystkie utwory z tej listy odtwarzania." + +#: front/src/components/audio/track/Table.vue:6 +#: front/src/components/federation/LibraryTrackTable.vue:47 +#: front/src/components/manage/library/FilesTable.vue:37 +msgid "Title" +msgstr "Tytuł" + +#: front/src/components/audio/SearchBar.vue:27 +#: src/components/library/Track.vue:174 +#: front/src/components/library/import/BatchDetail.vue:84 +#: front/src/components/metadata/Search.vue:138 +msgid "Track" +msgstr "Utwór" + +#: front/src/components/library/Track.vue:53 +msgid "Track information" +msgstr "Informacje o utworze" + +#: front/src/components/library/radios/Filter.vue:44 +msgid "Track matching filter" +msgstr "Utwór zgodny z filtrem" + +#: front/src/components/instance/Stats.vue:54 +msgid "tracks" +msgstr "utwory" + +#: front/src/components/library/Album.vue:43 +#: front/src/components/playlists/PlaylistModal.vue:33 +#: front/src/views/federation/Base.vue:8 src/views/playlists/Detail.vue:50 +#: front/src/views/radios/Detail.vue:34 +msgid "Tracks" +msgstr "Utwory" + +#: front/src/views/federation/LibraryDetail.vue:125 +msgid "Tracks available in this library" +msgstr "Utwory dostępne w bibliotece" + +#: front/src/components/library/Artist.vue:54 +msgid "Tracks by this artist" +msgstr "Utwory tego wykonawcy" + +#: front/src/components/instance/Stats.vue:25 +msgid "Tracks favorited" +msgstr "Ulubione utwory" + +#: front/src/components/instance/Stats.vue:19 +msgid "tracks listened" +msgstr "wysłuchane utwory" + +#: front/src/views/federation/LibraryDetail.vue:109 +msgid "Trigger scan" +msgstr "Wywołaj skanowanie" + +#: front/src/components/manage/library/FilesTable.vue:41 +msgid "Type" +msgstr "Rodzaj" + +#: front/src/components/About.vue:15 +msgid "Unfortunately, owners of this instance did not yet take the time to complete this page." +msgstr "Niestety, właściciele tej instancji nie znaleźli czasu na wypełnienie tej strony." + +#: front/src/views/federation/LibraryDetail.vue:95 +msgid "Unknown" +msgstr "Nieznany" + +#: front/src/components/Home.vue:37 +msgid "Unlimited music" +msgstr "Nieograniczona muzyka" + +#: front/src/components/audio/Player.vue:264 +msgid "Unmute" +msgstr "Cofnij wyciszenie" + +#: front/src/components/auth/Settings.vue:50 +msgid "Update avatar" +msgstr "Aktualizuj awatar" + +#: front/src/components/playlists/Form.vue:33 +msgid "Update playlist" +msgstr "Aktualizuj listę odtwarzania" + +#: front/src/components/auth/Settings.vue:27 +msgid "Update settings" +msgstr "Aktualizuj ustawienia" + +#: front/src/views/auth/PasswordResetConfirm.vue:21 +msgid "Update your password" +msgstr "Aktualizuj swoje hasło" + +#: front/src/components/manage/users/UsersTable.vue:172 +#: front/src/views/admin/users/UsersDetail.vue:153 +msgid "Upload" +msgstr "Wyślij" + +#: front/src/components/auth/Settings.vue:45 +msgid "Upload a new avatar" +msgstr "Dodaj nowy awatar" + +#: front/src/components/library/import/Main.vue:7 +msgid "Uploaded files or external source" +msgstr "Wysłane pliki lub z zewnętrznego źródła" + +#: front/src/components/library/import/FileUpload.vue:57 +msgid "Uploading..." +msgstr "Wysyłanie…" + +#: front/src/App.vue:45 +msgid "Use another instance" +msgstr "Skorzystaj z innej instancji" + +#: front/src/components/requests/Form.vue:75 +msgid "Use this comment box to add details to your request if needed" +msgstr "Użyj tego pola komentarzy, aby dodać szczegóły zgłoszenia, jeżeli potrzebne" + +#: front/src/views/federation/LibraryDetail.vue:196 +msgid "Use this flag to enable/disable federation with this library" +msgstr "Użyj tej opcji aby wyłączyć/włączyć federację dla tej biblioteki" + +#: front/src/views/auth/PasswordReset.vue:12 +msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password." +msgstr "Użyj tego formularza aby poprosić o zresetowanie hasła. Otrzymasz e-mail z instrukcjami resetowania hasła na podany adres." + +#: front/src/components/federation/LibraryForm.vue:6 +msgid "Use this form to scan an instance and setup federation." +msgstr "Użyj tego formularza aby przeskanować instancję i skonfigurować federację." + +#: front/src/components/manage/users/InvitationsTable.vue:49 +msgid "Used" +msgstr "Zużyty" + +#: front/src/components/manage/library/RequestsTable.vue:47 +msgid "User" +msgstr "Użytkownik" + +#: front/src/components/instance/Stats.vue:5 +msgid "User activity" +msgstr "Aktywność użytkownika" + +#: front/src/components/library/Radios.vue:20 +msgid "User radios" +msgstr "Radia użytkownika" + +#: front/src/components/auth/Signup.vue:19 +#: front/src/components/manage/users/UsersTable.vue:37 +msgid "Username" +msgstr "Nazwa użytkownika" + +#: front/src/components/auth/Login.vue:15 +msgid "Username or email" +msgstr "Nazwa użytkownika lub adres e-mail" + +#: front/src/components/instance/Stats.vue:13 +msgid "users" +msgstr "użytkownicy" + +#: front/src/components/Sidebar.vue:103 src/views/admin/Settings.vue:81 +#: front/src/views/admin/users/Base.vue:5 src/views/admin/users/UsersList.vue:3 +#: front/src/views/admin/users/UsersList.vue:21 +msgid "Users" +msgstr "Użytkownicy" + +#: front/src/components/library/Album.vue:37 +#: src/components/library/Artist.vue:35 +#: front/src/components/library/Track.vue:44 +#: front/src/components/library/import/ArtistImport.vue:131 +#: front/src/components/metadata/ArtistCard.vue:49 +#: front/src/components/metadata/ReleaseCard.vue:53 +msgid "View on MusicBrainz" +msgstr "Wyświetl na MusicBrainz" + +#: front/src/components/playlists/PlaylistModal.vue:20 +msgid "We cannot add the track to a playlist" +msgstr "Nie udało się dodać tego utworu do listy odtwarzania" + +#: front/src/components/playlists/Form.vue:14 +msgid "We cannot create the playlist" +msgstr "Nie udało się utworzyć listy odtwarzania" + +#: front/src/components/auth/Signup.vue:13 +msgid "We cannot create your account" +msgstr "Nie udało się utworzyć Ci konta" + +#: front/src/components/auth/Login.vue:7 +msgid "We cannot log you in" +msgstr "Nie udało się zalogować Cię" + +#: front/src/components/auth/Settings.vue:38 +msgid "We cannot save your avatar" +msgstr "Nie udało się zapisać awatara" + +#: front/src/components/auth/Settings.vue:14 +msgid "We cannot save your settings" +msgstr "Nie udało się zapisać ustawień" + +#: front/src/components/Home.vue:130 +msgid "We do not track you or bother you with ads" +msgstr "Nie śledzimy Cię i nie wyświetlamy Ci reklam" + +#: front/src/components/library/import/FileUpload.vue:5 +msgid "We recommend using Picard for that purpose." +msgstr "Polecamy używać do tego Picard." + +#: front/src/components/Home.vue:7 +msgid "We think listening to music should be simple." +msgstr "Uważamy, że słuchanie muzyki powinno być proste." + +#: front/src/components/PageNotFound.vue:10 +msgid "We're sorry, the page you asked for does not exist:" +msgstr "Przepraszamy, strona której szukasz nie istnieje:" + +#: front/src/components/requests/Form.vue:21 +msgid "We've received your request, you'll get some groove soon ;)" +msgstr "Otrzymaliśmy Twoje zgłoszenie, wkrótce dostaniesz trochę groove-u ;)" + +#: front/src/components/Home.vue:152 +msgid "Welcome" +msgstr "Witamy" + +#: front/src/components/Home.vue:5 +msgid "Welcome on Funkwhale" +msgstr "Witamy na Funkwhale" + +#: front/src/components/library/import/Main.vue:114 +msgid "What is metadata?" +msgstr "Czym są metadane?" + +#: front/src/views/federation/LibraryDetail.vue:197 +msgid "When enabled, auto importing will automatically import new tracks published in this library" +msgstr "Jeżeli włączone, automatyczne importowanie będzie automatycznie importować nowe utwory opublikowane w tej bibliotece" + +#: front/src/components/Home.vue:24 +msgid "Why funkwhale?" +msgstr "Dlaczego funkwhale?" + +#: front/src/components/Sidebar.vue:124 +msgid "Yes" +msgstr "Tak" + +#: front/src/components/auth/Logout.vue:8 +msgid "Yes, log me out!" +msgstr "Tak, wyloguj mnie!" + +#: front/src/components/auth/Logout.vue:7 +msgid "You are currently logged in as %{ username }" +msgstr "Jesteś obecnie zalogowany jako %{ username }" + +#: front/src/components/library/import/Main.vue:111 +msgid "You can also skip this step and enter metadata manually." +msgstr "Możesz też pominąć ten krok i wprowadzić metadane ręcznie." + +#: front/src/components/Home.vue:136 +msgid "You can invite friends and family to your instance so they can enjoy your music" +msgstr "Możesz zaprosić znajomych i rodzinę na swoją instancję, aby mogli się cieszyć dodaną przez Ciebie muzyką" + +#: front/src/components/library/radios/Builder.vue:7 +msgid "You can use this interface to build your own custom radio, which will play tracks according to your criteria." +msgstr "Możesz używać tego interfejsu aby utworzyć własne radio, które będzie odtwarzać utwory pasujące do Twoich kryteriów." + +#: front/src/components/auth/SubsonicTokenForm.vue:8 +msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance." +msgstr "Możesz używać tego, aby cieszyć się muzyką i swoją listą odtwarzania w trybie offline, na przykład na smartfonie i tablecie." + +#: front/src/components/Sidebar.vue:156 +msgid "You have a radio playing" +msgstr "Odtwarzasz radio" + +#: front/src/App.vue:6 +msgid "You need to select an instance in order to continue" +msgstr "Musisz wybrać instancję aby kontynuować" + +#: front/src/components/auth/Settings.vue:100 +msgid "You will be logged out from this session and have to log in with the new one" +msgstr "Zostaniesz wylogowany z tej sesji i musisz zalogować się nowym hasłem" + +#: front/src/components/auth/Settings.vue:71 +msgid "You will have to update your password on your clients that use this password." +msgstr "Będziesz musiał zmienić hasło na klientach używających tego hasła." + +#: front/src/components/library/import/Main.vue:103 +msgid "You will import:" +msgstr "Zaimportujesz:" + +#: front/src/views/auth/EmailConfirm.vue:24 +msgid "Your email address was confirmed, you can now use the service without limitations." +msgstr "Twój adres e-mail został potwierdzony, możesz używać usługi bez ograniczeń." + +#: front/src/components/favorites/List.vue:109 +msgid "Your Favorites" +msgstr "Twoje ulubione" + +#: front/src/components/Home.vue:117 +msgid "Your music, your way" +msgstr "Twoja muzyka, po Twojemu" + +#: front/src/views/auth/PasswordResetConfirm.vue:29 +msgid "Your password has been updated successfully." +msgstr "Twoje hasło zostało pomyślnie zmienione." + +#: front/src/components/auth/Settings.vue:101 +msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password" +msgstr "Twoje hasło Subsonic zostanie zmienione na nowe, losowe i zostaniesz wylogowany z urządzeń korzystających ze starego hasła Subsonic" + +#: front/src/components/audio/PlayButton.vue:156 +msgid "%{ count } track was added to your queue" +msgid_plural "%{ count } tracks were added to your queue" +msgstr[0] "Dodano %{ count } utwór do kolejki" +msgstr[1] "Dodano %{ count } utwory do kolejki" +msgstr[2] "Dodano %{ count } utworów do kolejki" diff --git a/front/locales/pt_PT/LC_MESSAGES/app.po b/front/locales/pt_PT/LC_MESSAGES/app.po new file mode 100644 index 000000000..03361742c --- /dev/null +++ b/front/locales/pt_PT/LC_MESSAGES/app.po @@ -0,0 +1,2442 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the front package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: front 1.0.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-07-17 19:29+0200\n" +"PO-Revision-Date: 2018-07-22 20:29+0000\n" +"Last-Translator: troll \n" +"Language-Team: none\n" +"Language: pt_PT\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 2.20\n" + +#: front/src/components/playlists/PlaylistModal.vue:9 +msgid "\"%{ title }\", by %{ artist }" +msgstr "\"%{ title }\", de %{ artist }" + +#: front/src/components/Sidebar.vue:24 +msgid "(%{ index } of %{ length })" +msgstr "" + +#: front/src/components/Sidebar.vue:22 +msgid "(empty)" +msgstr "(vazio)" + +#: front/src/components/common/ActionTable.vue:43 +#: front/src/components/common/ActionTable.vue:51 +msgid "%{ count } on %{ total } selected" +msgid_plural "%{ count } on %{ total } selected" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/Sidebar.vue:116 src/views/federation/LibraryDetail.vue:87 +msgid "%{ count } track" +msgid_plural "%{ count } tracks" +msgstr[0] "%{ count } tema" +msgstr[1] "%{ count } temas" + +#: front/src/components/library/Artist.vue:13 +msgid "%{ count } track in %{ albumsCount } albums" +msgid_plural "%{ count } tracks in %{ albumsCount } albums" +msgstr[0] "%{ count } tema em %{ albumsCount } álbuns" +msgstr[1] "%{ count } temas em %{ albumsCount } álbuns" + +#: front/src/components/library/radios/Builder.vue:66 +msgid "%{ count } track matching combined filters" +msgid_plural "%{ count } tracks matching combined filters" +msgstr[0] "%{ count } música corresponde aos filtros selecionados" +msgstr[1] "%{ count } músicas correspondem aos filtros selecionados" + +#: front/src/components/playlists/Card.vue:18 +msgid "%{ count} track" +msgid_plural "%{ count } tracks" +msgstr[0] "%{ count} música" +msgstr[1] "%{ count } músicas" + +#: front/src/components/common/Duration.vue:2 +#, fuzzy +msgid "%{ hours } h %{ minutes } min" +msgstr "%{ hours } h %{ minutes } min" + +#: front/src/components/common/Duration.vue:5 +#, fuzzy +msgid "%{ minutes } min" +msgstr "%{ minutes } min" + +#: front/src/components/activity/Like.vue:7 +msgid "%{ user } favorited a track" +msgstr "%{ user } gostou de uma música" + +#: front/src/components/activity/Listen.vue:7 +msgid "%{ user } listened to a track" +msgstr "%{ user } escutou uma música" + +#: front/src/components/auth/Profile.vue:49 +msgid "%{ username }'s profile" +msgstr "%{ username } perfil" + +#: front/src/components/audio/artist/Card.vue:41 +msgid "1 album" +msgid_plural "%{ count } albums" +msgstr[0] "1 álbum" +msgstr[1] "%{ count } álbums" + +#: front/src/components/favorites/List.vue:10 +msgid "1 favorite" +msgid_plural "%{ count } favorites" +msgstr[0] "1 preferida" +msgstr[1] "%{ count } preferidas" + +#: front/src/components/audio/album/Card.vue:54 +#: front/src/components/federation/LibraryCard.vue:25 +msgid "1 track" +msgid_plural "%{ count } tracks" +msgstr[0] "1 música" +msgstr[1] "%{ count } músicas" + +#: front/src/components/About.vue:5 +msgid "About %{ instance }" +msgstr "Sobre %{ instance }" + +#: front/src/App.vue:54 +msgid "About Funkwhale" +msgstr "Sobre Funkwhale" + +#: front/src/App.vue:32 src/components/About.vue:8 src/components/About.vue:55 +msgid "About this instance" +msgstr "Sobre esta instância" + +#: front/src/components/manage/library/RequestsTable.vue:28 +#: front/src/components/manage/library/RequestsTable.vue:62 +msgid "Accepted" +msgstr "Aceitado" + +#: front/src/components/auth/SubsonicTokenForm.vue:111 +msgid "Access disabled" +msgstr "Acesso desativado" + +#: front/src/components/Home.vue:109 +msgid "Access your music from a clean interface that focus on what really matters" +msgstr "" +"Acesse sua música a partir de uma interface limpa que se concentra no que " +"realmente importa" + +#: front/src/views/admin/users/UsersDetail.vue:54 +msgid "Account active" +msgstr "Conta ativa" + +#: front/src/components/auth/Settings.vue:5 +msgid "Account settings" +msgstr "Configurações da conta" + +#: front/src/components/auth/Settings.vue:257 +msgid "Account Settings" +msgstr "Configurações da conta" + +#: front/src/components/manage/users/UsersTable.vue:39 +msgid "Account status" +msgstr "Status da Conta" + +#: front/src/views/auth/PasswordReset.vue:14 +msgid "Account's email" +msgstr "Email da conta" + +#: front/src/components/common/ActionTable.vue:82 +msgid "Action %{ action } was launched successfully on %{ count } element" +msgid_plural "Action %{ action } was launched successfully on %{ count } elements" +msgstr[0] "A ação %{ action } foi lançada com sucesso em %{ count } item" +msgstr[1] "A ação %{ action } foi lançada com sucesso em %{ count } itens" + +#: front/src/components/common/ActionTable.vue:8 +#: front/src/components/federation/LibraryFollowTable.vue:24 +#: front/src/components/library/radios/Builder.vue:50 +#: front/src/components/manage/library/RequestsTable.vue:54 +msgid "Actions" +msgstr "Ações" + +#: front/src/components/manage/users/UsersTable.vue:53 +msgid "Active" +msgstr "Ativo" + +#: front/src/components/Sidebar.vue:60 +msgid "Activity" +msgstr "Atividade" + +#: front/src/components/federation/LibraryFollowTable.vue:21 +msgid "Actor" +msgstr "Ator" + +#: front/src/views/federation/LibraryList.vue:8 +msgid "Add a new library" +msgstr "Adicione uma nova biblioteca" + +#: front/src/components/library/radios/Builder.vue:36 +msgid "Add filter" +msgstr "Adicionar um filtro" + +#: front/src/components/library/radios/Builder.vue:26 +msgid "Add filters to customize your radio" +msgstr "Adicione filtros para personalizar seu rádio" + +#: front/src/components/audio/PlayButton.vue:53 +msgid "Add to current queue" +msgstr "Adicionar à fila atual" + +#: front/src/components/favorites/TrackFavoriteIcon.vue:4 +#: front/src/components/favorites/TrackFavoriteIcon.vue:21 +msgid "Add to favorites" +msgstr "Adicionar aos favoritos" + +#: front/src/components/playlists/TrackPlaylistIcon.vue:6 +#: front/src/components/playlists/TrackPlaylistIcon.vue:32 +msgid "Add to playlist..." +msgstr "Adicionar à Playlist..." + +#: front/src/components/audio/PlayButton.vue:14 +msgid "Add to queue" +msgstr "Adicionar à fila" + +#: front/src/components/playlists/PlaylistModal.vue:115 +msgid "Add to this playlist" +msgstr "Adicionar a esta playlist" + +#: front/src/components/playlists/PlaylistModal.vue:54 +msgid "Add track" +msgstr "Adicionar música" + +#: front/src/components/manage/users/UsersTable.vue:69 +msgid "Admin" +msgstr "Admin" + +#: front/src/components/Sidebar.vue:64 +msgid "Administration" +msgstr "Administração" + +#: front/src/components/audio/SearchBar.vue:26 src/components/audio/track/Table.vue:8 +#: front/src/components/federation/LibraryTrackTable.vue:49 +#: front/src/components/library/Album.vue:91 +#: front/src/components/manage/library/FilesTable.vue:39 +#: front/src/components/metadata/Search.vue:134 +msgid "Album" +msgstr "Álbum" + +#: front/src/components/library/import/ReleaseImport.vue:3 +msgid "Album %{ title } (%{ count } track) by %{ artist }" +msgid_plural "Album %{ title } (%{ count } tracks) by %{ artist }" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/library/Album.vue:12 +msgid "Album containing %{ count } track, by %{ artist }" +msgid_plural "Album containing %{ count } tracks, by %{ artist }" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/library/Track.vue:20 +msgid "Album page" +msgstr "Página do álbum" + +#: front/src/components/audio/Search.vue:19 src/components/instance/Stats.vue:48 +#: front/src/components/manage/library/RequestsTable.vue:50 +#: front/src/components/requests/Form.vue:9 +msgid "Albums" +msgstr "Álbuns" + +#: front/src/components/library/Artist.vue:44 +msgid "Albums by this artist" +msgstr "Álbuns deste artista" + +#: front/src/components/manage/library/RequestsTable.vue:26 +#: front/src/components/manage/users/InvitationsTable.vue:19 +msgid "All" +msgstr "Tudo" + +#: front/src/components/playlists/Editor.vue:13 +msgid "An error occured while saving your changes" +msgstr "Ocorreu um erro ao salvar suas mudanças" + +#: front/src/components/auth/Login.vue:10 +msgid "An unknown error happend, this can mean the server is down or cannot be reached" +msgstr "" +"Um erro desconhecido aconteceu, isso pode significar que o servidor está " +"inoperante ou não pode ser alcançado" + +#: front/src/components/federation/LibraryTrackTable.vue:11 +#: front/src/components/library/import/BatchDetail.vue:68 +#: front/src/components/library/import/BatchList.vue:13 +#: front/src/components/library/import/BatchList.vue:22 +msgid "Any" +msgstr "Qualquer" + +#: front/src/components/library/import/BatchList.vue:24 +msgid "API" +msgstr "API" + +#: front/src/components/federation/LibraryFollowTable.vue:68 +#: front/src/components/federation/LibraryFollowTable.vue:78 +msgid "Approve" +msgstr "Aprovar" + +#: front/src/components/federation/LibraryFollowTable.vue:70 +msgid "Approve access?" +msgstr "Aprovar acesso?" + +#: front/src/components/federation/LibraryFollowTable.vue:38 +msgid "Approved" +msgstr "Aprovado" + +#: front/src/components/auth/Logout.vue:5 +msgid "Are you sure you want to log out?" +msgstr "Tem certeza que deseja sair?" + +#: front/src/components/audio/SearchBar.vue:25 src/components/audio/track/Table.vue:7 +#: front/src/components/federation/LibraryTrackTable.vue:48 +#: front/src/components/library/Artist.vue:119 +#: front/src/components/manage/library/FilesTable.vue:38 +#: front/src/components/manage/library/RequestsTable.vue:49 +#: front/src/components/metadata/Search.vue:130 +msgid "Artist" +msgstr "Artista" + +#: front/src/components/requests/Form.vue:5 +msgid "Artist name" +msgstr "Nome do artista" + +#: front/src/components/library/Album.vue:22 src/components/library/Track.vue:23 +msgid "Artist page" +msgstr "Página do artista" + +#: front/src/components/audio/Search.vue:65 +msgid "Artist, album, track..." +msgstr "Artista, álbum, música ..." + +#: front/src/components/audio/Search.vue:10 src/components/instance/Stats.vue:42 +#: front/src/components/library/Artists.vue:119 src/components/library/Library.vue:7 +msgid "Artists" +msgstr "Artistas" + +#: front/src/components/favorites/List.vue:33 +#: front/src/components/federation/LibraryTrackTable.vue:28 +#: front/src/components/library/Artists.vue:25 src/components/library/Radios.vue:44 +#: front/src/components/manage/library/FilesTable.vue:19 +#: front/src/components/manage/library/RequestsTable.vue:19 +#: front/src/components/manage/users/UsersTable.vue:19 +#: front/src/views/federation/LibraryList.vue:28 src/views/playlists/List.vue:27 +msgid "Ascending" +msgstr "" + +#: front/src/views/auth/PasswordReset.vue:27 +msgid "Ask for a password reset" +msgstr "Peça uma redefinição de senha" + +#: front/src/views/federation/LibraryDetail.vue:56 +msgid "Auto importing" +msgstr "Importação automática" + +#: front/src/components/playlists/PlaylistModal.vue:26 +msgid "Available playlists" +msgstr "Playlists disponíveis" + +#: front/src/components/auth/Settings.vue:34 +msgid "Avatar" +msgstr "Avatar" + +#: front/src/views/auth/EmailConfirm.vue:17 src/views/auth/PasswordReset.vue:24 +#: front/src/views/auth/PasswordResetConfirm.vue:18 +msgid "Back to login" +msgstr "Volte ao login" + +#: front/src/views/federation/LibraryFollowersList.vue:5 +msgid "Be careful when accepting follow requests, as it means the follower will have access to your entire library." +msgstr "" +"Tenha cuidado ao aceitar as solicitações a seguir, pois isso significa que o " +"seguidor terá acesso a toda a sua biblioteca." + +#: front/src/components/library/Track.vue:80 +#: front/src/components/manage/library/FilesTable.vue:42 +msgid "Bitrate" +msgstr "" + +#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4 +msgid "Browse" +msgstr "Procurar" + +#: front/src/components/Sidebar.vue:50 +msgid "Browse library" +msgstr "Navegar pela biblioteca" + +#: front/src/components/library/Artists.vue:4 +msgid "Browsing artists" +msgstr "Procurando artistas" + +#: front/src/views/federation/LibraryTrackList.vue:3 +msgid "Browsing federated tracks" +msgstr "Procurando músicas federadas" + +#: front/src/views/federation/LibraryFollowersList.vue:3 +msgid "Browsing followers" +msgstr "Navegando seguidores" + +#: front/src/views/federation/LibraryList.vue:3 +msgid "Browsing libraries" +msgstr "Navegue por bibliotecas" + +#: front/src/views/playlists/List.vue:3 +msgid "Browsing playlists" +msgstr "Procure playlists" + +#: front/src/components/library/Radios.vue:4 +msgid "Browsing radios" +msgstr "Procure radios" + +#: front/src/components/library/radios/Builder.vue:5 +msgid "Builder" +msgstr "Construtor" + +#: front/src/components/audio/album/Card.vue:13 +msgid "By %{ artist }" +msgstr "Por %{ artist }" + +#: front/src/components/federation/LibraryFollowTable.vue:57 +msgid "By confirming, %{ username } will be denied access to your library." +msgstr "Ao confirmar, %{ username } não terá acesso à sua biblioteca." + +#: front/src/components/federation/LibraryFollowTable.vue:73 +msgid "By confirming, %{ username } will be granted access to your library." +msgstr "Ao confirmar, %{ username } terá acesso à sua biblioteca." + +#: front/src/components/audio/track/Table.vue:43 +#: front/src/components/common/DangerousButton.vue:17 +#: front/src/components/library/radios/Filter.vue:53 +#: front/src/components/playlists/PlaylistModal.vue:63 +msgid "Cancel" +msgstr "Cancelar" + +#: front/src/components/library/radios/Builder.vue:49 +msgid "Candidates" +msgstr "Candidatos" + +#: front/src/components/auth/Settings.vue:76 +msgid "Cannot change your password" +msgstr "Não é possível alterar sua senha" + +#: front/src/App.vue:66 +msgid "Change language" +msgstr "Mudar idioma" + +#: front/src/components/auth/Settings.vue:67 +msgid "Change my password" +msgstr "Mudar minha senha" + +#: front/src/components/auth/Settings.vue:95 +msgid "Change password" +msgstr "Mudar senha" + +#: front/src/views/auth/PasswordResetConfirm.vue:4 +#: front/src/views/auth/PasswordResetConfirm.vue:62 +msgid "Change your password" +msgstr "Mude sua senha" + +#: front/src/components/auth/Settings.vue:96 +msgid "Change your password?" +msgstr "Mude sua senha?" + +#: front/src/components/playlists/Editor.vue:21 +msgid "Changes synced with server" +msgstr "Modificações sincronizadas com o servidor" + +#: front/src/components/auth/Settings.vue:70 +msgid "Changing your password will also change your Subsonic API password if you have requested one." +msgstr "" +"Mudar sua senha também muda sua senha da API Subsonic se você tiver " +"solicitado uma." + +#: front/src/components/auth/Settings.vue:98 +msgid "Changing your password will have the following consequences" +msgstr "Alterar sua senha terá as seguintes consequências" + +#: front/src/App.vue:4 +msgid "Choose your instance" +msgstr "Escolha sua instância" + +#: front/src/components/Home.vue:64 +msgid "Clean library" +msgstr "Biblioteca limpa" + +#: front/src/components/manage/users/InvitationForm.vue:37 +msgid "Clear" +msgstr "Claro" + +#: front/src/components/playlists/Editor.vue:40 +#: front/src/components/playlists/Editor.vue:45 +msgid "Clear playlist" +msgstr "Limpar playlist" + +#: front/src/components/audio/Player.vue:270 +msgid "Clear your queue" +msgstr "Limpar sua fila" + +#: front/src/components/library/import/BatchList.vue:23 +msgid "CLI" +msgstr "CLI" + +#: front/src/components/Home.vue:44 +msgid "Click once, listen for hours using built-in radios" +msgstr "Clique uma vez, ouça por horas usando rádios" + +#: front/src/components/manage/library/RequestsTable.vue:30 +#: front/src/components/manage/library/RequestsTable.vue:64 +msgid "Closed" +msgstr "Fechado" + +#: front/src/components/manage/users/InvitationForm.vue:26 +#: front/src/components/manage/users/InvitationsTable.vue:42 +msgid "Code" +msgstr "Código" + +#: front/src/components/audio/album/Card.vue:43 +#: front/src/components/audio/artist/Card.vue:33 +#: front/src/components/discussion/Comment.vue:20 +msgid "Collapse" +msgstr "Colapso" + +#: front/src/components/manage/library/RequestsTable.vue:51 +#: front/src/components/requests/Form.vue:14 +msgid "Comment" +msgstr "Comentário" + +#: front/src/components/library/radios/Builder.vue:48 +msgid "Config" +msgstr "Configuração" + +#: front/src/components/common/DangerousButton.vue:21 +msgid "Confirm" +msgstr "Confirme" + +#: front/src/views/auth/EmailConfirm.vue:4 src/views/auth/EmailConfirm.vue:20 +#: front/src/views/auth/EmailConfirm.vue:51 +msgid "Confirm your email" +msgstr "Confirme seu email" + +#: front/src/views/auth/EmailConfirm.vue:13 +msgid "Confirmation code" +msgstr "Código de confirmação" + +#: front/src/components/playlists/Editor.vue:163 +msgid "Copy tracks from current queue to playlist" +msgstr "Copiar músicas da fila atual para a playlist" + +#: front/src/components/Home.vue:88 +msgid "Covers, lyrics, our goal is to have them all ;)" +msgstr "Capas, letras, nosso objetivo é tê-los todos ;)" + +#: front/src/components/auth/Signup.vue:4 +msgid "Create a funkwhale account" +msgstr "Crie uma conta funkwhale" + +#: front/src/components/playlists/Form.vue:2 +msgid "Create a new playlist" +msgstr "Crie uma nova playlist" + +#: front/src/components/auth/Login.vue:17 +msgid "Create an account" +msgstr "Crie a sua conta" + +#: front/src/components/manage/library/RequestsTable.vue:88 +#: front/src/components/requests/Card.vue:25 +msgid "Create import" +msgstr "Criar importação" + +#: front/src/components/auth/Signup.vue:51 +msgid "Create my account" +msgstr "Criar a minha conta" + +#: front/src/components/playlists/Form.vue:34 +msgid "Create playlist" +msgstr "Crie uma playlist" + +#: front/src/components/library/Radios.vue:23 +msgid "Create your own radio" +msgstr "Crie seu próprio rádio" + +#: front/src/components/federation/LibraryFollowTable.vue:22 +#: front/src/components/manage/library/RequestsTable.vue:52 +#: front/src/components/manage/users/InvitationsTable.vue:40 +msgid "Creation date" +msgstr "Data de criação" + +#: front/src/components/auth/Settings.vue:54 +msgid "Current avatar" +msgstr "Avatar atual" + +#: front/src/components/playlists/PlaylistModal.vue:8 +msgid "Current track" +msgstr "Música atual" + +#: front/src/components/manage/library/FilesTable.vue:189 +#: front/src/components/manage/library/RequestsTable.vue:195 +#: front/src/components/manage/users/InvitationsTable.vue:166 +#: front/src/views/playlists/Detail.vue:33 +msgid "Delete" +msgstr "Suprimir" + +#: front/src/views/playlists/Detail.vue:38 +msgid "Delete playlist" +msgstr "Suprimir Playlist" + +#: front/src/views/radios/Detail.vue:28 +msgid "Delete radio" +msgstr "Suprimir radio" + +#: front/src/components/federation/LibraryFollowTable.vue:52 +#: front/src/components/federation/LibraryFollowTable.vue:63 +msgid "Deny" +msgstr "Negar" + +#: front/src/components/federation/LibraryFollowTable.vue:54 +msgid "Deny access?" +msgstr "Negar acesso?" + +#: front/src/components/favorites/List.vue:34 +#: front/src/components/federation/LibraryTrackTable.vue:29 +#: front/src/components/library/Artists.vue:26 src/components/library/Radios.vue:47 +#: front/src/components/manage/library/FilesTable.vue:20 +#: front/src/components/manage/library/RequestsTable.vue:20 +#: front/src/components/manage/users/UsersTable.vue:20 +#: front/src/views/federation/LibraryList.vue:29 src/views/playlists/List.vue:28 +msgid "Descending" +msgstr "Descendente" + +#: front/src/components/federation/LibraryCard.vue:50 +msgid "Detail" +msgstr "Detalhe" + +#: front/src/views/admin/users/UsersDetail.vue:146 +msgid "Determine if the user account is active or not. Inactive users cannot login or use the service." +msgstr "" +"Determine se a conta do usuário está ativa ou não. Usuários inativos não " +"podem fazer autenticação ou usar o serviço." + +#: front/src/components/auth/Settings.vue:104 +#: front/src/components/auth/SubsonicTokenForm.vue:52 +msgid "Disable access" +msgstr "Desativar acesso" + +#: front/src/components/auth/SubsonicTokenForm.vue:49 +msgid "Disable Subsonic access" +msgstr "Desativar o acesso a Subsonic" + +#: front/src/components/auth/SubsonicTokenForm.vue:50 +msgid "Disable Subsonic API access?" +msgstr "Desativar o acesso o API Subsonic?" + +#: front/src/components/auth/SubsonicTokenForm.vue:14 +msgid "Discover how to use Funkwhale from other apps" +msgstr "Descubra como usar o Funkwhale em outros aplicativos" + +#: front/src/components/library/radios/Builder.vue:16 +msgid "Display publicly" +msgstr "Exibir publicamente" + +#: front/src/components/playlists/Editor.vue:42 +msgid "Do you want to clear the playlist \"%{ playlist }\"?" +msgstr "Você quer limpar a playlist \"%{ playlist }\"?" + +#: front/src/components/common/DangerousButton.vue:7 +msgid "Do you want to confirm this action?" +msgstr "Você quer confirmar esta ação?" + +#: front/src/views/playlists/Detail.vue:35 +msgid "Do you want to delete the playlist \"%{ playlist }\"?" +msgstr "Você deseja excluir a playlist \"%{ playlist }\"?" + +#: front/src/views/radios/Detail.vue:26 +msgid "Do you want to delete the radio \"{{ radio }}\"?" +msgstr "Você deseja excluir a radio \"{{ radio }}\"?" + +#: front/src/components/common/ActionTable.vue:29 +msgid "Do you want to launch %{ action } on %{ count } element?" +msgid_plural "Do you want to launch %{ action } on %{ count } elements?" +msgstr[0] "Deseja lançar %{ action } no %{ count } elemento?" +msgstr[1] "Deseja lançar %{ action } nos %{ count } elementos?" + +#: front/src/components/Sidebar.vue:113 +msgid "Do you want to restore your previous queue?" +msgstr "Você quer restaurar sua fila anterior?" + +#: front/src/App.vue:38 +msgid "Documentation" +msgstr "Documentação" + +#: front/src/components/audio/track/Table.vue:24 src/components/library/Track.vue:48 +msgid "Download" +msgstr "Descarregar" + +#: front/src/components/audio/track/Table.vue:27 +msgid "Download tracks" +msgstr "Descarregar músicas" + +#: front/src/components/playlists/Editor.vue:49 +msgid "Drag and drop rows to reorder tracks in the playlist" +msgstr "Arraste e solte as linhas para reordenar as músicas da playlist" + +#: front/src/components/library/Track.vue:58 +#: front/src/components/manage/library/FilesTable.vue:43 +msgid "Duration" +msgstr "Duração" + +#: front/src/components/Home.vue:96 +msgid "Easy to use" +msgstr "Fácil de usar" + +#: front/src/components/About.vue:21 +msgid "Edit instance info" +msgstr "Editar informações da instância" + +#: front/src/components/radios/Card.vue:20 src/views/playlists/Detail.vue:30 +msgid "Edit..." +msgstr "Editar..." + +#: front/src/components/auth/Signup.vue:29 +#: front/src/components/manage/users/UsersTable.vue:38 +msgid "Email" +msgstr "Email" + +#: front/src/views/admin/users/UsersDetail.vue:29 +msgid "Email address" +msgstr "Endereço de e-mail" + +#: front/src/views/auth/EmailConfirm.vue:23 +msgid "Email confirmed" +msgstr "E-mail confirmado" + +#: front/src/views/playlists/Detail.vue:29 +msgid "End edition" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:4 +msgid "Ensure your music files are properly tagged before uploading them." +msgstr "" +"Certifique-se de que seus arquivos de música estejam marcados corretamente " +"antes de carregá-los." + +#: front/src/components/library/Radios.vue:140 +msgid "Enter a radio name..." +msgstr "Indicar um nome de rádio ..." + +#: front/src/components/library/Artists.vue:118 +msgid "Enter an artist name..." +msgstr "Indicar um nome de artista ..." + +#: front/src/views/federation/LibraryList.vue:122 +msgid "Enter an library domain name..." +msgstr "Indicar um nome de domínio de biblioteca ..." + +#: front/src/views/playlists/List.vue:104 +msgid "Enter an playlist name..." +msgstr "Indicar um nome de playlist..." + +#: front/src/components/auth/Signup.vue:98 +msgid "Enter your email" +msgstr "Insira seu email" + +#: front/src/components/auth/Signup.vue:96 +msgid "Enter your invitation code (case insensitive)" +msgstr "Indicar seu código de convite (não diferencia maiúsculas de minúsculas)" + +#: front/src/components/metadata/Search.vue:114 +msgid "Enter your search query..." +msgstr "Insira sua consulta de pesquisa ..." + +#: front/src/components/auth/Signup.vue:97 +msgid "Enter your username" +msgstr "Indicar seu nome de usuário" + +#: front/src/components/auth/Login.vue:77 +msgid "Enter your username or email" +msgstr "Indicar seu nome de usuário ou email" + +#: front/src/components/auth/SubsonicTokenForm.vue:20 +msgid "Error" +msgstr "Erro" + +#: front/src/views/admin/Settings.vue:87 +msgid "Error reporting" +msgstr "Relatório de erros" + +#: front/src/components/common/ActionTable.vue:75 +msgid "Error while applying action" +msgstr "Erro ao aplicar a ação" + +#: front/src/views/auth/PasswordReset.vue:7 +msgid "Error while asking for a password reset" +msgstr "Erro ao solicitar uma redefinição de senha" + +#: front/src/views/auth/PasswordResetConfirm.vue:7 +msgid "Error while changing your password" +msgstr "Erro ao alterar sua senha" + +#: front/src/views/auth/EmailConfirm.vue:7 +msgid "Error while confirming your email" +msgstr "Erro ao confirmar seu email" + +#: front/src/components/manage/users/InvitationForm.vue:4 +msgid "Error while creating invitation" +msgstr "Erro ao criar convite" + +#: front/src/components/admin/SettingsGroup.vue:5 +msgid "Error while saving settings" +msgstr "Erro ao salvar configurações" + +#: front/src/components/federation/LibraryForm.vue:10 +msgid "Error while scanning library" +msgstr "Erro ao verificar biblioteca" + +#: front/src/components/library/import/BatchDetail.vue:41 +#: front/src/components/library/import/BatchDetail.vue:70 +#: front/src/components/library/import/BatchList.vue:15 +msgid "Errored" +msgstr "Errado" + +#: front/src/components/playlists/Form.vue:89 +msgid "Everyone" +msgstr "Todo o mundo" + +#: front/src/components/playlists/Form.vue:85 +msgid "Everyone on this instance" +msgstr "Todos nessa instância" + +#: front/src/components/library/radios/Builder.vue:47 +msgid "Exclude" +msgstr "Excluir" + +#: front/src/components/discussion/Comment.vue:14 +msgid "Expand" +msgstr "Expandir" + +#: front/src/components/manage/users/InvitationsTable.vue:41 +msgid "Expiration date" +msgstr "Data de vencimento" + +#: front/src/components/manage/users/InvitationsTable.vue:50 +msgid "Expired" +msgstr "Expirado" + +#: front/src/components/manage/users/InvitationsTable.vue:21 +msgid "Expired/used" +msgstr "Expirado / usados" + +#: front/src/components/library/import/Main.vue:65 +msgid "External source. Supported backends" +msgstr "" + +#: front/src/components/Sidebar.vue:51 +msgid "Favorites" +msgstr "Favoritas" + +#: front/src/components/federation/LibraryForm.vue:3 +msgid "Federate with a new instance" +msgstr "Federar com uma nova instância" + +#: front/src/views/federation/LibraryTrackList.vue:21 +msgid "Federated tracks" +msgstr "Músicas federadas" + +#: front/src/components/Sidebar.vue:87 src/components/library/import/BatchList.vue:25 +#: front/src/components/manage/users/UsersTable.vue:180 +#: front/src/views/admin/Settings.vue:84 src/views/admin/users/UsersDetail.vue:161 +#: front/src/views/federation/Base.vue:35 src/views/federation/LibraryDetail.vue:40 +msgid "Federation" +msgstr "Federação" + +#: front/src/views/federation/LibraryDetail.vue:3 +msgid "File mirroring" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:43 +msgid "File name" +msgstr "Nome do ficheiro" + +#: front/src/components/library/import/Main.vue:76 +msgid "File upload" +msgstr "Enviar ficheiros" + +#: front/src/views/admin/library/Base.vue:5 src/views/admin/library/FilesList.vue:21 +msgid "Files" +msgstr "Ficheiros" + +#: front/src/components/library/import/ArtistImport.vue:7 +msgid "Filter album types" +msgstr "Filtrar tipos de álbuns" + +#: front/src/components/library/radios/Builder.vue:46 +msgid "Filter name" +msgstr "Nome do filtro" + +#: front/src/components/library/import/Main.vue:52 +msgid "Finish import" +msgstr "Acabar a importação" + +#: front/src/components/library/import/BatchDetail.vue:54 +msgid "Finished" +msgstr "Acabado" + +#: front/src/components/library/import/Main.vue:59 +msgid "First, choose where you want to import the music from" +msgstr "Primeiro, escolha onde você quer importar a música de" + +#: front/src/components/federation/LibraryCard.vue:44 +msgid "Follow" +msgstr "Segue" + +#: front/src/components/federation/LibraryCard.vue:36 +msgid "Follow request pending approval" +msgstr "Aprovar a solicitação de seguir pendente" + +#: front/src/views/federation/LibraryDetail.vue:21 +msgid "Follow status" +msgstr "Siga o status" + +#: front/src/views/federation/Base.vue:13 +#: front/src/views/federation/LibraryFollowersList.vue:24 +msgid "Followers" +msgstr "Seguidores" + +#: front/src/components/federation/LibraryCard.vue:18 +msgid "Followers only" +msgstr "Só seguidores" + +#: front/src/components/federation/LibraryCard.vue:15 +#: front/src/views/federation/LibraryDetail.vue:29 +msgid "Following" +msgstr "Seguir" + +#: front/src/components/activity/Like.vue:12 src/components/activity/Listen.vue:12 +msgid "from %{ album } by %{ artist }" +msgstr "de %{ album } por %{ artist }" + +#: front/src/components/library/Track.vue:13 +msgid "From album %{ album } by %{ artist }" +msgstr "Do álbum %{ album } por %{ artist }" + +#: front/src/App.vue:56 +msgid "Funkwhale is a free and open-source project run by volunteers. You can help us improve the platform by reporting bugs, suggesting features and share the project with your friends!" +msgstr "" +"O Funkwhale é um projeto gratuito e de código aberto executado por " +"voluntários. Você pode nos ajudar a melhorar a plataforma reportando bugs, " +"sugerindo recursos e compartilhando o projeto com seus amigos!" + +#: front/src/components/auth/SubsonicTokenForm.vue:7 +msgid "Funkwhale is compatible with other music players that support the Subsonic API." +msgstr "" +"O Funkwhale é compatível com outros players de música que suportam a API " +"Subsonic." + +#: front/src/components/Home.vue:98 +msgid "Funkwhale is dead simple to use." +msgstr "Funkwhale é muito simples de usar." + +#: front/src/components/Home.vue:39 +msgid "Funkwhale is designed to make it easy to listen to music you like, or to discover new artists." +msgstr "" +"O Funkwhale foi projetado para facilitar a escuta da música que você gosta " +"ou descobrir novos artistas." + +#: front/src/components/Home.vue:119 +msgid "Funkwhale is free and gives you control on your music." +msgstr "O Funkwhale é gratuito e permite controlar sua música." + +#: front/src/components/Home.vue:66 +msgid "Funkwhale takes care of handling your music" +msgstr "Funkwhale cuida da sua música" + +#: front/src/components/manage/users/InvitationForm.vue:16 +msgid "Get a new invitation" +msgstr "Receba um novo convite" + +#: front/src/components/Home.vue:13 +msgid "Get me to the library" +msgstr "Me leve para a biblioteca" + +#: front/src/components/Home.vue:77 +msgid "" +"Get quality metadata about your music thanks to\n" +" \n" +" MusicBrainz\n" +" " +msgstr "" +"Obtenha metadados de qualidade sobre sua música\n" +" \n" +" MusicBrainz\n" +" " + +#: front/src/components/common/ActionTable.vue:21 +#: front/src/components/common/ActionTable.vue:27 +msgid "Go" +msgstr "Vá" + +#: front/src/components/PageNotFound.vue:14 +msgid "Go to home page" +msgstr "Vá para a página inicial" + +#: front/src/components/library/import/Main.vue:13 +msgid "Grab corresponding metadata" +msgstr "Pegue os metadados correspondentes" + +#: front/src/components/library/Home.vue:65 +msgid "Home" +msgstr "Casa" + +#: front/src/components/instance/Stats.vue:36 +msgid "Hours of music" +msgstr "Horas de música" + +#: front/src/components/auth/SubsonicTokenForm.vue:11 +msgid "However, accessing Funkwhale from those clients require a separate password you can set below." +msgstr "" +"No entanto, acessar o Funkwhale desses clientes requer uma senha separada " +"que você pode definir abaixo." + +#: front/src/components/library/import/BatchList.vue:34 +msgid "ID" +msgstr "ID" + +#: front/src/views/auth/PasswordResetConfirm.vue:24 +msgid "If the email address provided in the previous step is valid and binded to a user account, you should receive an email with reset instructions in the next couple of minutes." +msgstr "" +"Se o endereço de e-mail fornecido na etapa anterior for válido e vinculado a " +"uma conta de usuário, você deverá receber um e-mail com instruções de " +"redefinição nos próximos minutos." + +#: front/src/components/federation/LibraryTrackTable.vue:196 +#: front/src/components/library/Library.vue:17 +msgid "Import" +msgstr "Importação" + +#: front/src/components/federation/LibraryTrackTable.vue:57 +msgid "Import #%{ id } launched" +msgstr "Importação#%{ id } lançado" + +#: front/src/components/library/import/Main.vue:38 +msgid "Import %{ count } track" +msgid_plural "Import %{ count } tracks" +msgstr[0] "Importar %{ count } música" +msgstr[1] "Importar %{ count } músicas" + +#: front/src/components/library/import/BatchDetail.vue:10 +msgid "Import batch" +msgstr "Importa lote" + +#: front/src/components/library/import/BatchDetail.vue:185 +msgid "Import Batch #%{ id }" +msgstr "Importa lote #%{ id }" + +#: front/src/components/library/Library.vue:20 +msgid "Import batches" +msgstr "Importação de lotes" + +#: front/src/components/library/import/BatchList.vue:117 +msgid "Import Batches" +msgstr "Importação de lotes" + +#: front/src/components/manage/library/FilesTable.vue:40 +#: front/src/components/manage/library/RequestsTable.vue:53 +msgid "Import date" +msgstr "Data de importação" + +#: front/src/components/library/import/FileUpload.vue:38 +msgid "Import detail page" +msgstr "" + +#: front/src/components/Sidebar.vue:81 +msgid "Import music" +msgstr "Importar música" + +#: front/src/components/library/import/Main.vue:267 +msgid "Import Music" +msgstr "Importar Música" + +#: front/src/components/Home.vue:71 +msgid "Import music from various platforms, such as YouTube or SoundCloud" +msgstr "Importe músicas de várias plataformas, como o YouTube ou o SoundCloud" + +#: front/src/components/federation/LibraryTrackTable.vue:14 +#: front/src/components/federation/LibraryTrackTable.vue:66 +msgid "Import pending" +msgstr "Importação pendente" + +#: front/src/views/admin/library/Base.vue:9 +#: front/src/views/admin/library/RequestsList.vue:3 +#: front/src/views/admin/library/RequestsList.vue:21 +msgid "Import requests" +msgstr "Solicitações de importação" + +#: front/src/components/library/import/BatchList.vue:20 +#: front/src/components/library/import/Main.vue:6 +msgid "Import source" +msgstr "Origem de importação" + +#: front/src/components/federation/LibraryTrackTable.vue:9 +msgid "Import status" +msgstr "Status de Importação" + +#: front/src/components/library/import/ReleaseImport.vue:14 +msgid "Import this release" +msgstr "Importar esta publicação" + +#: front/src/components/library/import/TrackImport.vue:11 +msgid "Import this track" +msgstr "Importar esta música" + +#: front/src/components/federation/LibraryTrackTable.vue:12 +#: front/src/components/manage/library/RequestsTable.vue:29 +#: front/src/components/manage/library/RequestsTable.vue:61 +msgid "Imported" +msgstr "Importado" + +#: front/src/components/library/import/TrackImport.vue:44 +msgid "Imported URL" +msgstr "URL importado" + +#: front/src/views/admin/Settings.vue:82 +msgid "Imports" +msgstr "Importações" + +#: front/src/components/favorites/TrackFavoriteIcon.vue:3 +msgid "In favorites" +msgstr "Nos favoritos" + +#: front/src/components/federation/LibraryTrackTable.vue:65 +msgid "In library" +msgstr "Na biblioteca" + +#: front/src/components/manage/users/UsersTable.vue:54 +msgid "Inactive" +msgstr "Inativo" + +#: front/src/components/library/import/Main.vue:96 +msgid "Input a MusicBrainz ID manually:" +msgstr "Insira um ID do MusicBrainz manualmente:" + +#: front/src/views/auth/PasswordReset.vue:53 +msgid "Input the email address binded to your account" +msgstr "Insira o endereço de e-mail vinculado à sua conta" + +#: front/src/components/playlists/Editor.vue:31 +msgid "Insert from queue (%{ count } track)" +msgid_plural "Insert from queue (%{ count } tracks)" +msgstr[0] "Inserir da fila (%{ count } música)" +msgstr[1] "Inserir da fila (%{ count } músicas)" + +#: front/src/views/admin/Settings.vue:80 +msgid "Instance information" +msgstr "Informação da instância" + +#: front/src/components/library/Radios.vue:9 +msgid "Instance radios" +msgstr "Rádios da instância" + +#: front/src/views/admin/Settings.vue:75 +msgid "Instance settings" +msgstr "Configurações da instância" + +#: front/src/views/instance/Timeline.vue:57 +msgid "Instance Timeline" +msgstr "Linha do tempo da instância" + +#: front/src/components/auth/Signup.vue:42 +#: front/src/components/manage/users/InvitationForm.vue:11 +msgid "Invitation code" +msgstr "Código de Convite" + +#: front/src/components/auth/Signup.vue:43 +msgid "Invitation code (optional)" +msgstr "Código de convite (opcional)" + +#: front/src/views/admin/users/Base.vue:8 src/views/admin/users/InvitationsList.vue:3 +#: front/src/views/admin/users/InvitationsList.vue:24 +msgid "Invitations" +msgstr "Convites" + +#: front/src/App.vue:43 +msgid "Issue tracker" +msgstr "Rastreador de problemas" + +#: front/src/components/library/import/BatchDetail.vue:80 +msgid "Job ID" +msgstr "" + +#: front/src/components/library/import/BatchList.vue:36 +msgid "Jobs" +msgstr "" + +#: front/src/components/Home.vue:50 +msgid "Keep a track of your favorite songs" +msgstr "" + +#: front/src/components/audio/track/Table.vue:33 +msgid "Keep your PRIVATE_TOKEN secret as it gives access to your account." +msgstr "Mantenha o seu PRIVATE_TOKEN segredo, pois dá acesso à sua conta." + +#: front/src/components/manage/users/UsersTable.vue:41 +#: front/src/views/admin/users/UsersDetail.vue:45 +msgid "Last activity" +msgstr "Ultima atividade" + +#: front/src/views/federation/LibraryDetail.vue:101 +msgid "Last fetched" +msgstr "Última recuperação" + +#: front/src/components/playlists/PlaylistModal.vue:32 +msgid "Last modification" +msgstr "Última modificação" + +#: front/src/components/common/ActionTable.vue:39 +msgid "Launch" +msgstr "Lançamento" + +#: front/src/components/library/import/BatchDetail.vue:18 +#: front/src/components/library/import/BatchList.vue:35 +msgid "Launch date" +msgstr "Data de lançamento" + +#: front/src/components/federation/LibraryForm.vue:31 +msgid "Launch scan" +msgstr "" + +#: front/src/components/Home.vue:10 +msgid "Learn more about this instance" +msgstr "Saiba mais sobre esta instância" + +#: front/src/components/manage/users/InvitationForm.vue:58 +msgid "Leave empty for a random code" +msgstr "Deixar vazio para um código aleatório" + +#: front/src/components/requests/Form.vue:10 +msgid "Leave this field empty if you're requesting the whole discography." +msgstr "Deixe essa área vazia se você estiver solicitando toda a discografia." + +#: front/src/views/federation/Base.vue:5 src/views/federation/LibraryList.vue:123 +msgid "Libraries" +msgstr "Bibliotecas" + +#: front/src/components/Sidebar.vue:70 +#: front/src/components/federation/LibraryTrackTable.vue:51 +#: front/src/components/instance/Stats.vue:30 +#: front/src/components/manage/users/UsersTable.vue:176 +#: front/src/views/admin/users/UsersDetail.vue:157 +#: front/src/views/federation/LibraryDetail.vue:194 +msgid "Library" +msgstr "Biblioteca" + +#: front/src/views/admin/library/FilesList.vue:3 +msgid "Library files" +msgstr "Ficheiros da biblioteca" + +#: front/src/components/federation/LibraryForm.vue:20 +msgid "Library name" +msgstr "Nome da biblioteca" + +#: front/src/views/federation/LibraryDetail.vue:84 +msgid "Library size" +msgstr "Tamanho da biblioteca" + +#: front/src/components/federation/LibraryForm.vue:96 +msgid "library@demo.funkwhale.audio" +msgstr "library@demo.funkwhale.audio" + +#: front/src/App.vue:29 +msgid "Links" +msgstr "Ligações" + +#: front/src/views/instance/Timeline.vue:4 +msgid "Loading timeline..." +msgstr "Carregando a linha do tempo ..." + +#: front/src/components/favorites/List.vue:5 +msgid "Loading your favorites..." +msgstr "Carregando seus favoritos ..." + +#: front/src/components/auth/Login.vue:78 +msgid "Log In" +msgstr "Autenticação" + +#: front/src/components/auth/Login.vue:4 +msgid "Log in to your Funkwhale account" +msgstr "Logar na sua conta Funkwhale" + +#: front/src/components/auth/Logout.vue:20 +msgid "Log Out" +msgstr "Sair" + +#: front/src/components/Sidebar.vue:38 +msgid "Logged in as %{ username }" +msgstr "Conectado como %{ username }" + +#: front/src/components/Sidebar.vue:44 src/components/auth/Login.vue:41 +msgid "Login" +msgstr "Entrar" + +#: front/src/components/Sidebar.vue:43 +msgid "Logout" +msgstr "Sair" + +#: front/src/components/audio/Player.vue:266 +msgid "Looping disabled. Click to switch to single-track looping." +msgstr "Looping desativado. Clique para alternar para um loop de musica única." + +#: front/src/components/audio/Player.vue:267 +msgid "Looping on a single track. Click to switch to whole queue looping." +msgstr "" +"Looping em uma única música. Clique para alternar para todo o loop da fila." + +#: front/src/components/audio/Player.vue:268 +msgid "Looping on whole queue. Click to disable looping." +msgstr "Looping na fila inteira. Clique para desativar o loop." + +#: front/src/components/library/Track.vue:94 +msgid "Lyrics" +msgstr "Letras" + +#: front/src/views/admin/library/Base.vue:25 +msgid "Manage library" +msgstr "Gerenciar biblioteca" + +#: front/src/components/playlists/PlaylistModal.vue:3 +msgid "Manage playlists" +msgstr "Gerenciar playlists" + +#: front/src/views/admin/users/Base.vue:20 +msgid "Manage users" +msgstr "Gerenciar usuários" + +#: front/src/views/playlists/List.vue:8 +msgid "Manage your playlists" +msgstr "Gerenciar suas playlists" + +#: front/src/components/manage/library/RequestsTable.vue:197 +msgid "Mark as closed" +msgstr "Marcar como fechado" + +#: front/src/components/manage/library/RequestsTable.vue:196 +msgid "Mark as imported" +msgstr "Marcar como importado" + +#: front/src/components/library/import/Main.vue:12 +msgid "Metadata" +msgstr "Metadados" + +#: front/src/components/library/import/Main.vue:115 +msgid "" +"Metadata is the data related to the music you want to import. This includes all the information about the artists, albums and tracks. In order to have a high quality library, it is recommended to grab data from the\n" +" \n" +" MusicBrainz\n" +" \n" +" project, which you can think about as the Wikipedia of music." +msgstr "" +"Metadados são os dados relacionados à música que você deseja importar. Isso " +"inclui todas as informações sobre os artistas, álbuns e músicas. Para ter " +"uma biblioteca de alta qualidade, recomenda-se obter dados do\n" +" \n" +" MusicBrainz\n" +" \n" +" projeto, que você pode considerar como a Wikipedia da música." + +#: front/src/components/Sidebar.vue:48 src/components/library/import/Main.vue:18 +msgid "Music" +msgstr "Música" + +#: front/src/components/library/import/Main.vue:147 +msgid "Music request" +msgstr "Pedido de música" + +#: front/src/components/audio/Player.vue:265 +msgid "Mute" +msgstr "Mudo" + +#: front/src/components/Sidebar.vue:34 +msgid "My account" +msgstr "Minha conta" + +#: front/src/components/playlists/Form.vue:74 +msgid "My awesome playlist" +msgstr "Minha playlist incrível" + +#: front/src/components/library/radios/Builder.vue:206 +msgid "My awesome radio" +msgstr "Meu rádio incrível" + +#: front/src/components/library/Track.vue:64 src/components/library/Track.vue:75 +#: front/src/components/library/Track.vue:86 +#: front/src/components/manage/library/FilesTable.vue:63 +#: front/src/components/manage/library/FilesTable.vue:69 +#: front/src/components/manage/library/FilesTable.vue:75 +#: front/src/components/manage/library/FilesTable.vue:81 +#: front/src/components/manage/library/RequestsTable.vue:71 +#: front/src/components/manage/library/RequestsTable.vue:75 +#: front/src/components/manage/library/RequestsTable.vue:82 +#: front/src/components/manage/users/UsersTable.vue:61 +#: front/src/views/admin/users/UsersDetail.vue:49 +msgid "N/A" +msgstr "" + +#: front/src/components/playlists/PlaylistModal.vue:31 +#: front/src/views/admin/users/UsersDetail.vue:21 +msgid "Name" +msgstr "Nome" + +#: front/src/components/auth/Settings.vue:88 +#: front/src/views/auth/PasswordResetConfirm.vue:14 +msgid "New password" +msgstr "Nova senha" + +#: front/src/components/Sidebar.vue:158 +msgid "New tracks will be appended here automatically." +msgstr "Novas músicas serão adicionadas automaticamente aqui." + +#: front/src/components/library/import/Main.vue:29 +msgid "Next step" +msgstr "Próxima etapa" + +#: front/src/components/audio/Player.vue:263 +msgid "Next track" +msgstr "Música seguinte" + +#: front/src/components/Sidebar.vue:125 +msgid "No" +msgstr "Não" + +#: front/src/components/Home.vue:103 +msgid "No add-ons, no plugins : you only need a web library" +msgstr "Sem add-ons, sem plugins: você só precisa de uma biblioteca da Web" + +#: front/src/components/library/Track.vue:102 +msgid "No lyrics available for this track." +msgstr "Nenhuma letra disponível para esta música." + +#: front/src/components/playlists/Form.vue:81 +msgid "Nobody except me" +msgstr "Ninguém, exceto eu" + +#: front/src/views/federation/LibraryDetail.vue:32 +msgid "Not following" +msgstr "Não seguir" + +#: front/src/components/federation/LibraryTrackTable.vue:13 +#: front/src/components/federation/LibraryTrackTable.vue:67 +msgid "Not imported" +msgstr "Não importado" + +#: front/src/components/manage/users/InvitationsTable.vue:51 +msgid "Not used" +msgstr "Não usado" + +#: front/src/App.vue:37 +msgid "Official website" +msgstr "Website oficial" + +#: front/src/components/auth/Settings.vue:83 +msgid "Old password" +msgstr "Senha Antiga" + +#: front/src/components/library/import/FileUpload.vue:36 +msgid "Once all your files are uploaded, simply click the following button to check the import status." +msgstr "" +"Depois que todos os seus ficheiros foram carregados, basta clicar no botão a " +"seguir para verificar o status de importação." + +#: front/src/components/federation/LibraryCard.vue:21 +#: front/src/components/manage/users/InvitationsTable.vue:20 +#, fuzzy +msgid "Open" +msgstr "Aberto" + +#: front/src/App.vue:63 +msgid "Options" +msgstr "Opções" + +#: front/src/components/library/import/Main.vue:93 +#, fuzzy +msgid "Or" +msgstr "Ou" + +#: front/src/components/favorites/List.vue:23 +#: front/src/components/federation/LibraryTrackTable.vue:18 +#: front/src/components/library/Artists.vue:15 src/components/library/Radios.vue:33 +#: front/src/components/manage/library/FilesTable.vue:9 +#: front/src/components/manage/library/RequestsTable.vue:9 +#: front/src/components/manage/users/InvitationsTable.vue:9 +#: front/src/components/manage/users/UsersTable.vue:9 +#: front/src/views/federation/LibraryList.vue:18 src/views/playlists/List.vue:17 +msgid "Ordering" +msgstr "Ordenar" + +#: front/src/components/favorites/List.vue:31 +#: front/src/components/federation/LibraryTrackTable.vue:26 +#: front/src/components/library/Artists.vue:23 src/components/library/Radios.vue:41 +#: front/src/components/manage/library/FilesTable.vue:17 +#: front/src/components/manage/library/RequestsTable.vue:17 +#: front/src/components/manage/users/UsersTable.vue:17 +#: front/src/views/federation/LibraryList.vue:26 src/views/playlists/List.vue:25 +msgid "Ordering direction" +msgstr "Direção de ordenar" + +#: front/src/components/manage/users/InvitationsTable.vue:38 +msgid "Owner" +msgstr "Proprietário" + +#: front/src/components/PageNotFound.vue:33 +msgid "Page Not Found" +msgstr "Página não encontrada" + +#: front/src/components/PageNotFound.vue:7 +msgid "Page not found!" +msgstr "Página não encontrada!" + +#: front/src/components/auth/Login.vue:32 src/components/auth/Signup.vue:38 +msgid "Password" +msgstr "Palavra-passe" + +#: front/src/components/auth/SubsonicTokenForm.vue:95 +msgid "Password updated" +msgstr "Senha atualizada" + +#: front/src/views/auth/PasswordResetConfirm.vue:28 +msgid "Password updated successfully" +msgstr "Senha atualizada com sucesso" + +#: front/src/components/audio/Player.vue:262 +msgid "Pause track" +msgstr "Parar música" + +#: front/src/components/federation/LibraryFollowTable.vue:46 +#: front/src/components/library/import/BatchDetail.vue:33 +#: front/src/components/library/import/BatchDetail.vue:69 +#: front/src/components/library/import/BatchList.vue:14 +#: front/src/components/library/import/FileUpload.vue:59 +#: front/src/components/manage/library/RequestsTable.vue:27 +#: front/src/components/manage/library/RequestsTable.vue:63 +msgid "Pending" +msgstr "Pendente" + +#: front/src/components/federation/LibraryFollowTable.vue:11 +#: front/src/views/federation/LibraryDetail.vue:26 +msgid "Pending approval" +msgstr "Aprovação pendente" + +#: front/src/components/Sidebar.vue:217 +msgid "Pending follow requests" +msgstr "" + +#: front/src/components/Sidebar.vue:216 src/views/admin/library/Base.vue:26 +msgid "Pending import requests" +msgstr "Pedidos de importação pendentes" + +#: front/src/components/requests/Form.vue:26 src/views/federation/Base.vue:36 +msgid "Pending requests" +msgstr "Solicitações pendentes" + +#: front/src/components/manage/users/UsersTable.vue:42 +#: front/src/views/admin/users/UsersDetail.vue:68 +msgid "Permissions" +msgstr "Permissões" + +#: front/src/components/audio/PlayButton.vue:9 src/components/library/Track.vue:30 +#, fuzzy +msgid "Play" +msgstr "Tocar" + +#: front/src/components/audio/album/Card.vue:50 +#: front/src/components/audio/artist/Card.vue:44 src/components/library/Album.vue:28 +#: front/src/views/playlists/Detail.vue:23 +msgid "Play all" +msgstr "Jogar tudo" + +#: front/src/components/library/Artist.vue:26 +msgid "Play all albums" +msgstr "Jogar todos os álbuns" + +#: front/src/components/audio/PlayButton.vue:58 +msgid "Play immediatly" +msgstr "Jogar imediatamente" + +#: front/src/components/audio/PlayButton.vue:15 +msgid "Play next" +msgstr "Jogar seguinte" + +#: front/src/components/audio/PlayButton.vue:16 +msgid "Play now" +msgstr "Jogue agora" + +#: front/src/components/audio/Player.vue:261 +msgid "Play track" +msgstr "Jogar mũsica" + +#: front/src/views/playlists/Detail.vue:90 +msgid "Playlist" +msgstr "Playlist" + +#: front/src/views/playlists/Detail.vue:12 +msgid "Playlist containing %{ count } track, by %{ username }" +msgid_plural "Playlist containing %{ count } tracks, by %{ username }" +msgstr[0] "Playlist contendo%{ count } música, por %{ username }" +msgstr[1] "Playlist contendo %{ count } músicas, por %{ username }" + +#: front/src/components/playlists/Form.vue:9 +msgid "Playlist created" +msgstr "Playlist criada" + +#: front/src/components/playlists/Editor.vue:4 +msgid "Playlist editor" +msgstr "Editor de playlist" + +#: front/src/components/playlists/Form.vue:21 +msgid "Playlist name" +msgstr "Nome da playlist" + +#: front/src/components/playlists/Form.vue:6 +msgid "Playlist updated" +msgstr "Playlist atualizada" + +#: front/src/components/playlists/Form.vue:25 +msgid "Playlist visibility" +msgstr "Visibilidade da playlist" + +#: front/src/components/Sidebar.vue:56 src/components/library/Home.vue:16 +#: front/src/components/library/Library.vue:13 src/views/admin/Settings.vue:83 +#: front/src/views/playlists/List.vue:103 +msgid "Playlists" +msgstr "Playlists" + +#: front/src/components/Home.vue:56 +msgid "Playlists? We got them" +msgstr "" + +#: front/src/components/auth/Settings.vue:79 +msgid "Please double-check your password is correct" +msgstr "Por favor, verifique novamente se sua senha está correta" + +#: front/src/components/auth/Login.vue:9 +msgid "Please double-check your username/password couple is correct" +msgstr "" + +#: front/src/components/auth/Settings.vue:46 +msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px." +msgstr "" + +#: front/src/components/library/import/Main.vue:26 +msgid "Previous step" +msgstr "" + +#: front/src/components/audio/Player.vue:260 +msgid "Previous track" +msgstr "" + +#: front/src/views/auth/EmailConfirm.vue:26 +#: front/src/views/auth/PasswordResetConfirm.vue:31 +msgid "Proceed to login" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:50 +msgid "Published date" +msgstr "" + +#: front/src/components/library/import/ArtistImport.vue:17 +msgid "Query template" +msgstr "" + +#: front/src/components/Sidebar.vue:20 +msgid "Queue" +msgstr "" + +#: front/src/components/audio/Player.vue:203 +msgid "Queue shuffled!" +msgstr "" + +#: front/src/views/radios/Detail.vue:80 +msgid "Radio" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:205 +msgid "Radio Builder" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:11 +msgid "Radio name" +msgstr "" + +#: front/src/components/library/Library.vue:10 src/components/library/Radios.vue:141 +msgid "Radios" +msgstr "" + +#: front/src/views/instance/Timeline.vue:7 +msgid "Recent activity on this instance" +msgstr "" + +#: front/src/components/library/Home.vue:24 +msgid "Recently added" +msgstr "" + +#: front/src/components/library/Home.vue:11 +msgid "Recently favorited" +msgstr "" + +#: front/src/components/library/Home.vue:6 +msgid "Recently listened" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:81 +msgid "Recording MusicBrainz ID" +msgstr "" + +#: front/src/views/admin/users/UsersDetail.vue:84 +#: front/src/views/federation/LibraryDetail.vue:122 +msgid "Refresh" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:42 +msgid "Refused" +msgstr "" + +#: front/src/components/auth/Profile.vue:12 +msgid "Registered since %{ date }" +msgstr "" + +#: front/src/components/auth/Signup.vue:9 +msgid "Registration are closed on this instance, you will need an invitation code to signup." +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:71 +msgid "regular user" +msgstr "" + +#: front/src/components/library/radios/Filter.vue:59 +msgid "Remove" +msgstr "" + +#: front/src/components/auth/Settings.vue:58 +msgid "Remove avatar" +msgstr "" + +#: front/src/components/favorites/TrackFavoriteIcon.vue:19 +msgid "Remove from favorites" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:34 +#: front/src/components/auth/SubsonicTokenForm.vue:37 +msgid "Request a new password" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:35 +msgid "Request a new Subsonic API password?" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:43 +msgid "Request a password" +msgstr "" + +#: front/src/App.vue:35 +msgid "Request music" +msgstr "" + +#: front/src/views/library/MusicRequest.vue:4 src/views/library/MusicRequest.vue:21 +msgid "Request some music" +msgstr "" + +#: front/src/components/requests/Form.vue:20 +msgid "Request submitted!" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:49 +msgid "Rerun errored jobs" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:187 +msgid "Rerun job" +msgstr "" + +#: front/src/components/auth/Login.vue:34 src/views/auth/PasswordReset.vue:4 +#: front/src/views/auth/PasswordReset.vue:52 +msgid "Reset your password" +msgstr "" + +#: front/src/components/library/import/TrackImport.vue:31 +msgid "Result %{ current }/%{ total }" +msgstr "" + +#: front/src/components/favorites/List.vue:38 src/components/library/Artists.vue:30 +#: front/src/components/library/Radios.vue:52 src/views/federation/LibraryList.vue:33 +#: front/src/views/playlists/List.vue:32 +msgid "Results per page" +msgstr "" + +#: front/src/components/admin/SettingsGroup.vue:63 +#: front/src/components/library/radios/Builder.vue:19 +msgid "Save" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:112 +msgid "Scan triggered!" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:5 +#: front/src/components/library/Artists.vue:10 src/components/library/Radios.vue:29 +#: front/src/components/library/import/BatchDetail.vue:62 +#: front/src/components/library/import/BatchList.vue:7 +#: front/src/components/manage/library/FilesTable.vue:5 +#: front/src/components/manage/library/RequestsTable.vue:5 +#: front/src/components/manage/users/InvitationsTable.vue:5 +#: front/src/components/manage/users/UsersTable.vue:5 +#: front/src/views/federation/LibraryList.vue:14 src/views/playlists/List.vue:13 +msgid "Search" +msgstr "" + +#: front/src/components/library/import/Main.vue:85 +msgid "Search an entity you want to import:" +msgstr "" + +#: front/src/components/manage/library/RequestsTable.vue:180 +msgid "Search by artist, username, comment..." +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:188 +msgid "Search by source..." +msgstr "" + +#: front/src/components/library/import/BatchList.vue:116 +msgid "Search by submitter, source..." +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:182 +#: front/src/components/manage/library/FilesTable.vue:175 +msgid "Search by title, artist, domain..." +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:140 +msgid "Search by username, domain..." +msgstr "" + +#: front/src/components/manage/users/InvitationsTable.vue:152 +msgid "Search by username, email, code..." +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:162 +msgid "Search by username, email, name..." +msgstr "" + +#: front/src/components/audio/SearchBar.vue:20 +msgid "Search for artists, albums, tracks..." +msgstr "" + +#: front/src/components/audio/Search.vue:2 +msgid "Search for some music" +msgstr "" + +#: front/src/components/library/Track.vue:105 +msgid "Search on lyrics.wikia.com" +msgstr "" + +#: front/src/components/library/Album.vue:33 src/components/library/Artist.vue:31 +#: front/src/components/library/Track.vue:40 +msgid "Search on Wikipedia" +msgstr "" + +#: front/src/components/library/import/TrackImport.vue:42 +msgid "Search query" +msgstr "" + +#: front/src/views/admin/Settings.vue:15 +msgid "Sections" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:31 +msgid "Select a filter" +msgstr "" + +#: front/src/components/common/ActionTable.vue:61 +msgid "Select all %{ total } elements" +msgid_plural "Select all %{ total } elements" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/library/import/FileUpload.vue:22 +msgid "Select files to upload..." +msgstr "" + +#: front/src/components/common/ActionTable.vue:69 +msgid "Select only current page" +msgstr "" + +#: front/src/components/library/import/Main.vue:19 +msgid "Select relevant sources or files for import" +msgstr "" + +#: front/src/components/federation/LibraryCard.vue:43 +msgid "Send a follow request" +msgstr "" + +#: front/src/components/Sidebar.vue:97 src/components/manage/users/UsersTable.vue:184 +#: front/src/views/admin/users/UsersDetail.vue:165 +msgid "Settings" +msgstr "" + +#: front/src/components/auth/Settings.vue:10 +msgid "Settings updated" +msgstr "" + +#: front/src/components/admin/SettingsGroup.vue:11 +msgid "Settings updated successfully." +msgstr "" + +#: front/src/components/auth/Profile.vue:24 +msgid "Settings..." +msgstr "" + +#: front/src/components/manage/users/InvitationForm.vue:27 +msgid "Share link" +msgstr "" + +#: front/src/components/audio/artist/Card.vue:30 +msgid "Show 1 more album" +msgid_plural "Show %{ count } more albums" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/audio/album/Card.vue:40 +msgid "Show 1 more track" +msgid_plural "Show %{ count } more tracks" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/forms/PasswordInput.vue:25 +msgid "Show/hide password" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:97 +#: front/src/components/federation/LibraryTrackTable.vue:98 +#: front/src/components/library/import/BatchDetail.vue:128 +#: front/src/components/library/import/BatchList.vue:73 +#: front/src/components/manage/library/FilesTable.vue:97 +#: front/src/components/manage/library/RequestsTable.vue:104 +#: front/src/components/manage/users/InvitationsTable.vue:76 +#: front/src/components/manage/users/UsersTable.vue:87 +msgid "Showing results %{ start }-%{ end } on %{ total }" +msgstr "" + +#: front/src/components/audio/Player.vue:269 +msgid "Shuffle your queue" +msgstr "" + +#: front/src/components/auth/Signup.vue:95 +msgid "Sign Up" +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:40 +#: front/src/views/admin/users/UsersDetail.vue:37 +msgid "Sign-up" +msgstr "" + +#: front/src/components/audio/track/Table.vue:31 +msgid "Simply copy paste the snippet below into a terminal to launch the download." +msgstr "" + +#: front/src/components/library/Track.vue:69 +#: front/src/components/library/import/FileUpload.vue:44 +#: front/src/components/manage/library/FilesTable.vue:44 +msgid "Size" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:37 +#: front/src/components/library/import/BatchDetail.vue:72 +msgid "Skipped" +msgstr "" + +#: front/src/components/requests/Form.vue:3 +msgid "Something's missing in the library? Let us know what you would like to listen!" +msgstr "" + +#: front/src/components/audio/Search.vue:25 +msgid "Sorry, we did not found any album matching your query" +msgstr "" + +#: front/src/components/audio/Search.vue:16 +msgid "Sorry, we did not found any artist matching your query" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:82 +#: front/src/components/library/import/BatchList.vue:38 +#: front/src/components/library/import/TrackImport.vue:17 +msgid "Source" +msgstr "" + +#: front/src/App.vue:41 +msgid "Source code" +msgstr "" + +#: front/src/App.vue:40 +msgid "Source code (%{version})" +msgstr "" + +#: front/src/components/auth/Profile.vue:20 +#: front/src/components/manage/users/UsersTable.vue:70 +msgid "Staff member" +msgstr "" + +#: front/src/components/radios/Button.vue:4 +msgid "Start" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:28 +msgid "Start Upload" +msgstr "" + +#: front/src/views/admin/Settings.vue:86 +msgid "Statistics" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:23 +#: front/src/components/federation/LibraryTrackTable.vue:46 +#: front/src/components/library/import/BatchDetail.vue:66 +#: front/src/components/library/import/BatchDetail.vue:83 +#: front/src/components/library/import/BatchList.vue:11 +#: front/src/components/library/import/BatchList.vue:37 +#: front/src/components/library/import/FileUpload.vue:45 +#: front/src/components/manage/library/RequestsTable.vue:24 +#: front/src/components/manage/library/RequestsTable.vue:48 +#: front/src/components/manage/users/InvitationsTable.vue:17 +#: front/src/components/manage/users/InvitationsTable.vue:39 +#: front/src/components/manage/users/UsersTable.vue:43 +msgid "Status" +msgstr "" + +#: front/src/components/radios/Button.vue:3 +msgid "Stop" +msgstr "" + +#: front/src/components/Sidebar.vue:159 +msgid "Stop radio" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:32 +msgid "Stop Upload" +msgstr "" + +#: front/src/App.vue:9 src/components/requests/Form.vue:17 +msgid "Submit" +msgstr "" + +#: front/src/components/requests/Form.vue:22 +msgid "Submit another request" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:26 +#: front/src/components/library/import/BatchList.vue:39 +msgid "Submitted by" +msgstr "" + +#: front/src/views/admin/Settings.vue:85 +msgid "Subsonic" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:2 +msgid "Subsonic API password" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:71 +#: front/src/components/library/import/BatchList.vue:16 +#: front/src/components/library/import/FileUpload.vue:56 +msgid "Success" +msgstr "" + +#: front/src/App.vue:11 +msgid "Suggested choices" +msgstr "" + +#: front/src/components/playlists/Editor.vue:9 +msgid "Syncing changes to server..." +msgstr "" + +#: front/src/components/Home.vue:26 +msgid "That's simple: we loved Grooveshark and we want to build something even better." +msgstr "" + +#: front/src/components/requests/Form.vue:73 +msgid "The Beatles, Mickael Jackson…" +msgstr "" + +#: front/src/App.vue:59 +msgid "The funkwhale logo was kindly designed and provided by Francis Gading." +msgstr "" + +#: front/src/components/Home.vue:124 +msgid "The plaform is free and open-source, you can install it and modify it without worries" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:4 +msgid "The Subsonic API is not available on this Funkwhale instance." +msgstr "" + +#: front/src/components/requests/Form.vue:74 +msgid "The White Album, Thriller…" +msgstr "" + +#: front/src/components/audio/track/Table.vue:30 +msgid "There is currently no way to download directly multiple tracks from funkwhale as a ZIP archive. However, you can use a command line tools such as cURL to easily download a list of tracks." +msgstr "" + +#: front/src/components/library/import/Main.vue:149 +msgid "This import will be associated with the music request below. After the import is finished, the request will be marked as fulfilled." +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:195 +msgid "This indicate if the remote library granted you access" +msgstr "" + +#: front/src/components/auth/Profile.vue:16 +msgid "This is you!" +msgstr "" + +#: front/src/components/common/ActionTable.vue:37 +msgid "This may affect a lot of elements, please double check this is really what you want." +msgstr "" + +#: front/src/components/audio/PlayButton.vue:61 +msgid "This track is not imported and cannot be played" +msgstr "" + +#: front/src/views/playlists/Detail.vue:37 +msgid "This will completely delete this playlist and cannot be undone." +msgstr "" + +#: front/src/views/radios/Detail.vue:27 +msgid "This will completely delete this radio and cannot be undone." +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:51 +msgid "This will completely disable access to the Subsonic API using from account." +msgstr "" + +#: front/src/App.vue:133 +msgid "This will erase your local data and disconnect you, do you want to continue?" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:36 +msgid "This will log you out from existing devices that use the current password." +msgstr "" + +#: front/src/components/playlists/Editor.vue:44 +msgid "This will remove all tracks from this playlist and cannot be undone." +msgstr "" + +#: front/src/components/audio/track/Table.vue:6 +#: front/src/components/federation/LibraryTrackTable.vue:47 +#: front/src/components/manage/library/FilesTable.vue:37 +msgid "Title" +msgstr "" + +#: front/src/components/audio/SearchBar.vue:27 src/components/library/Track.vue:174 +#: front/src/components/library/import/BatchDetail.vue:84 +#: front/src/components/metadata/Search.vue:138 +msgid "Track" +msgstr "" + +#: front/src/components/library/Track.vue:53 +msgid "Track information" +msgstr "" + +#: front/src/components/library/radios/Filter.vue:44 +msgid "Track matching filter" +msgstr "" + +#: front/src/components/instance/Stats.vue:54 +msgid "tracks" +msgstr "" + +#: front/src/components/library/Album.vue:43 +#: front/src/components/playlists/PlaylistModal.vue:33 +#: front/src/views/federation/Base.vue:8 src/views/playlists/Detail.vue:50 +#: front/src/views/radios/Detail.vue:34 +msgid "Tracks" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:125 +msgid "Tracks available in this library" +msgstr "" + +#: front/src/components/library/Artist.vue:54 +msgid "Tracks by this artist" +msgstr "" + +#: front/src/components/instance/Stats.vue:25 +msgid "Tracks favorited" +msgstr "" + +#: front/src/components/instance/Stats.vue:19 +msgid "tracks listened" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:109 +msgid "Trigger scan" +msgstr "" + +#: front/src/components/manage/library/FilesTable.vue:41 +msgid "Type" +msgstr "" + +#: front/src/components/About.vue:15 +msgid "Unfortunately, owners of this instance did not yet take the time to complete this page." +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:95 +msgid "Unknown" +msgstr "" + +#: front/src/components/Home.vue:37 +msgid "Unlimited music" +msgstr "" + +#: front/src/components/audio/Player.vue:264 +msgid "Unmute" +msgstr "" + +#: front/src/components/auth/Settings.vue:50 +msgid "Update avatar" +msgstr "" + +#: front/src/components/playlists/Form.vue:33 +msgid "Update playlist" +msgstr "" + +#: front/src/components/auth/Settings.vue:27 +msgid "Update settings" +msgstr "" + +#: front/src/views/auth/PasswordResetConfirm.vue:21 +msgid "Update your password" +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:172 +#: front/src/views/admin/users/UsersDetail.vue:153 +msgid "Upload" +msgstr "" + +#: front/src/components/auth/Settings.vue:45 +msgid "Upload a new avatar" +msgstr "" + +#: front/src/components/library/import/Main.vue:7 +msgid "Uploaded files or external source" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:57 +msgid "Uploading..." +msgstr "" + +#: front/src/App.vue:45 +msgid "Use another instance" +msgstr "" + +#: front/src/components/requests/Form.vue:75 +msgid "Use this comment box to add details to your request if needed" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:196 +msgid "Use this flag to enable/disable federation with this library" +msgstr "" + +#: front/src/views/auth/PasswordReset.vue:12 +msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password." +msgstr "" + +#: front/src/components/federation/LibraryForm.vue:6 +msgid "Use this form to scan an instance and setup federation." +msgstr "" + +#: front/src/components/manage/users/InvitationsTable.vue:49 +msgid "Used" +msgstr "" + +#: front/src/components/manage/library/RequestsTable.vue:47 +msgid "User" +msgstr "" + +#: front/src/components/instance/Stats.vue:5 +msgid "User activity" +msgstr "" + +#: front/src/components/library/Radios.vue:20 +msgid "User radios" +msgstr "" + +#: front/src/components/auth/Signup.vue:19 +#: front/src/components/manage/users/UsersTable.vue:37 +msgid "Username" +msgstr "" + +#: front/src/components/auth/Login.vue:15 +msgid "Username or email" +msgstr "" + +#: front/src/components/instance/Stats.vue:13 +msgid "users" +msgstr "" + +#: front/src/components/Sidebar.vue:103 src/views/admin/Settings.vue:81 +#: front/src/views/admin/users/Base.vue:5 src/views/admin/users/UsersList.vue:3 +#: front/src/views/admin/users/UsersList.vue:21 +msgid "Users" +msgstr "" + +#: front/src/components/library/Album.vue:37 src/components/library/Artist.vue:35 +#: front/src/components/library/Track.vue:44 +#: front/src/components/library/import/ArtistImport.vue:131 +#: front/src/components/metadata/ArtistCard.vue:49 +#: front/src/components/metadata/ReleaseCard.vue:53 +msgid "View on MusicBrainz" +msgstr "" + +#: front/src/components/playlists/PlaylistModal.vue:20 +msgid "We cannot add the track to a playlist" +msgstr "" + +#: front/src/components/playlists/Form.vue:14 +msgid "We cannot create the playlist" +msgstr "" + +#: front/src/components/auth/Signup.vue:13 +msgid "We cannot create your account" +msgstr "" + +#: front/src/components/auth/Login.vue:7 +msgid "We cannot log you in" +msgstr "" + +#: front/src/components/auth/Settings.vue:38 +msgid "We cannot save your avatar" +msgstr "" + +#: front/src/components/auth/Settings.vue:14 +msgid "We cannot save your settings" +msgstr "" + +#: front/src/components/Home.vue:130 +msgid "We do not track you or bother you with ads" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:5 +msgid "We recommend using Picard for that purpose." +msgstr "" + +#: front/src/components/Home.vue:7 +msgid "We think listening to music should be simple." +msgstr "" + +#: front/src/components/PageNotFound.vue:10 +msgid "We're sorry, the page you asked for does not exist:" +msgstr "" + +#: front/src/components/requests/Form.vue:21 +msgid "We've received your request, you'll get some groove soon ;)" +msgstr "" + +#: front/src/components/Home.vue:152 +msgid "Welcome" +msgstr "" + +#: front/src/components/Home.vue:5 +msgid "Welcome on Funkwhale" +msgstr "" + +#: front/src/components/library/import/Main.vue:114 +msgid "What is metadata?" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:197 +msgid "When enabled, auto importing will automatically import new tracks published in this library" +msgstr "" + +#: front/src/components/Home.vue:24 +msgid "Why funkwhale?" +msgstr "" + +#: front/src/components/Sidebar.vue:124 +msgid "Yes" +msgstr "" + +#: front/src/components/auth/Logout.vue:8 +msgid "Yes, log me out!" +msgstr "" + +#: front/src/components/auth/Logout.vue:7 +msgid "You are currently logged in as %{ username }" +msgstr "" + +#: front/src/components/library/import/Main.vue:111 +msgid "You can also skip this step and enter metadata manually." +msgstr "" + +#: front/src/components/Home.vue:136 +msgid "You can invite friends and family to your instance so they can enjoy your music" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:7 +msgid "You can use this interface to build your own custom radio, which will play tracks according to your criteria." +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:8 +msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance." +msgstr "" + +#: front/src/components/Sidebar.vue:156 +msgid "You have a radio playing" +msgstr "" + +#: front/src/App.vue:6 +msgid "You need to select an instance in order to continue" +msgstr "" + +#: front/src/components/auth/Settings.vue:100 +msgid "You will be logged out from this session and have to log in with the new one" +msgstr "" + +#: front/src/components/auth/Settings.vue:71 +msgid "You will have to update your password on your clients that use this password." +msgstr "" + +#: front/src/components/library/import/Main.vue:103 +msgid "You will import:" +msgstr "" + +#: front/src/views/auth/EmailConfirm.vue:24 +msgid "Your email address was confirmed, you can now use the service without limitations." +msgstr "" + +#: front/src/components/favorites/List.vue:109 +msgid "Your Favorites" +msgstr "" + +#: front/src/components/Home.vue:117 +msgid "Your music, your way" +msgstr "" + +#: front/src/views/auth/PasswordResetConfirm.vue:29 +msgid "Your password has been updated successfully." +msgstr "" + +#: front/src/components/auth/Settings.vue:101 +msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password" +msgstr "" + +#: front/src/components/audio/PlayButton.vue:156 +msgid "%{ count } track was added to your queue" +msgid_plural "%{ count } tracks were added to your queue" +msgstr[0] "" +msgstr[1] "" diff --git a/front/locales/sv/LC_MESSAGES/app.po b/front/locales/sv/LC_MESSAGES/app.po new file mode 100644 index 000000000..0fd43bceb --- /dev/null +++ b/front/locales/sv/LC_MESSAGES/app.po @@ -0,0 +1,2407 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the front package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: front 1.0.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-07-17 19:29+0200\n" +"PO-Revision-Date: 2018-07-21 21:30+0000\n" +"Last-Translator: Tim Stahel \n" +"Language-Team: none\n" +"Language: sv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 2.20\n" + +#: front/src/components/playlists/PlaylistModal.vue:9 +msgid "\"%{ title }\", by %{ artist }" +msgstr "\"%{ title }\", av %{ artist }" + +#: front/src/components/Sidebar.vue:24 +msgid "(%{ index } of %{ length })" +msgstr "(%{ index } av %{ length })" + +#: front/src/components/Sidebar.vue:22 +msgid "(empty)" +msgstr "(tom)" + +#: front/src/components/common/ActionTable.vue:43 +#: front/src/components/common/ActionTable.vue:51 +msgid "%{ count } on %{ total } selected" +msgid_plural "%{ count } on %{ total } selected" +msgstr[0] "%{ count } av %{ total } vald" +msgstr[1] "%{ count } av %{ total } valda" + +#: front/src/components/Sidebar.vue:116 src/views/federation/LibraryDetail.vue:87 +msgid "%{ count } track" +msgid_plural "%{ count } tracks" +msgstr[0] "%{ count } spår" +msgstr[1] "%{ count } spår" + +#: front/src/components/library/Artist.vue:13 +msgid "%{ count } track in %{ albumsCount } albums" +msgid_plural "%{ count } tracks in %{ albumsCount } albums" +msgstr[0] "%{ count } spår i %{ albumsCount } album" +msgstr[1] "%{ count } spår i %{ albumsCount } album" + +#: front/src/components/library/radios/Builder.vue:66 +msgid "%{ count } track matching combined filters" +msgid_plural "%{ count } tracks matching combined filters" +msgstr[0] "%{ count } spår som matchar kombinerade filter" +msgstr[1] "%{ count } spår som matchar kombinerade filter" + +#: front/src/components/playlists/Card.vue:18 +msgid "%{ count} track" +msgid_plural "%{ count } tracks" +msgstr[0] "%{ count } spår" +msgstr[1] "%{ count } spår" + +#: front/src/components/common/Duration.vue:2 +msgid "%{ hours } h %{ minutes } min" +msgstr "%{ hours } h %{ minutes } min" + +#: front/src/components/common/Duration.vue:5 +msgid "%{ minutes } min" +msgstr "%{ minutes } min" + +#: front/src/components/activity/Like.vue:7 +msgid "%{ user } favorited a track" +msgstr "%{ user } favoritmarkerade ett spår" + +#: front/src/components/activity/Listen.vue:7 +msgid "%{ user } listened to a track" +msgstr "%{ user } lyssnade på ett spår" + +#: front/src/components/auth/Profile.vue:49 +msgid "%{ username }'s profile" +msgstr "%{ username }s profil" + +#: front/src/components/audio/artist/Card.vue:41 +msgid "1 album" +msgid_plural "%{ count } albums" +msgstr[0] "1 album" +msgstr[1] "%{ count } album" + +#: front/src/components/favorites/List.vue:10 +msgid "1 favorite" +msgid_plural "%{ count } favorites" +msgstr[0] "1 favorit" +msgstr[1] "%{ count } favoriter" + +#: front/src/components/audio/album/Card.vue:54 +#: front/src/components/federation/LibraryCard.vue:25 +msgid "1 track" +msgid_plural "%{ count } tracks" +msgstr[0] "1 spår" +msgstr[1] "%{ count } spår" + +#: front/src/components/About.vue:5 +msgid "About %{ instance }" +msgstr "Om %{ instance }" + +#: front/src/App.vue:54 +msgid "About Funkwhale" +msgstr "Om Funkwhale" + +#: front/src/App.vue:32 src/components/About.vue:8 src/components/About.vue:55 +msgid "About this instance" +msgstr "Om denna instans" + +#: front/src/components/manage/library/RequestsTable.vue:28 +#: front/src/components/manage/library/RequestsTable.vue:62 +msgid "Accepted" +msgstr "Accepterad" + +#: front/src/components/auth/SubsonicTokenForm.vue:111 +msgid "Access disabled" +msgstr "Tillgång inaktiverad" + +#: front/src/components/Home.vue:109 +msgid "Access your music from a clean interface that focus on what really matters" +msgstr "" +"Få tillgång till din musik via ett rent gränssnitt som fokuserar på det som " +"verkligen är viktigt" + +#: front/src/views/admin/users/UsersDetail.vue:54 +msgid "Account active" +msgstr "Konto aktivt" + +#: front/src/components/auth/Settings.vue:5 +msgid "Account settings" +msgstr "Kontoinställningar" + +#: front/src/components/auth/Settings.vue:257 +msgid "Account Settings" +msgstr "Kontoinställningar" + +#: front/src/components/manage/users/UsersTable.vue:39 +msgid "Account status" +msgstr "Kontostatus" + +#: front/src/views/auth/PasswordReset.vue:14 +msgid "Account's email" +msgstr "Kontots e-postadress" + +#: front/src/components/common/ActionTable.vue:82 +msgid "Action %{ action } was launched successfully on %{ count } element" +msgid_plural "Action %{ action } was launched successfully on %{ count } elements" +msgstr[0] "Åtgärd %{ action } togs framgångrikt på %{ count } element" +msgstr[1] "Åtgärd %{ action } togs framgångrikt på %{ count } element" + +#: front/src/components/common/ActionTable.vue:8 +#: front/src/components/federation/LibraryFollowTable.vue:24 +#: front/src/components/library/radios/Builder.vue:50 +#: front/src/components/manage/library/RequestsTable.vue:54 +msgid "Actions" +msgstr "Åtgärder" + +#: front/src/components/manage/users/UsersTable.vue:53 +msgid "Active" +msgstr "Aktiv" + +#: front/src/components/Sidebar.vue:60 +msgid "Activity" +msgstr "Aktivitet" + +#: front/src/components/federation/LibraryFollowTable.vue:21 +msgid "Actor" +msgstr "Aktör" + +#: front/src/views/federation/LibraryList.vue:8 +msgid "Add a new library" +msgstr "Lägg till ett nytt bibliotek" + +#: front/src/components/library/radios/Builder.vue:36 +msgid "Add filter" +msgstr "Lägg till filter" + +#: front/src/components/library/radios/Builder.vue:26 +msgid "Add filters to customize your radio" +msgstr "Lägg till filter för att skräddarsy din radio" + +#: front/src/components/audio/PlayButton.vue:53 +msgid "Add to current queue" +msgstr "Lägg till i nuvarande kö" + +#: front/src/components/favorites/TrackFavoriteIcon.vue:4 +#: front/src/components/favorites/TrackFavoriteIcon.vue:21 +msgid "Add to favorites" +msgstr "Lägg till i favoriter" + +#: front/src/components/playlists/TrackPlaylistIcon.vue:6 +#: front/src/components/playlists/TrackPlaylistIcon.vue:32 +msgid "Add to playlist..." +msgstr "Lägg till i spellista..." + +#: front/src/components/audio/PlayButton.vue:14 +msgid "Add to queue" +msgstr "Lägg till i kö" + +#: front/src/components/playlists/PlaylistModal.vue:115 +msgid "Add to this playlist" +msgstr "Lägg till i denna spellista" + +#: front/src/components/playlists/PlaylistModal.vue:54 +msgid "Add track" +msgstr "Lägg till spår" + +#: front/src/components/manage/users/UsersTable.vue:69 +msgid "Admin" +msgstr "Administratör" + +#: front/src/components/Sidebar.vue:64 +msgid "Administration" +msgstr "Administration" + +#: front/src/components/audio/SearchBar.vue:26 src/components/audio/track/Table.vue:8 +#: front/src/components/federation/LibraryTrackTable.vue:49 +#: front/src/components/library/Album.vue:91 +#: front/src/components/manage/library/FilesTable.vue:39 +#: front/src/components/metadata/Search.vue:134 +msgid "Album" +msgstr "Album" + +#: front/src/components/library/import/ReleaseImport.vue:3 +msgid "Album %{ title } (%{ count } track) by %{ artist }" +msgid_plural "Album %{ title } (%{ count } tracks) by %{ artist }" +msgstr[0] "Album %{ title } (%{ count } spår) av %{ artist }" +msgstr[1] "Album %{ title } (%{ count } spår) av %{ artist }" + +#: front/src/components/library/Album.vue:12 +msgid "Album containing %{ count } track, by %{ artist }" +msgid_plural "Album containing %{ count } tracks, by %{ artist }" +msgstr[0] "Album med %{ count } spår, av %{ artist }" +msgstr[1] "Album med %{ count } spår, av %{ artist }" + +#: front/src/components/library/Track.vue:20 +msgid "Album page" +msgstr "Albumsida" + +#: front/src/components/audio/Search.vue:19 src/components/instance/Stats.vue:48 +#: front/src/components/manage/library/RequestsTable.vue:50 +#: front/src/components/requests/Form.vue:9 +msgid "Albums" +msgstr "Album" + +#: front/src/components/library/Artist.vue:44 +msgid "Albums by this artist" +msgstr "Album av denna artist" + +#: front/src/components/manage/library/RequestsTable.vue:26 +#: front/src/components/manage/users/InvitationsTable.vue:19 +msgid "All" +msgstr "Allt" + +#: front/src/components/playlists/Editor.vue:13 +msgid "An error occured while saving your changes" +msgstr "Ett fel inträffade när dina ändringar sparades" + +#: front/src/components/auth/Login.vue:10 +msgid "An unknown error happend, this can mean the server is down or cannot be reached" +msgstr "" +"Ett okänt fel inträffade, detta kan betyda att servern är nere eller inte " +"kan nås" + +#: front/src/components/federation/LibraryTrackTable.vue:11 +#: front/src/components/library/import/BatchDetail.vue:68 +#: front/src/components/library/import/BatchList.vue:13 +#: front/src/components/library/import/BatchList.vue:22 +msgid "Any" +msgstr "" + +#: front/src/components/library/import/BatchList.vue:24 +msgid "API" +msgstr "API" + +#: front/src/components/federation/LibraryFollowTable.vue:68 +#: front/src/components/federation/LibraryFollowTable.vue:78 +msgid "Approve" +msgstr "Godkänn" + +#: front/src/components/federation/LibraryFollowTable.vue:70 +msgid "Approve access?" +msgstr "Godkänn åtkomst?" + +#: front/src/components/federation/LibraryFollowTable.vue:38 +msgid "Approved" +msgstr "Godkännt" + +#: front/src/components/auth/Logout.vue:5 +msgid "Are you sure you want to log out?" +msgstr "Är du säker på att du vill logga ut?" + +#: front/src/components/audio/SearchBar.vue:25 src/components/audio/track/Table.vue:7 +#: front/src/components/federation/LibraryTrackTable.vue:48 +#: front/src/components/library/Artist.vue:119 +#: front/src/components/manage/library/FilesTable.vue:38 +#: front/src/components/manage/library/RequestsTable.vue:49 +#: front/src/components/metadata/Search.vue:130 +msgid "Artist" +msgstr "Artist" + +#: front/src/components/requests/Form.vue:5 +msgid "Artist name" +msgstr "Artistnamn" + +#: front/src/components/library/Album.vue:22 src/components/library/Track.vue:23 +msgid "Artist page" +msgstr "Artistsida" + +#: front/src/components/audio/Search.vue:65 +msgid "Artist, album, track..." +msgstr "Artist, album, spår..." + +#: front/src/components/audio/Search.vue:10 src/components/instance/Stats.vue:42 +#: front/src/components/library/Artists.vue:119 src/components/library/Library.vue:7 +msgid "Artists" +msgstr "Artister" + +#: front/src/components/favorites/List.vue:33 +#: front/src/components/federation/LibraryTrackTable.vue:28 +#: front/src/components/library/Artists.vue:25 src/components/library/Radios.vue:44 +#: front/src/components/manage/library/FilesTable.vue:19 +#: front/src/components/manage/library/RequestsTable.vue:19 +#: front/src/components/manage/users/UsersTable.vue:19 +#: front/src/views/federation/LibraryList.vue:28 src/views/playlists/List.vue:27 +msgid "Ascending" +msgstr "Stigande" + +#: front/src/views/auth/PasswordReset.vue:27 +msgid "Ask for a password reset" +msgstr "Begär lösenordsåterställning" + +#: front/src/views/federation/LibraryDetail.vue:56 +msgid "Auto importing" +msgstr "Automatisk import" + +#: front/src/components/playlists/PlaylistModal.vue:26 +msgid "Available playlists" +msgstr "Tillgängliga spellistor" + +#: front/src/components/auth/Settings.vue:34 +msgid "Avatar" +msgstr "Avatar" + +#: front/src/views/auth/EmailConfirm.vue:17 src/views/auth/PasswordReset.vue:24 +#: front/src/views/auth/PasswordResetConfirm.vue:18 +msgid "Back to login" +msgstr "Tillbaka till inloggning" + +#: front/src/views/federation/LibraryFollowersList.vue:5 +msgid "Be careful when accepting follow requests, as it means the follower will have access to your entire library." +msgstr "" +"Var försiktig när du accepterar följare, då det innebär att följaren får " +"tillgång till hela ditt bibliotek." + +#: front/src/components/library/Track.vue:80 +#: front/src/components/manage/library/FilesTable.vue:42 +msgid "Bitrate" +msgstr "Bitrate" + +#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4 +msgid "Browse" +msgstr "Bläddra" + +#: front/src/components/Sidebar.vue:50 +msgid "Browse library" +msgstr "Bläddra i biblioteket" + +#: front/src/components/library/Artists.vue:4 +msgid "Browsing artists" +msgstr "Bläddra artister" + +#: front/src/views/federation/LibraryTrackList.vue:3 +msgid "Browsing federated tracks" +msgstr "" + +#: front/src/views/federation/LibraryFollowersList.vue:3 +msgid "Browsing followers" +msgstr "" + +#: front/src/views/federation/LibraryList.vue:3 +msgid "Browsing libraries" +msgstr "" + +#: front/src/views/playlists/List.vue:3 +msgid "Browsing playlists" +msgstr "" + +#: front/src/components/library/Radios.vue:4 +msgid "Browsing radios" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:5 +msgid "Builder" +msgstr "" + +#: front/src/components/audio/album/Card.vue:13 +msgid "By %{ artist }" +msgstr "Av %{ artist }" + +#: front/src/components/federation/LibraryFollowTable.vue:57 +msgid "By confirming, %{ username } will be denied access to your library." +msgstr "" +"Genom att bekräfta kommer %{ username } att nekas åtkomst till ditt " +"bibliotek." + +#: front/src/components/federation/LibraryFollowTable.vue:73 +msgid "By confirming, %{ username } will be granted access to your library." +msgstr "Genom att godkänna ger du %{ username } tillgång till ditt bibliotek." + +#: front/src/components/audio/track/Table.vue:43 +#: front/src/components/common/DangerousButton.vue:17 +#: front/src/components/library/radios/Filter.vue:53 +#: front/src/components/playlists/PlaylistModal.vue:63 +msgid "Cancel" +msgstr "Ångra" + +#: front/src/components/library/radios/Builder.vue:49 +msgid "Candidates" +msgstr "Kandidater" + +#: front/src/components/auth/Settings.vue:76 +msgid "Cannot change your password" +msgstr "Kan inte ändra lösenord" + +#: front/src/App.vue:66 +msgid "Change language" +msgstr "Ändra språk" + +#: front/src/components/auth/Settings.vue:67 +msgid "Change my password" +msgstr "Ändra mitt lösenord" + +#: front/src/components/auth/Settings.vue:95 +msgid "Change password" +msgstr "Ändra lösenord" + +#: front/src/views/auth/PasswordResetConfirm.vue:4 +#: front/src/views/auth/PasswordResetConfirm.vue:62 +msgid "Change your password" +msgstr "Ändra ditt lösenord" + +#: front/src/components/auth/Settings.vue:96 +msgid "Change your password?" +msgstr "Ändra ditt lösenord?" + +#: front/src/components/playlists/Editor.vue:21 +msgid "Changes synced with server" +msgstr "Ändringar synkade med servern" + +#: front/src/components/auth/Settings.vue:70 +msgid "Changing your password will also change your Subsonic API password if you have requested one." +msgstr "" + +#: front/src/components/auth/Settings.vue:98 +msgid "Changing your password will have the following consequences" +msgstr "" + +#: front/src/App.vue:4 +msgid "Choose your instance" +msgstr "" + +#: front/src/components/Home.vue:64 +msgid "Clean library" +msgstr "" + +#: front/src/components/manage/users/InvitationForm.vue:37 +msgid "Clear" +msgstr "" + +#: front/src/components/playlists/Editor.vue:40 +#: front/src/components/playlists/Editor.vue:45 +msgid "Clear playlist" +msgstr "" + +#: front/src/components/audio/Player.vue:270 +msgid "Clear your queue" +msgstr "" + +#: front/src/components/library/import/BatchList.vue:23 +msgid "CLI" +msgstr "" + +#: front/src/components/Home.vue:44 +msgid "Click once, listen for hours using built-in radios" +msgstr "" + +#: front/src/components/manage/library/RequestsTable.vue:30 +#: front/src/components/manage/library/RequestsTable.vue:64 +msgid "Closed" +msgstr "" + +#: front/src/components/manage/users/InvitationForm.vue:26 +#: front/src/components/manage/users/InvitationsTable.vue:42 +msgid "Code" +msgstr "" + +#: front/src/components/audio/album/Card.vue:43 +#: front/src/components/audio/artist/Card.vue:33 +#: front/src/components/discussion/Comment.vue:20 +msgid "Collapse" +msgstr "" + +#: front/src/components/manage/library/RequestsTable.vue:51 +#: front/src/components/requests/Form.vue:14 +msgid "Comment" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:48 +msgid "Config" +msgstr "" + +#: front/src/components/common/DangerousButton.vue:21 +msgid "Confirm" +msgstr "" + +#: front/src/views/auth/EmailConfirm.vue:4 src/views/auth/EmailConfirm.vue:20 +#: front/src/views/auth/EmailConfirm.vue:51 +msgid "Confirm your email" +msgstr "" + +#: front/src/views/auth/EmailConfirm.vue:13 +msgid "Confirmation code" +msgstr "" + +#: front/src/components/playlists/Editor.vue:163 +msgid "Copy tracks from current queue to playlist" +msgstr "" + +#: front/src/components/Home.vue:88 +msgid "Covers, lyrics, our goal is to have them all ;)" +msgstr "" + +#: front/src/components/auth/Signup.vue:4 +msgid "Create a funkwhale account" +msgstr "" + +#: front/src/components/playlists/Form.vue:2 +msgid "Create a new playlist" +msgstr "" + +#: front/src/components/auth/Login.vue:17 +msgid "Create an account" +msgstr "" + +#: front/src/components/manage/library/RequestsTable.vue:88 +#: front/src/components/requests/Card.vue:25 +msgid "Create import" +msgstr "" + +#: front/src/components/auth/Signup.vue:51 +msgid "Create my account" +msgstr "" + +#: front/src/components/playlists/Form.vue:34 +msgid "Create playlist" +msgstr "" + +#: front/src/components/library/Radios.vue:23 +msgid "Create your own radio" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:22 +#: front/src/components/manage/library/RequestsTable.vue:52 +#: front/src/components/manage/users/InvitationsTable.vue:40 +msgid "Creation date" +msgstr "" + +#: front/src/components/auth/Settings.vue:54 +msgid "Current avatar" +msgstr "" + +#: front/src/components/playlists/PlaylistModal.vue:8 +msgid "Current track" +msgstr "" + +#: front/src/components/manage/library/FilesTable.vue:189 +#: front/src/components/manage/library/RequestsTable.vue:195 +#: front/src/components/manage/users/InvitationsTable.vue:166 +#: front/src/views/playlists/Detail.vue:33 +msgid "Delete" +msgstr "" + +#: front/src/views/playlists/Detail.vue:38 +msgid "Delete playlist" +msgstr "" + +#: front/src/views/radios/Detail.vue:28 +msgid "Delete radio" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:52 +#: front/src/components/federation/LibraryFollowTable.vue:63 +msgid "Deny" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:54 +msgid "Deny access?" +msgstr "" + +#: front/src/components/favorites/List.vue:34 +#: front/src/components/federation/LibraryTrackTable.vue:29 +#: front/src/components/library/Artists.vue:26 src/components/library/Radios.vue:47 +#: front/src/components/manage/library/FilesTable.vue:20 +#: front/src/components/manage/library/RequestsTable.vue:20 +#: front/src/components/manage/users/UsersTable.vue:20 +#: front/src/views/federation/LibraryList.vue:29 src/views/playlists/List.vue:28 +msgid "Descending" +msgstr "" + +#: front/src/components/federation/LibraryCard.vue:50 +msgid "Detail" +msgstr "" + +#: front/src/views/admin/users/UsersDetail.vue:146 +msgid "Determine if the user account is active or not. Inactive users cannot login or use the service." +msgstr "" + +#: front/src/components/auth/Settings.vue:104 +#: front/src/components/auth/SubsonicTokenForm.vue:52 +msgid "Disable access" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:49 +msgid "Disable Subsonic access" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:50 +msgid "Disable Subsonic API access?" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:14 +msgid "Discover how to use Funkwhale from other apps" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:16 +msgid "Display publicly" +msgstr "" + +#: front/src/components/playlists/Editor.vue:42 +msgid "Do you want to clear the playlist \"%{ playlist }\"?" +msgstr "" + +#: front/src/components/common/DangerousButton.vue:7 +msgid "Do you want to confirm this action?" +msgstr "" + +#: front/src/views/playlists/Detail.vue:35 +msgid "Do you want to delete the playlist \"%{ playlist }\"?" +msgstr "" + +#: front/src/views/radios/Detail.vue:26 +msgid "Do you want to delete the radio \"{{ radio }}\"?" +msgstr "" + +#: front/src/components/common/ActionTable.vue:29 +msgid "Do you want to launch %{ action } on %{ count } element?" +msgid_plural "Do you want to launch %{ action } on %{ count } elements?" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/Sidebar.vue:113 +msgid "Do you want to restore your previous queue?" +msgstr "" + +#: front/src/App.vue:38 +msgid "Documentation" +msgstr "" + +#: front/src/components/audio/track/Table.vue:24 src/components/library/Track.vue:48 +msgid "Download" +msgstr "" + +#: front/src/components/audio/track/Table.vue:27 +msgid "Download tracks" +msgstr "" + +#: front/src/components/playlists/Editor.vue:49 +msgid "Drag and drop rows to reorder tracks in the playlist" +msgstr "" + +#: front/src/components/library/Track.vue:58 +#: front/src/components/manage/library/FilesTable.vue:43 +msgid "Duration" +msgstr "" + +#: front/src/components/Home.vue:96 +msgid "Easy to use" +msgstr "" + +#: front/src/components/About.vue:21 +msgid "Edit instance info" +msgstr "" + +#: front/src/components/radios/Card.vue:20 src/views/playlists/Detail.vue:30 +msgid "Edit..." +msgstr "" + +#: front/src/components/auth/Signup.vue:29 +#: front/src/components/manage/users/UsersTable.vue:38 +msgid "Email" +msgstr "" + +#: front/src/views/admin/users/UsersDetail.vue:29 +msgid "Email address" +msgstr "" + +#: front/src/views/auth/EmailConfirm.vue:23 +msgid "Email confirmed" +msgstr "" + +#: front/src/views/playlists/Detail.vue:29 +msgid "End edition" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:4 +msgid "Ensure your music files are properly tagged before uploading them." +msgstr "" + +#: front/src/components/library/Radios.vue:140 +msgid "Enter a radio name..." +msgstr "" + +#: front/src/components/library/Artists.vue:118 +msgid "Enter an artist name..." +msgstr "" + +#: front/src/views/federation/LibraryList.vue:122 +msgid "Enter an library domain name..." +msgstr "" + +#: front/src/views/playlists/List.vue:104 +msgid "Enter an playlist name..." +msgstr "" + +#: front/src/components/auth/Signup.vue:98 +msgid "Enter your email" +msgstr "" + +#: front/src/components/auth/Signup.vue:96 +msgid "Enter your invitation code (case insensitive)" +msgstr "" + +#: front/src/components/metadata/Search.vue:114 +msgid "Enter your search query..." +msgstr "" + +#: front/src/components/auth/Signup.vue:97 +msgid "Enter your username" +msgstr "" + +#: front/src/components/auth/Login.vue:77 +msgid "Enter your username or email" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:20 +msgid "Error" +msgstr "" + +#: front/src/views/admin/Settings.vue:87 +msgid "Error reporting" +msgstr "" + +#: front/src/components/common/ActionTable.vue:75 +msgid "Error while applying action" +msgstr "" + +#: front/src/views/auth/PasswordReset.vue:7 +msgid "Error while asking for a password reset" +msgstr "" + +#: front/src/views/auth/PasswordResetConfirm.vue:7 +msgid "Error while changing your password" +msgstr "" + +#: front/src/views/auth/EmailConfirm.vue:7 +msgid "Error while confirming your email" +msgstr "" + +#: front/src/components/manage/users/InvitationForm.vue:4 +msgid "Error while creating invitation" +msgstr "" + +#: front/src/components/admin/SettingsGroup.vue:5 +msgid "Error while saving settings" +msgstr "" + +#: front/src/components/federation/LibraryForm.vue:10 +msgid "Error while scanning library" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:41 +#: front/src/components/library/import/BatchDetail.vue:70 +#: front/src/components/library/import/BatchList.vue:15 +msgid "Errored" +msgstr "" + +#: front/src/components/playlists/Form.vue:89 +msgid "Everyone" +msgstr "" + +#: front/src/components/playlists/Form.vue:85 +msgid "Everyone on this instance" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:47 +msgid "Exclude" +msgstr "" + +#: front/src/components/discussion/Comment.vue:14 +msgid "Expand" +msgstr "" + +#: front/src/components/manage/users/InvitationsTable.vue:41 +msgid "Expiration date" +msgstr "" + +#: front/src/components/manage/users/InvitationsTable.vue:50 +msgid "Expired" +msgstr "" + +#: front/src/components/manage/users/InvitationsTable.vue:21 +msgid "Expired/used" +msgstr "" + +#: front/src/components/library/import/Main.vue:65 +msgid "External source. Supported backends" +msgstr "" + +#: front/src/components/Sidebar.vue:51 +msgid "Favorites" +msgstr "" + +#: front/src/components/federation/LibraryForm.vue:3 +msgid "Federate with a new instance" +msgstr "" + +#: front/src/views/federation/LibraryTrackList.vue:21 +msgid "Federated tracks" +msgstr "" + +#: front/src/components/Sidebar.vue:87 src/components/library/import/BatchList.vue:25 +#: front/src/components/manage/users/UsersTable.vue:180 +#: front/src/views/admin/Settings.vue:84 src/views/admin/users/UsersDetail.vue:161 +#: front/src/views/federation/Base.vue:35 src/views/federation/LibraryDetail.vue:40 +msgid "Federation" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:3 +msgid "File mirroring" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:43 +msgid "File name" +msgstr "" + +#: front/src/components/library/import/Main.vue:76 +msgid "File upload" +msgstr "" + +#: front/src/views/admin/library/Base.vue:5 src/views/admin/library/FilesList.vue:21 +msgid "Files" +msgstr "" + +#: front/src/components/library/import/ArtistImport.vue:7 +msgid "Filter album types" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:46 +msgid "Filter name" +msgstr "" + +#: front/src/components/library/import/Main.vue:52 +msgid "Finish import" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:54 +msgid "Finished" +msgstr "" + +#: front/src/components/library/import/Main.vue:59 +msgid "First, choose where you want to import the music from" +msgstr "" + +#: front/src/components/federation/LibraryCard.vue:44 +msgid "Follow" +msgstr "" + +#: front/src/components/federation/LibraryCard.vue:36 +msgid "Follow request pending approval" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:21 +msgid "Follow status" +msgstr "" + +#: front/src/views/federation/Base.vue:13 +#: front/src/views/federation/LibraryFollowersList.vue:24 +msgid "Followers" +msgstr "" + +#: front/src/components/federation/LibraryCard.vue:18 +msgid "Followers only" +msgstr "" + +#: front/src/components/federation/LibraryCard.vue:15 +#: front/src/views/federation/LibraryDetail.vue:29 +msgid "Following" +msgstr "" + +#: front/src/components/activity/Like.vue:12 src/components/activity/Listen.vue:12 +msgid "from %{ album } by %{ artist }" +msgstr "" + +#: front/src/components/library/Track.vue:13 +msgid "From album %{ album } by %{ artist }" +msgstr "" + +#: front/src/App.vue:56 +msgid "Funkwhale is a free and open-source project run by volunteers. You can help us improve the platform by reporting bugs, suggesting features and share the project with your friends!" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:7 +msgid "Funkwhale is compatible with other music players that support the Subsonic API." +msgstr "" + +#: front/src/components/Home.vue:98 +msgid "Funkwhale is dead simple to use." +msgstr "" + +#: front/src/components/Home.vue:39 +msgid "Funkwhale is designed to make it easy to listen to music you like, or to discover new artists." +msgstr "" + +#: front/src/components/Home.vue:119 +msgid "Funkwhale is free and gives you control on your music." +msgstr "" + +#: front/src/components/Home.vue:66 +msgid "Funkwhale takes care of handling your music" +msgstr "" + +#: front/src/components/manage/users/InvitationForm.vue:16 +msgid "Get a new invitation" +msgstr "" + +#: front/src/components/Home.vue:13 +msgid "Get me to the library" +msgstr "" + +#: front/src/components/Home.vue:77 +msgid "" +"Get quality metadata about your music thanks to\n" +" \n" +" MusicBrainz\n" +" " +msgstr "" + +#: front/src/components/common/ActionTable.vue:21 +#: front/src/components/common/ActionTable.vue:27 +msgid "Go" +msgstr "" + +#: front/src/components/PageNotFound.vue:14 +msgid "Go to home page" +msgstr "" + +#: front/src/components/library/import/Main.vue:13 +msgid "Grab corresponding metadata" +msgstr "" + +#: front/src/components/library/Home.vue:65 +msgid "Home" +msgstr "" + +#: front/src/components/instance/Stats.vue:36 +msgid "Hours of music" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:11 +msgid "However, accessing Funkwhale from those clients require a separate password you can set below." +msgstr "" + +#: front/src/components/library/import/BatchList.vue:34 +msgid "ID" +msgstr "" + +#: front/src/views/auth/PasswordResetConfirm.vue:24 +msgid "If the email address provided in the previous step is valid and binded to a user account, you should receive an email with reset instructions in the next couple of minutes." +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:196 +#: front/src/components/library/Library.vue:17 +msgid "Import" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:57 +msgid "Import #%{ id } launched" +msgstr "" + +#: front/src/components/library/import/Main.vue:38 +msgid "Import %{ count } track" +msgid_plural "Import %{ count } tracks" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/library/import/BatchDetail.vue:10 +msgid "Import batch" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:185 +msgid "Import Batch #%{ id }" +msgstr "" + +#: front/src/components/library/Library.vue:20 +msgid "Import batches" +msgstr "" + +#: front/src/components/library/import/BatchList.vue:117 +msgid "Import Batches" +msgstr "" + +#: front/src/components/manage/library/FilesTable.vue:40 +#: front/src/components/manage/library/RequestsTable.vue:53 +msgid "Import date" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:38 +msgid "Import detail page" +msgstr "" + +#: front/src/components/Sidebar.vue:81 +msgid "Import music" +msgstr "" + +#: front/src/components/library/import/Main.vue:267 +msgid "Import Music" +msgstr "" + +#: front/src/components/Home.vue:71 +msgid "Import music from various platforms, such as YouTube or SoundCloud" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:14 +#: front/src/components/federation/LibraryTrackTable.vue:66 +msgid "Import pending" +msgstr "" + +#: front/src/views/admin/library/Base.vue:9 +#: front/src/views/admin/library/RequestsList.vue:3 +#: front/src/views/admin/library/RequestsList.vue:21 +msgid "Import requests" +msgstr "" + +#: front/src/components/library/import/BatchList.vue:20 +#: front/src/components/library/import/Main.vue:6 +msgid "Import source" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:9 +msgid "Import status" +msgstr "" + +#: front/src/components/library/import/ReleaseImport.vue:14 +msgid "Import this release" +msgstr "" + +#: front/src/components/library/import/TrackImport.vue:11 +msgid "Import this track" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:12 +#: front/src/components/manage/library/RequestsTable.vue:29 +#: front/src/components/manage/library/RequestsTable.vue:61 +msgid "Imported" +msgstr "" + +#: front/src/components/library/import/TrackImport.vue:44 +msgid "Imported URL" +msgstr "" + +#: front/src/views/admin/Settings.vue:82 +msgid "Imports" +msgstr "" + +#: front/src/components/favorites/TrackFavoriteIcon.vue:3 +msgid "In favorites" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:65 +msgid "In library" +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:54 +msgid "Inactive" +msgstr "" + +#: front/src/components/library/import/Main.vue:96 +msgid "Input a MusicBrainz ID manually:" +msgstr "" + +#: front/src/views/auth/PasswordReset.vue:53 +msgid "Input the email address binded to your account" +msgstr "" + +#: front/src/components/playlists/Editor.vue:31 +msgid "Insert from queue (%{ count } track)" +msgid_plural "Insert from queue (%{ count } tracks)" +msgstr[0] "" +msgstr[1] "" + +#: front/src/views/admin/Settings.vue:80 +msgid "Instance information" +msgstr "" + +#: front/src/components/library/Radios.vue:9 +msgid "Instance radios" +msgstr "" + +#: front/src/views/admin/Settings.vue:75 +msgid "Instance settings" +msgstr "" + +#: front/src/views/instance/Timeline.vue:57 +msgid "Instance Timeline" +msgstr "" + +#: front/src/components/auth/Signup.vue:42 +#: front/src/components/manage/users/InvitationForm.vue:11 +msgid "Invitation code" +msgstr "" + +#: front/src/components/auth/Signup.vue:43 +msgid "Invitation code (optional)" +msgstr "" + +#: front/src/views/admin/users/Base.vue:8 src/views/admin/users/InvitationsList.vue:3 +#: front/src/views/admin/users/InvitationsList.vue:24 +msgid "Invitations" +msgstr "" + +#: front/src/App.vue:43 +msgid "Issue tracker" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:80 +msgid "Job ID" +msgstr "" + +#: front/src/components/library/import/BatchList.vue:36 +msgid "Jobs" +msgstr "" + +#: front/src/components/Home.vue:50 +msgid "Keep a track of your favorite songs" +msgstr "" + +#: front/src/components/audio/track/Table.vue:33 +msgid "Keep your PRIVATE_TOKEN secret as it gives access to your account." +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:41 +#: front/src/views/admin/users/UsersDetail.vue:45 +msgid "Last activity" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:101 +msgid "Last fetched" +msgstr "" + +#: front/src/components/playlists/PlaylistModal.vue:32 +msgid "Last modification" +msgstr "" + +#: front/src/components/common/ActionTable.vue:39 +msgid "Launch" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:18 +#: front/src/components/library/import/BatchList.vue:35 +msgid "Launch date" +msgstr "" + +#: front/src/components/federation/LibraryForm.vue:31 +msgid "Launch scan" +msgstr "" + +#: front/src/components/Home.vue:10 +msgid "Learn more about this instance" +msgstr "" + +#: front/src/components/manage/users/InvitationForm.vue:58 +msgid "Leave empty for a random code" +msgstr "" + +#: front/src/components/requests/Form.vue:10 +msgid "Leave this field empty if you're requesting the whole discography." +msgstr "" + +#: front/src/views/federation/Base.vue:5 src/views/federation/LibraryList.vue:123 +msgid "Libraries" +msgstr "" + +#: front/src/components/Sidebar.vue:70 +#: front/src/components/federation/LibraryTrackTable.vue:51 +#: front/src/components/instance/Stats.vue:30 +#: front/src/components/manage/users/UsersTable.vue:176 +#: front/src/views/admin/users/UsersDetail.vue:157 +#: front/src/views/federation/LibraryDetail.vue:194 +msgid "Library" +msgstr "" + +#: front/src/views/admin/library/FilesList.vue:3 +msgid "Library files" +msgstr "" + +#: front/src/components/federation/LibraryForm.vue:20 +msgid "Library name" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:84 +msgid "Library size" +msgstr "" + +#: front/src/components/federation/LibraryForm.vue:96 +msgid "library@demo.funkwhale.audio" +msgstr "" + +#: front/src/App.vue:29 +msgid "Links" +msgstr "" + +#: front/src/views/instance/Timeline.vue:4 +msgid "Loading timeline..." +msgstr "" + +#: front/src/components/favorites/List.vue:5 +msgid "Loading your favorites..." +msgstr "" + +#: front/src/components/auth/Login.vue:78 +msgid "Log In" +msgstr "" + +#: front/src/components/auth/Login.vue:4 +msgid "Log in to your Funkwhale account" +msgstr "" + +#: front/src/components/auth/Logout.vue:20 +msgid "Log Out" +msgstr "" + +#: front/src/components/Sidebar.vue:38 +msgid "Logged in as %{ username }" +msgstr "" + +#: front/src/components/Sidebar.vue:44 src/components/auth/Login.vue:41 +msgid "Login" +msgstr "" + +#: front/src/components/Sidebar.vue:43 +msgid "Logout" +msgstr "" + +#: front/src/components/audio/Player.vue:266 +msgid "Looping disabled. Click to switch to single-track looping." +msgstr "" + +#: front/src/components/audio/Player.vue:267 +msgid "Looping on a single track. Click to switch to whole queue looping." +msgstr "" + +#: front/src/components/audio/Player.vue:268 +msgid "Looping on whole queue. Click to disable looping." +msgstr "" + +#: front/src/components/library/Track.vue:94 +msgid "Lyrics" +msgstr "" + +#: front/src/views/admin/library/Base.vue:25 +msgid "Manage library" +msgstr "" + +#: front/src/components/playlists/PlaylistModal.vue:3 +msgid "Manage playlists" +msgstr "" + +#: front/src/views/admin/users/Base.vue:20 +msgid "Manage users" +msgstr "" + +#: front/src/views/playlists/List.vue:8 +msgid "Manage your playlists" +msgstr "" + +#: front/src/components/manage/library/RequestsTable.vue:197 +msgid "Mark as closed" +msgstr "" + +#: front/src/components/manage/library/RequestsTable.vue:196 +msgid "Mark as imported" +msgstr "" + +#: front/src/components/library/import/Main.vue:12 +msgid "Metadata" +msgstr "" + +#: front/src/components/library/import/Main.vue:115 +msgid "" +"Metadata is the data related to the music you want to import. This includes all the information about the artists, albums and tracks. In order to have a high quality library, it is recommended to grab data from the\n" +" \n" +" MusicBrainz\n" +" \n" +" project, which you can think about as the Wikipedia of music." +msgstr "" + +#: front/src/components/Sidebar.vue:48 src/components/library/import/Main.vue:18 +msgid "Music" +msgstr "" + +#: front/src/components/library/import/Main.vue:147 +msgid "Music request" +msgstr "" + +#: front/src/components/audio/Player.vue:265 +msgid "Mute" +msgstr "" + +#: front/src/components/Sidebar.vue:34 +msgid "My account" +msgstr "" + +#: front/src/components/playlists/Form.vue:74 +msgid "My awesome playlist" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:206 +msgid "My awesome radio" +msgstr "" + +#: front/src/components/library/Track.vue:64 src/components/library/Track.vue:75 +#: front/src/components/library/Track.vue:86 +#: front/src/components/manage/library/FilesTable.vue:63 +#: front/src/components/manage/library/FilesTable.vue:69 +#: front/src/components/manage/library/FilesTable.vue:75 +#: front/src/components/manage/library/FilesTable.vue:81 +#: front/src/components/manage/library/RequestsTable.vue:71 +#: front/src/components/manage/library/RequestsTable.vue:75 +#: front/src/components/manage/library/RequestsTable.vue:82 +#: front/src/components/manage/users/UsersTable.vue:61 +#: front/src/views/admin/users/UsersDetail.vue:49 +msgid "N/A" +msgstr "" + +#: front/src/components/playlists/PlaylistModal.vue:31 +#: front/src/views/admin/users/UsersDetail.vue:21 +msgid "Name" +msgstr "" + +#: front/src/components/auth/Settings.vue:88 +#: front/src/views/auth/PasswordResetConfirm.vue:14 +msgid "New password" +msgstr "" + +#: front/src/components/Sidebar.vue:158 +msgid "New tracks will be appended here automatically." +msgstr "" + +#: front/src/components/library/import/Main.vue:29 +msgid "Next step" +msgstr "" + +#: front/src/components/audio/Player.vue:263 +msgid "Next track" +msgstr "" + +#: front/src/components/Sidebar.vue:125 +msgid "No" +msgstr "" + +#: front/src/components/Home.vue:103 +msgid "No add-ons, no plugins : you only need a web library" +msgstr "" + +#: front/src/components/library/Track.vue:102 +msgid "No lyrics available for this track." +msgstr "" + +#: front/src/components/playlists/Form.vue:81 +msgid "Nobody except me" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:32 +msgid "Not following" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:13 +#: front/src/components/federation/LibraryTrackTable.vue:67 +msgid "Not imported" +msgstr "" + +#: front/src/components/manage/users/InvitationsTable.vue:51 +msgid "Not used" +msgstr "" + +#: front/src/App.vue:37 +msgid "Official website" +msgstr "" + +#: front/src/components/auth/Settings.vue:83 +msgid "Old password" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:36 +msgid "Once all your files are uploaded, simply click the following button to check the import status." +msgstr "" + +#: front/src/components/federation/LibraryCard.vue:21 +#: front/src/components/manage/users/InvitationsTable.vue:20 +msgid "Open" +msgstr "" + +#: front/src/App.vue:63 +msgid "Options" +msgstr "" + +#: front/src/components/library/import/Main.vue:93 +msgid "Or" +msgstr "" + +#: front/src/components/favorites/List.vue:23 +#: front/src/components/federation/LibraryTrackTable.vue:18 +#: front/src/components/library/Artists.vue:15 src/components/library/Radios.vue:33 +#: front/src/components/manage/library/FilesTable.vue:9 +#: front/src/components/manage/library/RequestsTable.vue:9 +#: front/src/components/manage/users/InvitationsTable.vue:9 +#: front/src/components/manage/users/UsersTable.vue:9 +#: front/src/views/federation/LibraryList.vue:18 src/views/playlists/List.vue:17 +msgid "Ordering" +msgstr "" + +#: front/src/components/favorites/List.vue:31 +#: front/src/components/federation/LibraryTrackTable.vue:26 +#: front/src/components/library/Artists.vue:23 src/components/library/Radios.vue:41 +#: front/src/components/manage/library/FilesTable.vue:17 +#: front/src/components/manage/library/RequestsTable.vue:17 +#: front/src/components/manage/users/UsersTable.vue:17 +#: front/src/views/federation/LibraryList.vue:26 src/views/playlists/List.vue:25 +msgid "Ordering direction" +msgstr "" + +#: front/src/components/manage/users/InvitationsTable.vue:38 +msgid "Owner" +msgstr "" + +#: front/src/components/PageNotFound.vue:33 +msgid "Page Not Found" +msgstr "" + +#: front/src/components/PageNotFound.vue:7 +msgid "Page not found!" +msgstr "" + +#: front/src/components/auth/Login.vue:32 src/components/auth/Signup.vue:38 +msgid "Password" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:95 +msgid "Password updated" +msgstr "" + +#: front/src/views/auth/PasswordResetConfirm.vue:28 +msgid "Password updated successfully" +msgstr "" + +#: front/src/components/audio/Player.vue:262 +msgid "Pause track" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:46 +#: front/src/components/library/import/BatchDetail.vue:33 +#: front/src/components/library/import/BatchDetail.vue:69 +#: front/src/components/library/import/BatchList.vue:14 +#: front/src/components/library/import/FileUpload.vue:59 +#: front/src/components/manage/library/RequestsTable.vue:27 +#: front/src/components/manage/library/RequestsTable.vue:63 +msgid "Pending" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:11 +#: front/src/views/federation/LibraryDetail.vue:26 +msgid "Pending approval" +msgstr "" + +#: front/src/components/Sidebar.vue:217 +msgid "Pending follow requests" +msgstr "" + +#: front/src/components/Sidebar.vue:216 src/views/admin/library/Base.vue:26 +msgid "Pending import requests" +msgstr "" + +#: front/src/components/requests/Form.vue:26 src/views/federation/Base.vue:36 +msgid "Pending requests" +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:42 +#: front/src/views/admin/users/UsersDetail.vue:68 +msgid "Permissions" +msgstr "" + +#: front/src/components/audio/PlayButton.vue:9 src/components/library/Track.vue:30 +msgid "Play" +msgstr "" + +#: front/src/components/audio/album/Card.vue:50 +#: front/src/components/audio/artist/Card.vue:44 src/components/library/Album.vue:28 +#: front/src/views/playlists/Detail.vue:23 +msgid "Play all" +msgstr "" + +#: front/src/components/library/Artist.vue:26 +msgid "Play all albums" +msgstr "" + +#: front/src/components/audio/PlayButton.vue:58 +msgid "Play immediatly" +msgstr "" + +#: front/src/components/audio/PlayButton.vue:15 +msgid "Play next" +msgstr "" + +#: front/src/components/audio/PlayButton.vue:16 +msgid "Play now" +msgstr "" + +#: front/src/components/audio/Player.vue:261 +msgid "Play track" +msgstr "" + +#: front/src/views/playlists/Detail.vue:90 +msgid "Playlist" +msgstr "" + +#: front/src/views/playlists/Detail.vue:12 +msgid "Playlist containing %{ count } track, by %{ username }" +msgid_plural "Playlist containing %{ count } tracks, by %{ username }" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/playlists/Form.vue:9 +msgid "Playlist created" +msgstr "" + +#: front/src/components/playlists/Editor.vue:4 +msgid "Playlist editor" +msgstr "" + +#: front/src/components/playlists/Form.vue:21 +msgid "Playlist name" +msgstr "" + +#: front/src/components/playlists/Form.vue:6 +msgid "Playlist updated" +msgstr "" + +#: front/src/components/playlists/Form.vue:25 +msgid "Playlist visibility" +msgstr "" + +#: front/src/components/Sidebar.vue:56 src/components/library/Home.vue:16 +#: front/src/components/library/Library.vue:13 src/views/admin/Settings.vue:83 +#: front/src/views/playlists/List.vue:103 +msgid "Playlists" +msgstr "" + +#: front/src/components/Home.vue:56 +msgid "Playlists? We got them" +msgstr "" + +#: front/src/components/auth/Settings.vue:79 +msgid "Please double-check your password is correct" +msgstr "" + +#: front/src/components/auth/Login.vue:9 +msgid "Please double-check your username/password couple is correct" +msgstr "" + +#: front/src/components/auth/Settings.vue:46 +msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px." +msgstr "" + +#: front/src/components/library/import/Main.vue:26 +msgid "Previous step" +msgstr "" + +#: front/src/components/audio/Player.vue:260 +msgid "Previous track" +msgstr "" + +#: front/src/views/auth/EmailConfirm.vue:26 +#: front/src/views/auth/PasswordResetConfirm.vue:31 +msgid "Proceed to login" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:50 +msgid "Published date" +msgstr "" + +#: front/src/components/library/import/ArtistImport.vue:17 +msgid "Query template" +msgstr "" + +#: front/src/components/Sidebar.vue:20 +msgid "Queue" +msgstr "" + +#: front/src/components/audio/Player.vue:203 +msgid "Queue shuffled!" +msgstr "" + +#: front/src/views/radios/Detail.vue:80 +msgid "Radio" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:205 +msgid "Radio Builder" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:11 +msgid "Radio name" +msgstr "" + +#: front/src/components/library/Library.vue:10 src/components/library/Radios.vue:141 +msgid "Radios" +msgstr "" + +#: front/src/views/instance/Timeline.vue:7 +msgid "Recent activity on this instance" +msgstr "" + +#: front/src/components/library/Home.vue:24 +msgid "Recently added" +msgstr "" + +#: front/src/components/library/Home.vue:11 +msgid "Recently favorited" +msgstr "" + +#: front/src/components/library/Home.vue:6 +msgid "Recently listened" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:81 +msgid "Recording MusicBrainz ID" +msgstr "" + +#: front/src/views/admin/users/UsersDetail.vue:84 +#: front/src/views/federation/LibraryDetail.vue:122 +msgid "Refresh" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:42 +msgid "Refused" +msgstr "" + +#: front/src/components/auth/Profile.vue:12 +msgid "Registered since %{ date }" +msgstr "" + +#: front/src/components/auth/Signup.vue:9 +msgid "Registration are closed on this instance, you will need an invitation code to signup." +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:71 +msgid "regular user" +msgstr "" + +#: front/src/components/library/radios/Filter.vue:59 +msgid "Remove" +msgstr "" + +#: front/src/components/auth/Settings.vue:58 +msgid "Remove avatar" +msgstr "" + +#: front/src/components/favorites/TrackFavoriteIcon.vue:19 +msgid "Remove from favorites" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:34 +#: front/src/components/auth/SubsonicTokenForm.vue:37 +msgid "Request a new password" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:35 +msgid "Request a new Subsonic API password?" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:43 +msgid "Request a password" +msgstr "" + +#: front/src/App.vue:35 +msgid "Request music" +msgstr "" + +#: front/src/views/library/MusicRequest.vue:4 src/views/library/MusicRequest.vue:21 +msgid "Request some music" +msgstr "" + +#: front/src/components/requests/Form.vue:20 +msgid "Request submitted!" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:49 +msgid "Rerun errored jobs" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:187 +msgid "Rerun job" +msgstr "" + +#: front/src/components/auth/Login.vue:34 src/views/auth/PasswordReset.vue:4 +#: front/src/views/auth/PasswordReset.vue:52 +msgid "Reset your password" +msgstr "" + +#: front/src/components/library/import/TrackImport.vue:31 +msgid "Result %{ current }/%{ total }" +msgstr "" + +#: front/src/components/favorites/List.vue:38 src/components/library/Artists.vue:30 +#: front/src/components/library/Radios.vue:52 src/views/federation/LibraryList.vue:33 +#: front/src/views/playlists/List.vue:32 +msgid "Results per page" +msgstr "" + +#: front/src/components/admin/SettingsGroup.vue:63 +#: front/src/components/library/radios/Builder.vue:19 +msgid "Save" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:112 +msgid "Scan triggered!" +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:5 +#: front/src/components/library/Artists.vue:10 src/components/library/Radios.vue:29 +#: front/src/components/library/import/BatchDetail.vue:62 +#: front/src/components/library/import/BatchList.vue:7 +#: front/src/components/manage/library/FilesTable.vue:5 +#: front/src/components/manage/library/RequestsTable.vue:5 +#: front/src/components/manage/users/InvitationsTable.vue:5 +#: front/src/components/manage/users/UsersTable.vue:5 +#: front/src/views/federation/LibraryList.vue:14 src/views/playlists/List.vue:13 +msgid "Search" +msgstr "" + +#: front/src/components/library/import/Main.vue:85 +msgid "Search an entity you want to import:" +msgstr "" + +#: front/src/components/manage/library/RequestsTable.vue:180 +msgid "Search by artist, username, comment..." +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:188 +msgid "Search by source..." +msgstr "" + +#: front/src/components/library/import/BatchList.vue:116 +msgid "Search by submitter, source..." +msgstr "" + +#: front/src/components/federation/LibraryTrackTable.vue:182 +#: front/src/components/manage/library/FilesTable.vue:175 +msgid "Search by title, artist, domain..." +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:140 +msgid "Search by username, domain..." +msgstr "" + +#: front/src/components/manage/users/InvitationsTable.vue:152 +msgid "Search by username, email, code..." +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:162 +msgid "Search by username, email, name..." +msgstr "" + +#: front/src/components/audio/SearchBar.vue:20 +msgid "Search for artists, albums, tracks..." +msgstr "" + +#: front/src/components/audio/Search.vue:2 +msgid "Search for some music" +msgstr "" + +#: front/src/components/library/Track.vue:105 +msgid "Search on lyrics.wikia.com" +msgstr "" + +#: front/src/components/library/Album.vue:33 src/components/library/Artist.vue:31 +#: front/src/components/library/Track.vue:40 +msgid "Search on Wikipedia" +msgstr "" + +#: front/src/components/library/import/TrackImport.vue:42 +msgid "Search query" +msgstr "" + +#: front/src/views/admin/Settings.vue:15 +msgid "Sections" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:31 +msgid "Select a filter" +msgstr "" + +#: front/src/components/common/ActionTable.vue:61 +msgid "Select all %{ total } elements" +msgid_plural "Select all %{ total } elements" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/library/import/FileUpload.vue:22 +msgid "Select files to upload..." +msgstr "" + +#: front/src/components/common/ActionTable.vue:69 +msgid "Select only current page" +msgstr "" + +#: front/src/components/library/import/Main.vue:19 +msgid "Select relevant sources or files for import" +msgstr "" + +#: front/src/components/federation/LibraryCard.vue:43 +msgid "Send a follow request" +msgstr "" + +#: front/src/components/Sidebar.vue:97 src/components/manage/users/UsersTable.vue:184 +#: front/src/views/admin/users/UsersDetail.vue:165 +msgid "Settings" +msgstr "" + +#: front/src/components/auth/Settings.vue:10 +msgid "Settings updated" +msgstr "" + +#: front/src/components/admin/SettingsGroup.vue:11 +msgid "Settings updated successfully." +msgstr "" + +#: front/src/components/auth/Profile.vue:24 +msgid "Settings..." +msgstr "" + +#: front/src/components/manage/users/InvitationForm.vue:27 +msgid "Share link" +msgstr "" + +#: front/src/components/audio/artist/Card.vue:30 +msgid "Show 1 more album" +msgid_plural "Show %{ count } more albums" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/audio/album/Card.vue:40 +msgid "Show 1 more track" +msgid_plural "Show %{ count } more tracks" +msgstr[0] "" +msgstr[1] "" + +#: front/src/components/forms/PasswordInput.vue:25 +msgid "Show/hide password" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:97 +#: front/src/components/federation/LibraryTrackTable.vue:98 +#: front/src/components/library/import/BatchDetail.vue:128 +#: front/src/components/library/import/BatchList.vue:73 +#: front/src/components/manage/library/FilesTable.vue:97 +#: front/src/components/manage/library/RequestsTable.vue:104 +#: front/src/components/manage/users/InvitationsTable.vue:76 +#: front/src/components/manage/users/UsersTable.vue:87 +msgid "Showing results %{ start }-%{ end } on %{ total }" +msgstr "" + +#: front/src/components/audio/Player.vue:269 +msgid "Shuffle your queue" +msgstr "" + +#: front/src/components/auth/Signup.vue:95 +msgid "Sign Up" +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:40 +#: front/src/views/admin/users/UsersDetail.vue:37 +msgid "Sign-up" +msgstr "" + +#: front/src/components/audio/track/Table.vue:31 +msgid "Simply copy paste the snippet below into a terminal to launch the download." +msgstr "" + +#: front/src/components/library/Track.vue:69 +#: front/src/components/library/import/FileUpload.vue:44 +#: front/src/components/manage/library/FilesTable.vue:44 +msgid "Size" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:37 +#: front/src/components/library/import/BatchDetail.vue:72 +msgid "Skipped" +msgstr "" + +#: front/src/components/requests/Form.vue:3 +msgid "Something's missing in the library? Let us know what you would like to listen!" +msgstr "" + +#: front/src/components/audio/Search.vue:25 +msgid "Sorry, we did not found any album matching your query" +msgstr "" + +#: front/src/components/audio/Search.vue:16 +msgid "Sorry, we did not found any artist matching your query" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:82 +#: front/src/components/library/import/BatchList.vue:38 +#: front/src/components/library/import/TrackImport.vue:17 +msgid "Source" +msgstr "" + +#: front/src/App.vue:41 +msgid "Source code" +msgstr "" + +#: front/src/App.vue:40 +msgid "Source code (%{version})" +msgstr "" + +#: front/src/components/auth/Profile.vue:20 +#: front/src/components/manage/users/UsersTable.vue:70 +msgid "Staff member" +msgstr "" + +#: front/src/components/radios/Button.vue:4 +msgid "Start" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:28 +msgid "Start Upload" +msgstr "" + +#: front/src/views/admin/Settings.vue:86 +msgid "Statistics" +msgstr "" + +#: front/src/components/federation/LibraryFollowTable.vue:23 +#: front/src/components/federation/LibraryTrackTable.vue:46 +#: front/src/components/library/import/BatchDetail.vue:66 +#: front/src/components/library/import/BatchDetail.vue:83 +#: front/src/components/library/import/BatchList.vue:11 +#: front/src/components/library/import/BatchList.vue:37 +#: front/src/components/library/import/FileUpload.vue:45 +#: front/src/components/manage/library/RequestsTable.vue:24 +#: front/src/components/manage/library/RequestsTable.vue:48 +#: front/src/components/manage/users/InvitationsTable.vue:17 +#: front/src/components/manage/users/InvitationsTable.vue:39 +#: front/src/components/manage/users/UsersTable.vue:43 +msgid "Status" +msgstr "" + +#: front/src/components/radios/Button.vue:3 +msgid "Stop" +msgstr "" + +#: front/src/components/Sidebar.vue:159 +msgid "Stop radio" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:32 +msgid "Stop Upload" +msgstr "" + +#: front/src/App.vue:9 src/components/requests/Form.vue:17 +msgid "Submit" +msgstr "" + +#: front/src/components/requests/Form.vue:22 +msgid "Submit another request" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:26 +#: front/src/components/library/import/BatchList.vue:39 +msgid "Submitted by" +msgstr "" + +#: front/src/views/admin/Settings.vue:85 +msgid "Subsonic" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:2 +msgid "Subsonic API password" +msgstr "" + +#: front/src/components/library/import/BatchDetail.vue:71 +#: front/src/components/library/import/BatchList.vue:16 +#: front/src/components/library/import/FileUpload.vue:56 +msgid "Success" +msgstr "" + +#: front/src/App.vue:11 +msgid "Suggested choices" +msgstr "" + +#: front/src/components/playlists/Editor.vue:9 +msgid "Syncing changes to server..." +msgstr "" + +#: front/src/components/Home.vue:26 +msgid "That's simple: we loved Grooveshark and we want to build something even better." +msgstr "" + +#: front/src/components/requests/Form.vue:73 +msgid "The Beatles, Mickael Jackson…" +msgstr "" + +#: front/src/App.vue:59 +msgid "The funkwhale logo was kindly designed and provided by Francis Gading." +msgstr "" + +#: front/src/components/Home.vue:124 +msgid "The plaform is free and open-source, you can install it and modify it without worries" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:4 +msgid "The Subsonic API is not available on this Funkwhale instance." +msgstr "" + +#: front/src/components/requests/Form.vue:74 +msgid "The White Album, Thriller…" +msgstr "" + +#: front/src/components/audio/track/Table.vue:30 +msgid "There is currently no way to download directly multiple tracks from funkwhale as a ZIP archive. However, you can use a command line tools such as cURL to easily download a list of tracks." +msgstr "" + +#: front/src/components/library/import/Main.vue:149 +msgid "This import will be associated with the music request below. After the import is finished, the request will be marked as fulfilled." +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:195 +msgid "This indicate if the remote library granted you access" +msgstr "" + +#: front/src/components/auth/Profile.vue:16 +msgid "This is you!" +msgstr "" + +#: front/src/components/common/ActionTable.vue:37 +msgid "This may affect a lot of elements, please double check this is really what you want." +msgstr "" + +#: front/src/components/audio/PlayButton.vue:61 +msgid "This track is not imported and cannot be played" +msgstr "" + +#: front/src/views/playlists/Detail.vue:37 +msgid "This will completely delete this playlist and cannot be undone." +msgstr "" + +#: front/src/views/radios/Detail.vue:27 +msgid "This will completely delete this radio and cannot be undone." +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:51 +msgid "This will completely disable access to the Subsonic API using from account." +msgstr "" + +#: front/src/App.vue:133 +msgid "This will erase your local data and disconnect you, do you want to continue?" +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:36 +msgid "This will log you out from existing devices that use the current password." +msgstr "" + +#: front/src/components/playlists/Editor.vue:44 +msgid "This will remove all tracks from this playlist and cannot be undone." +msgstr "" + +#: front/src/components/audio/track/Table.vue:6 +#: front/src/components/federation/LibraryTrackTable.vue:47 +#: front/src/components/manage/library/FilesTable.vue:37 +msgid "Title" +msgstr "" + +#: front/src/components/audio/SearchBar.vue:27 src/components/library/Track.vue:174 +#: front/src/components/library/import/BatchDetail.vue:84 +#: front/src/components/metadata/Search.vue:138 +msgid "Track" +msgstr "" + +#: front/src/components/library/Track.vue:53 +msgid "Track information" +msgstr "" + +#: front/src/components/library/radios/Filter.vue:44 +msgid "Track matching filter" +msgstr "" + +#: front/src/components/instance/Stats.vue:54 +msgid "tracks" +msgstr "" + +#: front/src/components/library/Album.vue:43 +#: front/src/components/playlists/PlaylistModal.vue:33 +#: front/src/views/federation/Base.vue:8 src/views/playlists/Detail.vue:50 +#: front/src/views/radios/Detail.vue:34 +msgid "Tracks" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:125 +msgid "Tracks available in this library" +msgstr "" + +#: front/src/components/library/Artist.vue:54 +msgid "Tracks by this artist" +msgstr "" + +#: front/src/components/instance/Stats.vue:25 +msgid "Tracks favorited" +msgstr "" + +#: front/src/components/instance/Stats.vue:19 +msgid "tracks listened" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:109 +msgid "Trigger scan" +msgstr "" + +#: front/src/components/manage/library/FilesTable.vue:41 +msgid "Type" +msgstr "" + +#: front/src/components/About.vue:15 +msgid "Unfortunately, owners of this instance did not yet take the time to complete this page." +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:95 +msgid "Unknown" +msgstr "" + +#: front/src/components/Home.vue:37 +msgid "Unlimited music" +msgstr "" + +#: front/src/components/audio/Player.vue:264 +msgid "Unmute" +msgstr "" + +#: front/src/components/auth/Settings.vue:50 +msgid "Update avatar" +msgstr "" + +#: front/src/components/playlists/Form.vue:33 +msgid "Update playlist" +msgstr "" + +#: front/src/components/auth/Settings.vue:27 +msgid "Update settings" +msgstr "" + +#: front/src/views/auth/PasswordResetConfirm.vue:21 +msgid "Update your password" +msgstr "" + +#: front/src/components/manage/users/UsersTable.vue:172 +#: front/src/views/admin/users/UsersDetail.vue:153 +msgid "Upload" +msgstr "" + +#: front/src/components/auth/Settings.vue:45 +msgid "Upload a new avatar" +msgstr "" + +#: front/src/components/library/import/Main.vue:7 +msgid "Uploaded files or external source" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:57 +msgid "Uploading..." +msgstr "" + +#: front/src/App.vue:45 +msgid "Use another instance" +msgstr "" + +#: front/src/components/requests/Form.vue:75 +msgid "Use this comment box to add details to your request if needed" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:196 +msgid "Use this flag to enable/disable federation with this library" +msgstr "" + +#: front/src/views/auth/PasswordReset.vue:12 +msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password." +msgstr "" + +#: front/src/components/federation/LibraryForm.vue:6 +msgid "Use this form to scan an instance and setup federation." +msgstr "" + +#: front/src/components/manage/users/InvitationsTable.vue:49 +msgid "Used" +msgstr "" + +#: front/src/components/manage/library/RequestsTable.vue:47 +msgid "User" +msgstr "" + +#: front/src/components/instance/Stats.vue:5 +msgid "User activity" +msgstr "" + +#: front/src/components/library/Radios.vue:20 +msgid "User radios" +msgstr "" + +#: front/src/components/auth/Signup.vue:19 +#: front/src/components/manage/users/UsersTable.vue:37 +msgid "Username" +msgstr "" + +#: front/src/components/auth/Login.vue:15 +msgid "Username or email" +msgstr "" + +#: front/src/components/instance/Stats.vue:13 +msgid "users" +msgstr "" + +#: front/src/components/Sidebar.vue:103 src/views/admin/Settings.vue:81 +#: front/src/views/admin/users/Base.vue:5 src/views/admin/users/UsersList.vue:3 +#: front/src/views/admin/users/UsersList.vue:21 +msgid "Users" +msgstr "" + +#: front/src/components/library/Album.vue:37 src/components/library/Artist.vue:35 +#: front/src/components/library/Track.vue:44 +#: front/src/components/library/import/ArtistImport.vue:131 +#: front/src/components/metadata/ArtistCard.vue:49 +#: front/src/components/metadata/ReleaseCard.vue:53 +msgid "View on MusicBrainz" +msgstr "" + +#: front/src/components/playlists/PlaylistModal.vue:20 +msgid "We cannot add the track to a playlist" +msgstr "" + +#: front/src/components/playlists/Form.vue:14 +msgid "We cannot create the playlist" +msgstr "" + +#: front/src/components/auth/Signup.vue:13 +msgid "We cannot create your account" +msgstr "" + +#: front/src/components/auth/Login.vue:7 +msgid "We cannot log you in" +msgstr "" + +#: front/src/components/auth/Settings.vue:38 +msgid "We cannot save your avatar" +msgstr "" + +#: front/src/components/auth/Settings.vue:14 +msgid "We cannot save your settings" +msgstr "" + +#: front/src/components/Home.vue:130 +msgid "We do not track you or bother you with ads" +msgstr "" + +#: front/src/components/library/import/FileUpload.vue:5 +msgid "We recommend using Picard for that purpose." +msgstr "" + +#: front/src/components/Home.vue:7 +msgid "We think listening to music should be simple." +msgstr "" + +#: front/src/components/PageNotFound.vue:10 +msgid "We're sorry, the page you asked for does not exist:" +msgstr "" + +#: front/src/components/requests/Form.vue:21 +msgid "We've received your request, you'll get some groove soon ;)" +msgstr "" + +#: front/src/components/Home.vue:152 +msgid "Welcome" +msgstr "" + +#: front/src/components/Home.vue:5 +msgid "Welcome on Funkwhale" +msgstr "" + +#: front/src/components/library/import/Main.vue:114 +msgid "What is metadata?" +msgstr "" + +#: front/src/views/federation/LibraryDetail.vue:197 +msgid "When enabled, auto importing will automatically import new tracks published in this library" +msgstr "" + +#: front/src/components/Home.vue:24 +msgid "Why funkwhale?" +msgstr "" + +#: front/src/components/Sidebar.vue:124 +msgid "Yes" +msgstr "" + +#: front/src/components/auth/Logout.vue:8 +msgid "Yes, log me out!" +msgstr "" + +#: front/src/components/auth/Logout.vue:7 +msgid "You are currently logged in as %{ username }" +msgstr "" + +#: front/src/components/library/import/Main.vue:111 +msgid "You can also skip this step and enter metadata manually." +msgstr "" + +#: front/src/components/Home.vue:136 +msgid "You can invite friends and family to your instance so they can enjoy your music" +msgstr "" + +#: front/src/components/library/radios/Builder.vue:7 +msgid "You can use this interface to build your own custom radio, which will play tracks according to your criteria." +msgstr "" + +#: front/src/components/auth/SubsonicTokenForm.vue:8 +msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance." +msgstr "" + +#: front/src/components/Sidebar.vue:156 +msgid "You have a radio playing" +msgstr "" + +#: front/src/App.vue:6 +msgid "You need to select an instance in order to continue" +msgstr "" + +#: front/src/components/auth/Settings.vue:100 +msgid "You will be logged out from this session and have to log in with the new one" +msgstr "" + +#: front/src/components/auth/Settings.vue:71 +msgid "You will have to update your password on your clients that use this password." +msgstr "" + +#: front/src/components/library/import/Main.vue:103 +msgid "You will import:" +msgstr "" + +#: front/src/views/auth/EmailConfirm.vue:24 +msgid "Your email address was confirmed, you can now use the service without limitations." +msgstr "" + +#: front/src/components/favorites/List.vue:109 +msgid "Your Favorites" +msgstr "" + +#: front/src/components/Home.vue:117 +msgid "Your music, your way" +msgstr "" + +#: front/src/views/auth/PasswordResetConfirm.vue:29 +msgid "Your password has been updated successfully." +msgstr "" + +#: front/src/components/auth/Settings.vue:101 +msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password" +msgstr "" + +#: front/src/components/audio/PlayButton.vue:156 +msgid "%{ count } track was added to your queue" +msgid_plural "%{ count } tracks were added to your queue" +msgstr[0] "" +msgstr[1] "" diff --git a/front/package.json b/front/package.json index 3dec9c257..9837479ba 100644 --- a/front/package.json +++ b/front/package.json @@ -5,11 +5,11 @@ "author": "Eliot Berriot ", "private": true, "scripts": { - "dev": "node build/dev-server.js", - "start": "node build/dev-server.js", + "dev": "scripts/i18n-compile.sh && node build/dev-server.js", + "start": "scripts/i18n-compile.sh && node build/dev-server.js", "build": "node build/build.js", - "i18n-extract": "find src/ -name '*.vue' | xargs vendor/vue-i18n-xgettext/index.js > ../po/en.po", - "i18n-compile": "node build/i18n.js", + "i18n-extract": "scripts/i18n-extract.sh", + "i18n-compile": "scripts/i18n-compile.sh", "unit": "cross-env BABEL_ENV=test karma start test/unit/karma.conf.js --single-run", "unit-watch": "cross-env BABEL_ENV=test karma start test/unit/karma.conf.js", "e2e": "node test/e2e/runner.js", @@ -21,9 +21,6 @@ "axios": "^0.17.1", "dateformat": "^2.0.0", "django-channels": "^1.1.6", - "i18next": "^11.1.1", - "i18next-conv": "^6.0.0", - "i18next-fetch-backend": "^0.1.0", "js-logger": "^1.3.0", "jwt-decode": "^2.2.0", "lodash": "^4.17.4", @@ -34,6 +31,7 @@ "semantic-ui-css": "^2.2.10", "showdown": "^1.8.6", "vue": "^2.5.16", + "vue-gettext": "^2.0.31", "vue-lazyload": "^1.1.4", "vue-masonry": "^0.10.16", "vue-router": "^2.3.1", @@ -61,6 +59,7 @@ "cross-env": "^4.0.0", "cross-spawn": "^5.0.1", "css-loader": "^0.28.0", + "easygettext": "^2.5.0", "es6-promise": "^4.2.2", "eslint": "^3.19.0", "eslint-config-standard": "^6.2.1", @@ -104,7 +103,6 @@ "sinon-chai": "^2.8.0", "sinon-stub-promise": "^4.0.0", "url-loader": "^0.5.8", - "vue-i18n-xgettext": "^0.0.4", "vue-loader": "^12.1.0", "vue-style-loader": "^3.0.1", "vue-template-compiler": "^2.3.3", diff --git a/front/scripts/i18n-compile.sh b/front/scripts/i18n-compile.sh new file mode 100755 index 000000000..211f8ee8c --- /dev/null +++ b/front/scripts/i18n-compile.sh @@ -0,0 +1,3 @@ +#!/bin/bash -eux +locales=$(tail -n +2 src/locales.js | sed -e 's/export default //' | jq '.locales[].code' | xargs echo) +find locales -name '*.po' | xargs $(yarn bin gettext-extract)/gettext-compile --output src/translations.json diff --git a/front/scripts/i18n-extract.sh b/front/scripts/i18n-extract.sh new file mode 100755 index 000000000..149d3262d --- /dev/null +++ b/front/scripts/i18n-extract.sh @@ -0,0 +1,29 @@ +#!/bin/bash -eux +locales=$(tail -n +2 src/locales.js | sed -e 's/export default //' | jq '.locales[].code' | xargs echo) +locales_dir="locales" +sources=$(find src -name '*.vue' -o -name '*.html' 2> /dev/null) +js_sources=$(find src -name '*.vue' -o -name '*.js') +touch $locales_dir/app.pot + +# Create a main .pot template, then generate .po files for each available language. +# Extract gettext strings from templates files and create a POT dictionary template. +$(yarn bin gettext-extract)/gettext-extract --attribute v-translate --quiet --output $locales_dir/app.pot $sources +xgettext --language=JavaScript --keyword=npgettext:1c,2,3 \ + --from-code=utf-8 --join-existing --no-wrap \ + --package-name=$(node -e "console.log(require('./package.json').name);") \ + --package-version=$(node -e "console.log(require('./package.json').version);") \ + --output $locales_dir/app.pot $js_sources \ + --no-wrap + +# Fix broken files path/lines in pot +sed -e 's|#: src/|#: front/src/|' -i $locales_dir/app.pot + +# Generate .po files for each available language. +echo $locales +for lang in $locales; do \ + po_file=$locales_dir/$lang/LC_MESSAGES/app.po; \ + echo "msgmerge --update $po_file "; \ + mkdir -p $(dirname $po_file); \ + [ -f $po_file ] && msgmerge --lang=$lang --update $po_file $locales_dir/app.pot --no-wrap || msginit --no-wrap --no-translator --locale=$lang --input=$locales_dir/app.pot --output-file=$po_file; \ + msgattrib --no-wrap --no-obsolete -o $po_file $po_file; \ +done; diff --git a/front/scripts/i18n-weblate-to-origin.sh b/front/scripts/i18n-weblate-to-origin.sh new file mode 100755 index 000000000..6150ff569 --- /dev/null +++ b/front/scripts/i18n-weblate-to-origin.sh @@ -0,0 +1,12 @@ +#!/bin/bash -eux +integration_branch="translations-integration" +git remote add weblate https://translate.funkwhale.audio/git/funkwhale/front/ || echo "remote already exists" +git fetch weblate +git checkout weblate/develop +git reset --hard weblate/develop +git checkout -b $integration_branch || git checkout $integration_branch +git reset --hard weblate/develop +git push -f origin $integration_branch + +echo "Branch created on pushed on origin/$integration_branch" +echo "Open a merge request by visiting https://code.eliotberriot.com/funkwhale/funkwhale/merge_requests/new?merge_request%5Bsource_branch%5D=$integration_branch" diff --git a/front/src/App.vue b/front/src/App.vue index 56dbe0aad..58ed698aa 100644 --- a/front/src/App.vue +++ b/front/src/App.vue @@ -2,14 +2,14 @@
-

{{ $t('Choose your instance') }}

+

Choose your instance

-

{{ $t('You need to select an instance in order to continue') }}

+

You need to select an instance in order to continue

- +
-

{{ $t('Suggested choices') }}

+

Suggested choices